From fcffa862abdb036945472949dddbd7b14241e8f9 Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Sat, 28 Feb 2026 12:00:00 -0700 Subject: [PATCH] February 28th, 2026 Patch --- README.md | 4 +- cereal/custom.capnp | 9 +- common/params.cc | 1 + common/params_pyx.pyx | 10 + frogpilot/assets/theme_manager.py | 9 +- frogpilot/common/frogpilot_functions.py | 49 +- frogpilot/common/frogpilot_utilities.py | 61 +- frogpilot/common/frogpilot_variables.py | 555 ++-- frogpilot/controls/frogpilot_card.py | 3 +- frogpilot/controls/lib/frogpilot_events.py | 2 +- frogpilot/controls/lib/weather_checker.py | 59 +- frogpilot/frogpilot_process.py | 3 +- frogpilot/system/environment_variables | Bin 460728 -> 0 bytes frogpilot/system/frogpilot_stats.py | 132 +- frogpilot/system/frogpilot_tracking.py | 2 +- .../assets/images/android-chrome-192x192.png | Bin 12386 -> 59532 bytes .../assets/images/android-chrome-512x512.png | Bin 39968 -> 353626 bytes .../assets/images/apple-touch-icon.png | Bin 11165 -> 53067 bytes .../the_pond/assets/images/favicon-16x16.png | Bin 680 -> 980 bytes .../the_pond/assets/images/favicon-32x32.png | Bin 1448 -> 2912 bytes .../system/the_pond/assets/images/favicon.ico | Bin 15406 -> 15406 bytes .../the_pond/assets/images/main_logo.png | Bin 1032529 -> 1115260 bytes frogpilot/system/the_pond/the_pond.py | 66 +- .../third_party/influxdb_client/__init__.py | 396 --- .../influxdb_client/_async/__init__.py | 1 - .../influxdb_client/_async/api_client.py | 663 ---- .../influxdb_client/_async/rest.py | 309 -- .../influxdb_client/_sync/__init__.py | 1 - .../influxdb_client/_sync/api_client.py | 663 ---- .../third_party/influxdb_client/_sync/rest.py | 355 -- .../influxdb_client/client/__init__.py | 56 - .../influxdb_client/client/_base.py | 556 ---- .../influxdb_client/client/_pages.py | 66 - .../client/authorizations_api.py | 136 - .../influxdb_client/client/bucket_api.py | 132 - .../influxdb_client/client/delete_api.py | 35 - .../client/delete_api_async.py | 37 - .../influxdb_client/client/exceptions.py | 47 - .../influxdb_client/client/flux_csv_parser.py | 408 --- .../influxdb_client/client/flux_table.py | 290 -- .../influxdb_client/client/influxdb_client.py | 438 --- .../client/influxdb_client_async.py | 301 -- .../client/invokable_scripts_api.py | 293 -- .../influxdb_client/client/labels_api.py | 96 - .../influxdb_client/client/logging_handler.py | 64 - .../client/organizations_api.py | 60 - .../influxdb_client/client/query_api.py | 310 -- .../influxdb_client/client/query_api_async.py | 236 -- .../influxdb_client/client/tasks_api.py | 226 -- .../influxdb_client/client/users_api.py | 80 - .../influxdb_client/client/util/__init__.py | 1 - .../influxdb_client/client/util/date_utils.py | 101 - .../client/util/date_utils_pandas.py | 15 - .../influxdb_client/client/util/helpers.py | 50 - .../client/util/multiprocessing_helper.py | 205 -- .../influxdb_client/client/warnings.py | 52 - .../influxdb_client/client/write/__init__.py | 56 - .../client/write/dataframe_serializer.py | 290 -- .../influxdb_client/client/write/point.py | 371 --- .../influxdb_client/client/write/retry.py | 148 - .../influxdb_client/client/write_api.py | 587 ---- .../influxdb_client/client/write_api_async.py | 134 - .../influxdb_client/configuration.py | 283 -- .../influxdb_client/domain/__init__.py | 335 -- .../add_resource_member_request_body.py | 139 - .../domain/analyze_query_response.py | 107 - .../domain/analyze_query_response_errors.py | 176 - .../domain/array_expression.py | 142 - .../influxdb_client/domain/ast_response.py | 107 - .../influxdb_client/domain/authorization.py | 354 -- .../domain/authorization_post_request.py | 173 - .../domain/authorization_update_request.py | 138 - .../influxdb_client/domain/authorizations.py | 130 - .../influxdb_client/domain/axes.py | 132 - .../influxdb_client/domain/axis.py | 242 -- .../influxdb_client/domain/axis_scale.py | 88 - .../influxdb_client/domain/bad_statement.py | 142 - .../domain/band_view_properties.py | 771 ----- .../domain/binary_expression.py | 184 -- .../influxdb_client/domain/block.py | 142 - .../influxdb_client/domain/boolean_literal.py | 138 - .../influxdb_client/domain/bucket.py | 366 --- .../influxdb_client/domain/bucket_links.py | 246 -- .../domain/bucket_metadata_manifest.py | 251 -- .../domain/bucket_retention_rules.py | 164 - .../domain/bucket_shard_mapping.py | 132 - .../influxdb_client/domain/buckets.py | 130 - .../domain/builder_aggregate_function_type.py | 88 - .../influxdb_client/domain/builder_config.py | 176 - .../domain/builder_config_aggregate_window.py | 130 - .../domain/builder_functions_type.py | 107 - .../domain/builder_tags_type.py | 153 - .../domain/builtin_statement.py | 138 - .../influxdb_client/domain/call_expression.py | 165 - .../influxdb_client/domain/cell.py | 249 -- .../influxdb_client/domain/cell_links.py | 130 - .../influxdb_client/domain/cell_update.py | 176 - .../domain/cell_with_view_properties.py | 148 - .../influxdb_client/domain/check.py | 120 - .../influxdb_client/domain/check_base.py | 452 --- .../domain/check_base_links.py | 219 -- .../domain/check_discriminator.py | 116 - .../influxdb_client/domain/check_patch.py | 153 - .../domain/check_status_level.py | 91 - .../domain/check_view_properties.py | 350 -- .../influxdb_client/domain/checks.py | 130 - .../domain/column_data_type.py | 91 - .../domain/column_semantic_type.py | 89 - .../domain/conditional_expression.py | 184 -- .../influxdb_client/domain/config.py | 107 - .../domain/constant_variable_properties.py | 134 - .../influxdb_client/domain/create_cell.py | 226 -- .../domain/create_dashboard_request.py | 167 - .../influxdb_client/domain/custom_check.py | 142 - .../influxdb_client/domain/dashboard.py | 209 -- .../influxdb_client/domain/dashboard_color.py | 228 -- .../influxdb_client/domain/dashboard_query.py | 180 -- .../domain/dashboard_with_view_properties.py | 209 -- .../influxdb_client/domain/dashboards.py | 130 - .../domain/date_time_literal.py | 138 - .../influxdb_client/domain/dbr_ps.py | 107 - .../influxdb_client/domain/dbrp.py | 302 -- .../influxdb_client/domain/dbrp_create.py | 249 -- .../influxdb_client/domain/dbrp_get.py | 107 - .../influxdb_client/domain/dbrp_update.py | 138 - .../influxdb_client/domain/deadman_check.py | 354 -- .../influxdb_client/domain/decimal_places.py | 138 - .../domain/delete_predicate_request.py | 167 - .../influxdb_client/domain/dialect.py | 234 -- .../influxdb_client/domain/dict_expression.py | 142 - .../influxdb_client/domain/dict_item.py | 157 - .../influxdb_client/domain/duration.py | 157 - .../domain/duration_literal.py | 142 - .../influxdb_client/domain/error.py | 193 -- .../influxdb_client/domain/expression.py | 86 - .../domain/expression_statement.py | 138 - .../influxdb_client/domain/field.py | 192 -- .../influxdb_client/domain/file.py | 215 -- .../influxdb_client/domain/float_literal.py | 138 - .../influxdb_client/domain/flux_response.py | 107 - .../influxdb_client/domain/flux_suggestion.py | 130 - .../domain/flux_suggestions.py | 107 - .../domain/function_expression.py | 165 - .../domain/gauge_view_properties.py | 360 --- .../domain/greater_threshold.py | 140 - .../influxdb_client/domain/health_check.py | 224 -- .../domain/heatmap_view_properties.py | 826 ----- .../domain/histogram_view_properties.py | 476 --- .../domain/http_notification_endpoint.py | 301 -- .../domain/http_notification_rule.py | 136 - .../domain/http_notification_rule_base.py | 181 -- .../influxdb_client/domain/identifier.py | 138 - .../domain/import_declaration.py | 157 - .../domain/index_expression.py | 161 - .../influxdb_client/domain/integer_literal.py | 138 - .../influxdb_client/domain/is_onboarding.py | 111 - .../influxdb_client/domain/label.py | 180 -- .../domain/label_create_request.py | 159 - .../influxdb_client/domain/label_mapping.py | 112 - .../influxdb_client/domain/label_response.py | 130 - .../influxdb_client/domain/label_update.py | 130 - .../influxdb_client/domain/labels_response.py | 130 - .../domain/language_request.py | 112 - .../legacy_authorization_post_request.py | 200 -- .../domain/lesser_threshold.py | 140 - .../line_plus_single_stat_properties.py | 797 ----- .../domain/line_protocol_error.py | 220 -- .../domain/line_protocol_length_error.py | 140 - .../influxdb_client/domain/links.py | 166 - .../domain/list_stacks_response.py | 107 - .../influxdb_client/domain/log_event.py | 165 - .../domain/logical_expression.py | 184 -- .../influxdb_client/domain/logs.py | 107 - .../domain/map_variable_properties.py | 134 - .../domain/markdown_view_properties.py | 160 - .../domain/measurement_schema.py | 262 -- .../domain/measurement_schema_column.py | 155 - .../measurement_schema_create_request.py | 140 - .../domain/measurement_schema_list.py | 108 - .../measurement_schema_update_request.py | 112 - .../domain/member_assignment.py | 161 - .../domain/member_expression.py | 161 - .../influxdb_client/domain/metadata_backup.py | 156 - .../influxdb_client/domain/model_property.py | 157 - .../domain/mosaic_view_properties.py | 780 ----- .../influxdb_client/domain/node.py | 82 - .../domain/notification_endpoint.py | 121 - .../domain/notification_endpoint_base.py | 347 -- .../notification_endpoint_base_links.py | 192 -- .../notification_endpoint_discriminator.py | 108 - .../domain/notification_endpoint_type.py | 90 - .../domain/notification_endpoint_update.py | 153 - .../domain/notification_endpoints.py | 130 - .../domain/notification_rule.py | 126 - .../domain/notification_rule_base.py | 666 ---- .../domain/notification_rule_base_links.py | 219 -- .../domain/notification_rule_discriminator.py | 132 - .../domain/notification_rule_update.py | 153 - .../domain/notification_rules.py | 130 - .../domain/object_expression.py | 142 - .../domain/onboarding_request.py | 256 -- .../domain/onboarding_response.py | 176 - .../domain/option_statement.py | 138 - .../influxdb_client/domain/organization.py | 277 -- .../domain/organization_links.py | 300 -- .../influxdb_client/domain/organizations.py | 130 - .../influxdb_client/domain/package.py | 192 -- .../influxdb_client/domain/package_clause.py | 134 - .../pager_duty_notification_endpoint.py | 157 - .../domain/pager_duty_notification_rule.py | 136 - .../pager_duty_notification_rule_base.py | 182 -- .../domain/paren_expression.py | 138 - .../domain/password_reset_body.py | 108 - .../domain/patch_bucket_request.py | 165 - .../domain/patch_dashboard_request.py | 161 - .../domain/patch_organization_request.py | 138 - .../domain/patch_retention_rule.py | 164 - .../domain/patch_stack_request.py | 173 - ...atch_stack_request_additional_resources.py | 155 - .../influxdb_client/domain/permission.py | 132 - .../domain/permission_resource.py | 220 -- .../influxdb_client/domain/pipe_expression.py | 161 - .../influxdb_client/domain/pipe_literal.py | 115 - .../domain/post_bucket_request.py | 244 -- .../influxdb_client/domain/post_check.py | 120 - .../domain/post_notification_endpoint.py | 121 - .../domain/post_notification_rule.py | 126 - .../domain/post_organization_request.py | 139 - .../domain/post_restore_kv_response.py | 111 - .../domain/post_stack_request.py | 176 - .../influxdb_client/domain/property_key.py | 86 - .../influxdb_client/domain/query.py | 239 -- .../influxdb_client/domain/query_edit_mode.py | 88 - .../domain/query_variable_properties.py | 134 - .../query_variable_properties_values.py | 130 - .../influxdb_client/domain/range_threshold.py | 188 -- .../influxdb_client/domain/ready.py | 153 - .../influxdb_client/domain/regexp_literal.py | 138 - .../domain/remote_connection.py | 250 -- .../remote_connection_creation_request.py | 250 -- .../remote_connection_update_request.py | 222 -- .../domain/remote_connections.py | 107 - .../influxdb_client/domain/renamable_field.py | 165 - .../influxdb_client/domain/replication.py | 412 --- .../domain/replication_creation_request.py | 324 -- .../domain/replication_update_request.py | 272 -- .../influxdb_client/domain/replications.py | 107 - .../influxdb_client/domain/resource_member.py | 119 - .../domain/resource_members.py | 130 - .../domain/resource_members_links.py | 107 - .../influxdb_client/domain/resource_owner.py | 119 - .../influxdb_client/domain/resource_owners.py | 130 - .../domain/restored_bucket_mappings.py | 160 - .../domain/retention_policy_manifest.py | 228 -- .../domain/return_statement.py | 138 - .../influxdb_client/domain/routes.py | 498 --- .../influxdb_client/domain/routes_external.py | 107 - .../influxdb_client/domain/routes_query.py | 176 - .../influxdb_client/domain/routes_system.py | 153 - .../domain/rule_status_level.py | 92 - .../third_party/influxdb_client/domain/run.py | 338 -- .../influxdb_client/domain/run_links.py | 153 - .../influxdb_client/domain/run_manually.py | 110 - .../influxdb_client/domain/runs.py | 130 - .../domain/scatter_view_properties.py | 850 ----- .../influxdb_client/domain/schema_type.py | 88 - .../domain/scraper_target_request.py | 246 -- .../domain/scraper_target_response.py | 200 -- .../domain/scraper_target_responses.py | 107 - .../influxdb_client/domain/script.py | 302 -- .../domain/script_create_request.py | 192 -- .../domain/script_invocation_params.py | 111 - .../influxdb_client/domain/script_language.py | 89 - .../domain/script_update_request.py | 138 - .../influxdb_client/domain/scripts.py | 107 - .../influxdb_client/domain/secret_keys.py | 107 - .../domain/secret_keys_response.py | 113 - .../domain/shard_group_manifest.py | 226 -- .../influxdb_client/domain/shard_manifest.py | 132 - .../influxdb_client/domain/shard_owner.py | 112 - .../domain/simple_table_view_properties.py | 236 -- .../domain/single_stat_view_properties.py | 383 --- .../domain/slack_notification_endpoint.py | 164 - .../domain/slack_notification_rule.py | 138 - .../domain/slack_notification_rule_base.py | 205 -- .../domain/smtp_notification_rule.py | 140 - .../domain/smtp_notification_rule_base.py | 229 -- .../influxdb_client/domain/source.py | 459 --- .../influxdb_client/domain/source_links.py | 176 - .../influxdb_client/domain/sources.py | 130 - .../influxdb_client/domain/stack.py | 176 - .../domain/stack_associations.py | 130 - .../influxdb_client/domain/stack_events.py | 245 -- .../influxdb_client/domain/stack_links.py | 107 - .../influxdb_client/domain/stack_resources.py | 222 -- .../influxdb_client/domain/statement.py | 82 - .../influxdb_client/domain/static_legend.py | 245 -- .../influxdb_client/domain/status_rule.py | 176 - .../influxdb_client/domain/string_literal.py | 138 - .../domain/subscription_manifest.py | 156 - .../domain/table_view_properties.py | 344 -- .../table_view_properties_table_options.py | 188 -- .../influxdb_client/domain/tag_rule.py | 153 - .../influxdb_client/domain/task.py | 569 ---- .../domain/task_create_request.py | 216 -- .../influxdb_client/domain/task_links.py | 246 -- .../domain/task_status_type.py | 88 - .../domain/task_update_request.py | 269 -- .../influxdb_client/domain/tasks.py | 130 - .../influxdb_client/domain/telegraf.py | 167 - .../influxdb_client/domain/telegraf_plugin.py | 176 - .../domain/telegraf_plugin_request.py | 222 -- .../domain/telegraf_plugin_request_plugins.py | 199 -- .../domain/telegraf_plugins.py | 153 - .../domain/telegraf_request.py | 199 -- .../domain/telegraf_request_metadata.py | 107 - .../influxdb_client/domain/telegrafs.py | 107 - .../domain/telegram_notification_endpoint.py | 166 - .../domain/telegram_notification_rule.py | 140 - .../domain/telegram_notification_rule_base.py | 244 -- .../influxdb_client/domain/template_apply.py | 323 -- .../domain/template_apply_remotes.py | 131 - .../domain/template_apply_template.py | 153 - .../influxdb_client/domain/template_chart.py | 199 -- .../domain/template_export_by_id.py | 153 - .../domain/template_export_by_id_org_ids.py | 130 - .../template_export_by_id_resource_filters.py | 130 - .../domain/template_export_by_id_resources.py | 159 - .../domain/template_export_by_name.py | 153 - .../template_export_by_name_resources.py | 132 - .../influxdb_client/domain/template_kind.py | 100 - .../domain/template_summary.py | 199 -- .../domain/template_summary_diff.py | 314 -- .../domain/template_summary_diff_buckets.py | 222 -- .../template_summary_diff_buckets_new_old.py | 157 - .../domain/template_summary_diff_checks.py | 222 -- .../template_summary_diff_dashboards.py | 222 -- ...emplate_summary_diff_dashboards_new_old.py | 153 - .../template_summary_diff_label_mappings.py | 268 -- .../domain/template_summary_diff_labels.py | 222 -- .../template_summary_diff_labels_new_old.py | 153 - ...ate_summary_diff_notification_endpoints.py | 222 -- ...emplate_summary_diff_notification_rules.py | 222 -- ...summary_diff_notification_rules_new_old.py | 337 -- .../domain/template_summary_diff_tasks.py | 222 -- .../template_summary_diff_tasks_new_old.py | 245 -- .../template_summary_diff_telegraf_configs.py | 222 -- .../domain/template_summary_diff_variables.py | 222 -- ...template_summary_diff_variables_new_old.py | 153 - .../domain/template_summary_errors.py | 176 - .../domain/template_summary_label.py | 245 -- .../template_summary_label_properties.py | 130 - .../domain/template_summary_summary.py | 360 --- .../template_summary_summary_buckets.py | 291 -- .../template_summary_summary_dashboards.py | 291 -- ...template_summary_summary_label_mappings.py | 268 -- ...late_summary_summary_notification_rules.py | 429 --- .../template_summary_summary_status_rules.py | 130 - .../template_summary_summary_tag_rules.py | 153 - .../domain/template_summary_summary_tasks.py | 337 -- .../template_summary_summary_variables.py | 291 -- .../influxdb_client/domain/test_statement.py | 138 - .../influxdb_client/domain/threshold.py | 120 - .../influxdb_client/domain/threshold_base.py | 134 - .../influxdb_client/domain/threshold_check.py | 273 -- .../domain/unary_expression.py | 161 - .../domain/unsigned_integer_literal.py | 138 - .../influxdb_client/domain/user.py | 166 - .../influxdb_client/domain/user_response.py | 189 -- .../domain/user_response_links.py | 107 - .../influxdb_client/domain/users.py | 130 - .../influxdb_client/domain/variable.py | 317 -- .../domain/variable_assignment.py | 161 - .../influxdb_client/domain/variable_links.py | 153 - .../domain/variable_properties.py | 82 - .../influxdb_client/domain/variables.py | 107 - .../influxdb_client/domain/view.py | 178 - .../influxdb_client/domain/view_links.py | 107 - .../influxdb_client/domain/view_properties.py | 82 - .../influxdb_client/domain/views.py | 130 - .../influxdb_client/domain/write_precision.py | 90 - .../influxdb_client/domain/xy_geom.py | 93 - .../domain/xy_view_properties.py | 776 ----- .../third_party/influxdb_client/extras.py | 13 - .../third_party/influxdb_client/py.typed | 0 frogpilot/third_party/influxdb_client/rest.py | 91 - .../influxdb_client/service/__init__.py | 56 - .../influxdb_client/service/_base_service.py | 67 - .../service/authorizations_service.py | 658 ---- .../influxdb_client/service/backup_service.py | 378 --- .../service/bucket_schemas_service.py | 607 ---- .../service/buckets_service.py | 1929 ----------- .../influxdb_client/service/cells_service.py | 820 ----- .../influxdb_client/service/checks_service.py | 1253 ------- .../influxdb_client/service/config_service.py | 250 -- .../service/dashboards_service.py | 2568 --------------- .../influxdb_client/service/dbr_ps_service.py | 695 ---- .../influxdb_client/service/delete_service.py | 173 - .../influxdb_client/service/health_service.py | 140 - .../service/invokable_scripts_service.py | 922 ------ .../influxdb_client/service/labels_service.py | 618 ---- .../service/legacy_authorizations_service.py | 777 ----- .../service/metrics_service.py | 140 - .../service/notification_endpoints_service.py | 1137 ------- .../service/notification_rules_service.py | 1149 ------- .../service/organizations_service.py | 1427 -------- .../influxdb_client/service/ping_service.py | 232 -- .../influxdb_client/service/query_service.py | 646 ---- .../influxdb_client/service/ready_service.py | 137 - .../service/remote_connections_service.py | 632 ---- .../service/replications_service.py | 768 ----- .../service/resources_service.py | 137 - .../service/restore_service.py | 683 ---- .../influxdb_client/service/routes_service.py | 140 - .../influxdb_client/service/rules_service.py | 146 - .../service/scraper_targets_service.py | 1748 ---------- .../service/secrets_service.py | 529 --- .../influxdb_client/service/setup_service.py | 263 -- .../influxdb_client/service/signin_service.py | 145 - .../service/signout_service.py | 140 - .../service/sources_service.py | 860 ----- .../influxdb_client/service/tasks_service.py | 2725 ---------------- .../service/telegraf_plugins_service.py | 142 - .../service/telegrafs_service.py | 1738 ---------- .../service/templates_service.py | 959 ------ .../influxdb_client/service/users_service.py | 1168 ------- .../service/variables_service.py | 1127 ------- .../influxdb_client/service/views_service.py | 293 -- .../influxdb_client/service/write_service.py | 201 -- .../third_party/influxdb_client/version.py | 3 - .../ui/layouts/settings/toggle_metadata.py | 2877 +++++++++++++++++ frogpilot/ui/qt/offroad/data_settings.cc | 2 +- frogpilot/ui/qt/offroad/device_settings.cc | 8 +- frogpilot/ui/qt/offroad/frogpilot_settings.cc | 2 + frogpilot/ui/qt/offroad/lateral_settings.cc | 5 +- frogpilot/ui/qt/offroad/theme_settings.cc | 3 +- .../qt/onroad/frogpilot_annotated_camera.cc | 4 +- frogpilot/ui/qt/widgets/frogpilot_controls.h | 2 +- launch_env.sh | 2 - system/sentry.py | 7 +- system/updated/updated.py | 9 - 441 files changed, 3380 insertions(+), 101519 deletions(-) delete mode 100755 frogpilot/system/environment_variables delete mode 100644 frogpilot/third_party/influxdb_client/__init__.py delete mode 100644 frogpilot/third_party/influxdb_client/_async/__init__.py delete mode 100644 frogpilot/third_party/influxdb_client/_async/api_client.py delete mode 100644 frogpilot/third_party/influxdb_client/_async/rest.py delete mode 100644 frogpilot/third_party/influxdb_client/_sync/__init__.py delete mode 100644 frogpilot/third_party/influxdb_client/_sync/api_client.py delete mode 100644 frogpilot/third_party/influxdb_client/_sync/rest.py delete mode 100644 frogpilot/third_party/influxdb_client/client/__init__.py delete mode 100644 frogpilot/third_party/influxdb_client/client/_base.py delete mode 100644 frogpilot/third_party/influxdb_client/client/_pages.py delete mode 100644 frogpilot/third_party/influxdb_client/client/authorizations_api.py delete mode 100644 frogpilot/third_party/influxdb_client/client/bucket_api.py delete mode 100644 frogpilot/third_party/influxdb_client/client/delete_api.py delete mode 100644 frogpilot/third_party/influxdb_client/client/delete_api_async.py delete mode 100644 frogpilot/third_party/influxdb_client/client/exceptions.py delete mode 100644 frogpilot/third_party/influxdb_client/client/flux_csv_parser.py delete mode 100644 frogpilot/third_party/influxdb_client/client/flux_table.py delete mode 100644 frogpilot/third_party/influxdb_client/client/influxdb_client.py delete mode 100644 frogpilot/third_party/influxdb_client/client/influxdb_client_async.py delete mode 100644 frogpilot/third_party/influxdb_client/client/invokable_scripts_api.py delete mode 100644 frogpilot/third_party/influxdb_client/client/labels_api.py delete mode 100644 frogpilot/third_party/influxdb_client/client/logging_handler.py delete mode 100644 frogpilot/third_party/influxdb_client/client/organizations_api.py delete mode 100644 frogpilot/third_party/influxdb_client/client/query_api.py delete mode 100644 frogpilot/third_party/influxdb_client/client/query_api_async.py delete mode 100644 frogpilot/third_party/influxdb_client/client/tasks_api.py delete mode 100644 frogpilot/third_party/influxdb_client/client/users_api.py delete mode 100644 frogpilot/third_party/influxdb_client/client/util/__init__.py delete mode 100644 frogpilot/third_party/influxdb_client/client/util/date_utils.py delete mode 100644 frogpilot/third_party/influxdb_client/client/util/date_utils_pandas.py delete mode 100644 frogpilot/third_party/influxdb_client/client/util/helpers.py delete mode 100644 frogpilot/third_party/influxdb_client/client/util/multiprocessing_helper.py delete mode 100644 frogpilot/third_party/influxdb_client/client/warnings.py delete mode 100644 frogpilot/third_party/influxdb_client/client/write/__init__.py delete mode 100644 frogpilot/third_party/influxdb_client/client/write/dataframe_serializer.py delete mode 100644 frogpilot/third_party/influxdb_client/client/write/point.py delete mode 100644 frogpilot/third_party/influxdb_client/client/write/retry.py delete mode 100644 frogpilot/third_party/influxdb_client/client/write_api.py delete mode 100644 frogpilot/third_party/influxdb_client/client/write_api_async.py delete mode 100644 frogpilot/third_party/influxdb_client/configuration.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/__init__.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/add_resource_member_request_body.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/analyze_query_response.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/analyze_query_response_errors.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/array_expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/ast_response.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/authorization.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/authorization_post_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/authorization_update_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/authorizations.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/axes.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/axis.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/axis_scale.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/bad_statement.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/band_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/binary_expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/block.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/boolean_literal.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/bucket.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/bucket_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/bucket_metadata_manifest.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/bucket_retention_rules.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/bucket_shard_mapping.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/buckets.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/builder_aggregate_function_type.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/builder_config.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/builder_config_aggregate_window.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/builder_functions_type.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/builder_tags_type.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/builtin_statement.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/call_expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/cell.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/cell_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/cell_update.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/cell_with_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/check.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/check_base.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/check_base_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/check_discriminator.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/check_patch.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/check_status_level.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/check_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/checks.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/column_data_type.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/column_semantic_type.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/conditional_expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/config.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/constant_variable_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/create_cell.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/create_dashboard_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/custom_check.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/dashboard.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/dashboard_color.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/dashboard_query.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/dashboard_with_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/dashboards.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/date_time_literal.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/dbr_ps.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/dbrp.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/dbrp_create.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/dbrp_get.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/dbrp_update.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/deadman_check.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/decimal_places.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/delete_predicate_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/dialect.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/dict_expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/dict_item.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/duration.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/duration_literal.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/error.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/expression_statement.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/field.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/file.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/float_literal.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/flux_response.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/flux_suggestion.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/flux_suggestions.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/function_expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/gauge_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/greater_threshold.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/health_check.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/heatmap_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/histogram_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/http_notification_endpoint.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/http_notification_rule.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/http_notification_rule_base.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/identifier.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/import_declaration.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/index_expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/integer_literal.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/is_onboarding.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/label.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/label_create_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/label_mapping.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/label_response.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/label_update.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/labels_response.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/language_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/legacy_authorization_post_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/lesser_threshold.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/line_plus_single_stat_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/line_protocol_error.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/line_protocol_length_error.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/list_stacks_response.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/log_event.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/logical_expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/logs.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/map_variable_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/markdown_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/measurement_schema.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/measurement_schema_column.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/measurement_schema_create_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/measurement_schema_list.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/measurement_schema_update_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/member_assignment.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/member_expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/metadata_backup.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/model_property.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/mosaic_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/node.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/notification_endpoint.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/notification_endpoint_base.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/notification_endpoint_base_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/notification_endpoint_discriminator.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/notification_endpoint_type.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/notification_endpoint_update.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/notification_endpoints.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/notification_rule.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/notification_rule_base.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/notification_rule_base_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/notification_rule_discriminator.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/notification_rule_update.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/notification_rules.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/object_expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/onboarding_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/onboarding_response.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/option_statement.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/organization.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/organization_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/organizations.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/package.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/package_clause.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/pager_duty_notification_endpoint.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/pager_duty_notification_rule.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/pager_duty_notification_rule_base.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/paren_expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/password_reset_body.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/patch_bucket_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/patch_dashboard_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/patch_organization_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/patch_retention_rule.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/patch_stack_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/patch_stack_request_additional_resources.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/permission.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/permission_resource.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/pipe_expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/pipe_literal.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/post_bucket_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/post_check.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/post_notification_endpoint.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/post_notification_rule.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/post_organization_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/post_restore_kv_response.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/post_stack_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/property_key.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/query.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/query_edit_mode.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/query_variable_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/query_variable_properties_values.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/range_threshold.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/ready.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/regexp_literal.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/remote_connection.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/remote_connection_creation_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/remote_connection_update_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/remote_connections.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/renamable_field.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/replication.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/replication_creation_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/replication_update_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/replications.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/resource_member.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/resource_members.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/resource_members_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/resource_owner.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/resource_owners.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/restored_bucket_mappings.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/retention_policy_manifest.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/return_statement.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/routes.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/routes_external.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/routes_query.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/routes_system.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/rule_status_level.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/run.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/run_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/run_manually.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/runs.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/scatter_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/schema_type.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/scraper_target_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/scraper_target_response.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/scraper_target_responses.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/script.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/script_create_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/script_invocation_params.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/script_language.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/script_update_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/scripts.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/secret_keys.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/secret_keys_response.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/shard_group_manifest.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/shard_manifest.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/shard_owner.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/simple_table_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/single_stat_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/slack_notification_endpoint.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/slack_notification_rule.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/slack_notification_rule_base.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/smtp_notification_rule.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/smtp_notification_rule_base.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/source.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/source_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/sources.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/stack.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/stack_associations.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/stack_events.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/stack_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/stack_resources.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/statement.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/static_legend.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/status_rule.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/string_literal.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/subscription_manifest.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/table_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/table_view_properties_table_options.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/tag_rule.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/task.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/task_create_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/task_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/task_status_type.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/task_update_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/tasks.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/telegraf.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/telegraf_plugin.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/telegraf_plugin_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/telegraf_plugin_request_plugins.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/telegraf_plugins.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/telegraf_request.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/telegraf_request_metadata.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/telegrafs.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/telegram_notification_endpoint.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/telegram_notification_rule.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/telegram_notification_rule_base.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_apply.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_apply_remotes.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_apply_template.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_chart.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_export_by_id.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_export_by_id_org_ids.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_export_by_id_resource_filters.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_export_by_id_resources.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_export_by_name.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_export_by_name_resources.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_kind.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_buckets.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_buckets_new_old.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_checks.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards_new_old.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_label_mappings.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_labels.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_labels_new_old.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_endpoints.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules_new_old.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_tasks.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_tasks_new_old.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_telegraf_configs.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_variables.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_diff_variables_new_old.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_errors.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_label.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_label_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_summary.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_summary_buckets.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_summary_dashboards.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_summary_label_mappings.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_summary_notification_rules.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_summary_status_rules.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_summary_tag_rules.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_summary_tasks.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/template_summary_summary_variables.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/test_statement.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/threshold.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/threshold_base.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/threshold_check.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/unary_expression.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/unsigned_integer_literal.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/user.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/user_response.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/user_response_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/users.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/variable.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/variable_assignment.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/variable_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/variable_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/variables.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/view.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/view_links.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/views.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/write_precision.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/xy_geom.py delete mode 100644 frogpilot/third_party/influxdb_client/domain/xy_view_properties.py delete mode 100644 frogpilot/third_party/influxdb_client/extras.py delete mode 100644 frogpilot/third_party/influxdb_client/py.typed delete mode 100644 frogpilot/third_party/influxdb_client/rest.py delete mode 100644 frogpilot/third_party/influxdb_client/service/__init__.py delete mode 100644 frogpilot/third_party/influxdb_client/service/_base_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/authorizations_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/backup_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/bucket_schemas_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/buckets_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/cells_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/checks_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/config_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/dashboards_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/dbr_ps_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/delete_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/health_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/invokable_scripts_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/labels_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/legacy_authorizations_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/metrics_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/notification_endpoints_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/notification_rules_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/organizations_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/ping_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/query_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/ready_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/remote_connections_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/replications_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/resources_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/restore_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/routes_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/rules_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/scraper_targets_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/secrets_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/setup_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/signin_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/signout_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/sources_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/tasks_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/telegraf_plugins_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/telegrafs_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/templates_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/users_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/variables_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/views_service.py delete mode 100644 frogpilot/third_party/influxdb_client/service/write_service.py delete mode 100644 frogpilot/third_party/influxdb_client/version.py create mode 100644 frogpilot/ui/layouts/settings/toggle_metadata.py diff --git a/README.md b/README.md index 82d43c9a3..63c13b79f 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,8 @@ We have detailed instructions for [how to install the harness and device in a ca [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/FrogAi/FrogPilot) [![Discord](https://img.shields.io/discord/1137853399715549214?label=Discord)](https://discord.frogpilot.com) -[![Last Updated](https://img.shields.io/badge/Last%20Updated-December%2020th%2C%202025-brightgreen)](https://github.com/FrogAi/FrogPilot/releases/latest) -[![Wiki](https://img.shields.io/badge/Wiki-FrogPilot-blue?logo=wiki)](https://frogpilot.wiki.gg/) +[![Last Updated](https://img.shields.io/badge/Last%20Updated-February%2028th%2C%202025-brightgreen)](https://github.com/FrogAi/FrogPilot/releases/latest) +[![Wiki](https://img.shields.io/badge/Wiki-FrogPilot-blue?logo=wiki)](https://frogpilot.com/wiki/) diff --git a/cereal/custom.capnp b/cereal/custom.capnp index 8876020eb..f05d3297c 100644 --- a/cereal/custom.capnp +++ b/cereal/custom.capnp @@ -123,10 +123,11 @@ struct FrogPilotCarState @0xda96579883444c35 { distanceVeryLongPressed @8 :Bool; ecoGear @9 :Bool; forceCoast @10 :Bool; - pauseLateral @11 :Bool; - pauseLongitudinal @12 :Bool; - sportGear @13 :Bool; - trafficModeEnabled @14 :Bool; + isParked @11 :Bool; + pauseLateral @12 :Bool; + pauseLongitudinal @13 :Bool; + sportGear @14 :Bool; + trafficModeEnabled @15 :Bool; struct ButtonEvent { enum Type { diff --git a/common/params.cc b/common/params.cc index 2d412419c..241065e91 100644 --- a/common/params.cc +++ b/common/params.cc @@ -333,6 +333,7 @@ std::unordered_map keys = { {"ForceStops", PERSISTENT}, {"ForceTorqueController", PERSISTENT}, {"FPSCounter", PERSISTENT}, + {"FrogPilotApiToken", PERSISTENT | DONT_LOG}, {"FrogPilotCarParams", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, {"FrogPilotCarParamsPersistent", PERSISTENT}, {"FrogPilotDongleId", PERSISTENT | DONT_LOG}, diff --git a/common/params_pyx.pyx b/common/params_pyx.pyx index ddce5103b..9362015df 100644 --- a/common/params_pyx.pyx +++ b/common/params_pyx.pyx @@ -13,6 +13,9 @@ cdef extern from "common/params.h": DEVELOPMENT_ONLY ALL + # FrogPilot variables + DONT_LOG + cdef cppclass c_Params "Params": c_Params(string) except + nogil string get(string, bool) nogil @@ -33,6 +36,9 @@ cdef extern from "common/params.h": void clearAll(ParamKeyType) vector[string] allKeys() + # FrogPilot variables + ParamKeyType getKeyType(string) nogil + def ensure_bytes(v): return v.encode() if isinstance(v, str) else v @@ -156,3 +162,7 @@ cdef class Params: def all_keys(self): return self.p.allKeys() + + # FrogPilot variables + def get_key_flag(self, key): + return self.p.getKeyType(self.check_key(key)) diff --git a/frogpilot/assets/theme_manager.py b/frogpilot/assets/theme_manager.py index d7ddfa4c4..014743809 100644 --- a/frogpilot/assets/theme_manager.py +++ b/frogpilot/assets/theme_manager.py @@ -262,13 +262,8 @@ class ThemeManager: if "~" in base: base, creator = base.split("~", 1) - parts = base.replace("_", "-").split("-") - capitalized_parts = [part.capitalize() for part in parts if part] - - if len(capitalized_parts) > 1 and component != "steering_wheels": - display = f"{capitalized_parts[0]} ({' '.join(capitalized_parts[1:])})" - else: - display = " ".join(capitalized_parts) + parts = base.replace("_", " ").replace("-", " ").split() + display = " ".join(part.capitalize() for part in parts) if creator: return f"{display} - by: {creator}" diff --git a/frogpilot/common/frogpilot_functions.py b/frogpilot/common/frogpilot_functions.py index 1dbf5a242..49c0acd98 100644 --- a/frogpilot/common/frogpilot_functions.py +++ b/frogpilot/common/frogpilot_functions.py @@ -1,12 +1,11 @@ #!/usr/bin/env python3 +import dataclasses import datetime import filecmp import glob import json -import os -import random +import requests import shutil -import string import subprocess import tarfile import threading @@ -23,9 +22,9 @@ from openpilot.system.hardware import HARDWARE from openpilot.frogpilot.assets.model_manager import ModelManager from openpilot.frogpilot.assets.theme_manager import ThemeManager -from openpilot.frogpilot.common.frogpilot_utilities import delete_file, run_cmd, use_konik_server +from openpilot.frogpilot.common.frogpilot_utilities import delete_file, is_url_pingable, run_cmd, run_thread_with_lock, use_konik_server from openpilot.frogpilot.common.frogpilot_variables import ( - ERROR_LOGS_PATH, EXCLUDED_KEYS, HD_LOGS_PATH, KONIK_LOGS_PATH, MODELS_PATH, SCREEN_RECORDINGS_PATH, + ERROR_LOGS_PATH, EXCLUDED_KEYS, FROGPILOT_API, HD_LOGS_PATH, KONIK_LOGS_PATH, MODELS_PATH, SCREEN_RECORDINGS_PATH, THEME_SAVE_PATH, VIDEO_CACHE_PATH, FrogPilotVariables, frogpilot_default_params, get_frogpilot_toggles, params ) from openpilot.frogpilot.system.frogpilot_stats import send_stats @@ -112,7 +111,8 @@ def backup_toggles(params_cache): params_backup.put(key, new_value) params_cache.put(key, new_value) - changes_found = key not in EXCLUDED_KEYS + if key not in EXCLUDED_KEYS: + changes_found = True backup_path = Path("/data/toggle_backups") maximum_backups = 5 @@ -166,10 +166,7 @@ def frogpilot_boot_functions(build_metadata, params_cache): elif params.get("DongleId", encoding="utf8") == params.get("KonikDongleId", encoding="utf8"): params.remove("DongleId") - if params.get("FrogPilotDongleId", encoding="utf8") == None: - params.put("FrogPilotDongleId", ''.join(random.choices(string.ascii_lowercase + string.digits, k=16))) - - def backup_thread(): + def boot_thread(): while not system_time_valid(): print("Waiting for system time to become valid...") time.sleep(1) @@ -179,7 +176,7 @@ def frogpilot_boot_functions(build_metadata, params_cache): send_stats() - threading.Thread(target=backup_thread, daemon=True).start() + threading.Thread(target=boot_thread, daemon=True).start() def setup_frogpilot(build_metadata): ERROR_LOGS_PATH.mkdir(parents=True, exist_ok=True) @@ -202,6 +199,36 @@ def setup_frogpilot(build_metadata): run_cmd(["sudo", "mount", "-o", "remount,rw", "/persist"], "Successfully remounted /persist as read-write", "Failed to remount /persist") run_cmd(["sudo", "python3", "/persist/frogsgomoo.py"], "Ran frogsgomoo.py", "Failed to run frogsgomoo.py") + register_device(build_metadata) + +def register_device(build_metadata): + def register_thread(): + while not is_url_pingable(FROGPILOT_API): + time.sleep(60) + + payload = { + "build_metadata": dataclasses.asdict(build_metadata), + "device": HARDWARE.get_device_type(), + "dongle_id": params.get("DongleId", encoding="utf8"), + "frogpilot_dongle_id": params.get("FrogPilotDongleId", encoding="utf8"), + } + + try: + response = requests.post(f"{FROGPILOT_API}/register", json=payload, headers={"Content-Type": "application/json", "User-Agent": "frogpilot-api/1.0"}, timeout=10) + response.raise_for_status() + + data = response.json() + print(f"Device registration successful: dongle_id={data.get('frogpilot_dongle_id', '')[:8]}..., token={'set' if data.get('api_token') else 'empty'}") + params.put("FrogPilotApiToken", data.get("api_token", "")) + params.put("FrogPilotDongleId", data.get("frogpilot_dongle_id")) + except Exception as e: + print(f"Device registration failed: {e}") + if hasattr(e, 'response') and e.response is not None: + print(f" Status: {e.response.status_code}, Body: {e.response.text[:200]}") + + threading.Thread(target=register_thread, daemon=True).start() + + def uninstall_frogpilot(): boot_logo_location = Path("/usr/comma/bg.jpg") stock_boot_logo = Path(__file__).parents[1] / "assets/other_images/stock_bg.jpg" diff --git a/frogpilot/common/frogpilot_utilities.py b/frogpilot/common/frogpilot_utilities.py index b8ccb014a..a5c79a768 100644 --- a/frogpilot/common/frogpilot_utilities.py +++ b/frogpilot/common/frogpilot_utilities.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -import io +import dataclasses import json import math import numpy as np @@ -20,12 +20,14 @@ import openpilot.system.sentry as sentry from cereal import log, messaging from opendbc.can.parser import CANParser +from openpilot.common.params import Params, ParamKeyType from openpilot.common.realtime import DT_DMON, DT_HW from openpilot.selfdrive.car.toyota.carcontroller import LOCK_CMD from openpilot.system.hardware import HARDWARE +from openpilot.system.version import get_build_metadata from panda import Panda -from openpilot.frogpilot.common.frogpilot_variables import DISCORD_WEBHOOK_URL_REPORT, EARTH_RADIUS, ERROR_LOGS_PATH, KONIK_PATH, MAPD_PATH, MAPS_PATH, params, params_cache, params_memory +from openpilot.frogpilot.common.frogpilot_variables import EARTH_RADIUS, ERROR_LOGS_PATH, EXCLUDED_KEYS, FROGPILOT_API, KONIK_PATH, MAPD_PATH, MAPS_PATH, GearShifter, frogpilot_default_params, params, params_cache, params_memory, update_frogpilot_toggles running_threads = {} @@ -112,44 +114,33 @@ def calculate_road_curvature(modelData, v_ego): return predicted_lateral_acc / max(v_ego, 1)**2, max(time_to_curve, 1) def capture_report(discord_user, report, frogpilot_toggles): - if not DISCORD_WEBHOOK_URL_REPORT: + if not is_url_pingable(FROGPILOT_API): return + api_token, build_metadata, device_type, dongle_id = get_frogpilot_api_info() + error_file_path = ERROR_LOGS_PATH / "error.txt" error_content = "No error log found." if error_file_path.exists(): error_content = error_file_path.read_text()[:1000] - toggles_bytes = io.BytesIO(json.dumps(frogpilot_toggles, indent=2).encode("utf-8")) - - message = ( - f"**🚨 New Error Report**\n\n" - f"**User:** `{discord_user}`\n\n" - f"**Report:**\n" - f"```{report}```\n" - f"**Error Log:**\n" - f"```{error_content}```\n" - f"**Toggle Settings:**\n" - ) + payload = { + "api_token": api_token, + "build_metadata": build_metadata, + "device": device_type, + "discord_user": discord_user, + "error_content": error_content, + "frogpilot_dongle_id": dongle_id, + "frogpilot_toggles": frogpilot_toggles, + "report": report, + } try: - resp = requests.post( - DISCORD_WEBHOOK_URL_REPORT, - data={"content": message}, - files={"file": ("frogpilot_toggles.json", toggles_bytes, "application/json")} - ) - if resp.status_code not in (200, 204): - print(f"Discord notification failed: {resp.status_code} {resp.text}") - return - - mention_resp = requests.post( - DISCORD_WEBHOOK_URL_REPORT, - json={"content": "<@&1198482895342411846>"} - ) - if mention_resp.status_code not in (200, 204): - print(f"Discord mention failed: {mention_resp.status_code} {mention_resp.text}") - except Exception as exception: - print(f"Error sending Discord message: {exception}") + response = requests.post(f"{FROGPILOT_API}/discord/report", json=payload, headers={"Content-Type": "application/json", "User-Agent": "frogpilot-api/1.0"}, timeout=30) + response.raise_for_status() + print("Successfully sent error report!") + except requests.exceptions.RequestException as exception: + print(f"Error sending report: {exception}") def clean_model_name(name): return ( @@ -203,6 +194,14 @@ def flash_panda(): params_memory.remove("FlashPanda") +def get_frogpilot_api_info(): + api_token = params.get("FrogPilotApiToken", encoding="utf-8") + build_metadata = dataclasses.asdict(get_build_metadata()) + device_type = HARDWARE.get_device_type() + dongle_id = params.get("FrogPilotDongleId", encoding="utf-8") + + return api_token, build_metadata, device_type, dongle_id + def get_lock_status(can_parser, can_sock): can_msgs = messaging.drain_sock_raw(can_sock, wait_for_one=True) can_parser.update_strings(can_msgs) diff --git a/frogpilot/common/frogpilot_variables.py b/frogpilot/common/frogpilot_variables.py index 7de8e499d..30b723d2b 100644 --- a/frogpilot/common/frogpilot_variables.py +++ b/frogpilot/common/frogpilot_variables.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import json import numpy as np -import os import random import tomllib @@ -47,8 +46,7 @@ THRESHOLD = 0.63 # Requires the condition to be true fo NON_DRIVING_GEARS = [GearShifter.neutral, GearShifter.park, GearShifter.reverse, GearShifter.unknown] -DISCORD_WEBHOOK_URL_REPORT = os.getenv("DISCORD_WEBHOOK_URL_REPORT") -DISCORD_WEBHOOK_URL_THEME = os.getenv("DISCORD_WEBHOOK_URL_THEME") +FROGPILOT_API = "https://frogpilot.com/api" RESOURCES_REPO = "FrogAi/FrogPilot-Resources" @@ -259,6 +257,7 @@ frogpilot_default_params: list[tuple[str, str | bytes, int, str]] = [ ("ForceStops", "0", 2, "0"), ("ForceTorqueController", "0", 3, "0"), ("FPSCounter", "1", 3, "0"), + ("FrogPilotApiToken", "", 0, ""), ("FrogPilotDongleId", "", 0, ""), ("FrogPilotStats", "", 0, ""), ("FrogsGoMoosTweak", "1", 2, "0"), @@ -525,14 +524,14 @@ class FrogPilotVariables: toggle.frogs_go_moo = Path("/persist/frogsgomoo.py").is_file() toggle.block_user = (self.development_branch or short_branch == "MAKE-PRS-HERE" or self.vetting_branch) and not toggle.frogs_go_moo - tuning_level = params.get_int("TuningLevel") if params.get_bool("TuningLevelConfirmed") else 3 + toggle.tuning_level = params.get_int("TuningLevel") if params.get_bool("TuningLevelConfirmed") else 3 - device_management = params.get_bool("DeviceManagement") if tuning_level >= level["DeviceManagement"] else default.get_bool("DeviceManagement") + device_management = params.get_bool("DeviceManagement") if toggle.tuning_level >= level["DeviceManagement"] else default.get_bool("DeviceManagement") toggle.use_higher_bitrate = device_management - toggle.use_higher_bitrate &= params.get_bool("HigherBitrate") if tuning_level >= level["HigherBitrate"] else default.get_bool("HigherBitrate") - toggle.use_higher_bitrate &= params.get_bool("NoUploads") if tuning_level >= level["NoUploads"] else default.get_bool("NoUploads") - toggle.use_higher_bitrate &= not (params.get_bool("DisableOnroadUploads") if tuning_level >= level["DisableOnroadUploads"] else default.get_bool("DisableOnroadUploads")) + toggle.use_higher_bitrate &= params.get_bool("HigherBitrate") if toggle.tuning_level >= level["HigherBitrate"] else default.get_bool("HigherBitrate") + toggle.use_higher_bitrate &= params.get_bool("NoUploads") if toggle.tuning_level >= level["NoUploads"] else default.get_bool("NoUploads") + toggle.use_higher_bitrate &= not (params.get_bool("DisableOnroadUploads") if toggle.tuning_level >= level["DisableOnroadUploads"] else default.get_bool("DisableOnroadUploads")) toggle.use_higher_bitrate &= not self.vetting_branch toggle.use_higher_bitrate |= self.development_branch @@ -546,7 +545,7 @@ class FrogPilotVariables: HARDWARE.reboot() toggle.use_konik_server = device_management - toggle.use_konik_server &= params.get_bool("UseKonikServer") if tuning_level >= level["UseKonikServer"] else default.get_bool("UseKonikServer") + toggle.use_konik_server &= params.get_bool("UseKonikServer") if toggle.tuning_level >= level["UseKonikServer"] else default.get_bool("UseKonikServer") toggle.use_konik_server |= Path("/data/openpilot/not_vetted").is_file() if not KONIK_PATH.is_file() and toggle.use_konik_server: @@ -572,7 +571,7 @@ class FrogPilotVariables: toggle.force_offroad = params_memory.get_bool("ForceOffroad") toggle.force_onroad = params_memory.get_bool("ForceOnroad") - tuning_level = params.get_int("TuningLevel") if params.get_bool("TuningLevelConfirmed") else 3 + toggle.tuning_level = params.get_int("TuningLevel") if params.get_bool("TuningLevelConfirmed") else 3 toggle.is_metric = params.get_bool("IsMetric") distance_conversion = 1 if toggle.is_metric else CV.FOOT_TO_METER @@ -607,7 +606,7 @@ class FrogPilotVariables: toggle.always_on_lateral_set = bool(CP.alternativeExperience & ALTERNATIVE_EXPERIENCE.ALWAYS_ON_LATERAL) toggle.car_make = CP.carName toggle.car_model = CP.carFingerprint - toggle.disable_openpilot_long = params.get_bool("DisableOpenpilotLongitudinal") if tuning_level >= level["DisableOpenpilotLongitudinal"] else default.get_bool("DisableOpenpilotLongitudinal") + toggle.disable_openpilot_long = params.get_bool("DisableOpenpilotLongitudinal") if toggle.tuning_level >= level["DisableOpenpilotLongitudinal"] else default.get_bool("DisableOpenpilotLongitudinal") friction = CP.lateralTuning.torque.friction has_auto_tune = toggle.car_make in {"hyundai", "toyota"} and CP.lateralTuning.which() == "torque" has_bsm = CP.enableBsm @@ -645,171 +644,171 @@ class FrogPilotVariables: if not toggle.use_lkas_for_aol: params.remove("AlwaysOnLateralLKAS") - advanced_custom_ui = params.get_bool("AdvancedCustomUI") if tuning_level >= level["AdvancedCustomUI"] else default.get_bool("AdvancedCustomUI") - toggle.hide_alerts = advanced_custom_ui and (params.get_bool("HideAlerts") if tuning_level >= level["HideAlerts"] else default.get_bool("HideAlerts")) and not toggle.debug_mode - toggle.hide_lead_marker = toggle.openpilot_longitudinal and (advanced_custom_ui and (params.get_bool("HideLeadMarker") if tuning_level >= level["HideLeadMarker"] else default.get_bool("HideLeadMarker")) and not toggle.debug_mode) - toggle.hide_map_icon = advanced_custom_ui and (params.get_bool("HideMapIcon") if tuning_level >= level["HideMapIcon"] else default.get_bool("HideMapIcon")) - toggle.hide_map = toggle.hide_map_icon and (params.get_bool("HideMap") if tuning_level >= level["HideMap"] else default.get_bool("HideMap")) - toggle.hide_max_speed = advanced_custom_ui and (params.get_bool("HideMaxSpeed") if tuning_level >= level["HideMaxSpeed"] else default.get_bool("HideMaxSpeed")) and not toggle.debug_mode - toggle.hide_speed = advanced_custom_ui and (params.get_bool("HideSpeed") if tuning_level >= level["HideSpeed"] else default.get_bool("HideSpeed")) and not toggle.debug_mode - toggle.hide_speed_limit = advanced_custom_ui and (params.get_bool("HideSpeedLimit") if tuning_level >= level["HideSpeedLimit"] else default.get_bool("HideSpeedLimit")) and not toggle.debug_mode - toggle.use_wheel_speed = advanced_custom_ui and (params.get_bool("WheelSpeed") if tuning_level >= level["WheelSpeed"] else default.get_bool("WheelSpeed")) + advanced_custom_ui = params.get_bool("AdvancedCustomUI") if toggle.tuning_level >= level["AdvancedCustomUI"] else default.get_bool("AdvancedCustomUI") + toggle.hide_alerts = advanced_custom_ui and (params.get_bool("HideAlerts") if toggle.tuning_level >= level["HideAlerts"] else default.get_bool("HideAlerts")) and not toggle.debug_mode + toggle.hide_lead_marker = toggle.openpilot_longitudinal and (advanced_custom_ui and (params.get_bool("HideLeadMarker") if toggle.tuning_level >= level["HideLeadMarker"] else default.get_bool("HideLeadMarker")) and not toggle.debug_mode) + toggle.hide_map_icon = advanced_custom_ui and (params.get_bool("HideMapIcon") if toggle.tuning_level >= level["HideMapIcon"] else default.get_bool("HideMapIcon")) + toggle.hide_map = toggle.hide_map_icon and (params.get_bool("HideMap") if toggle.tuning_level >= level["HideMap"] else default.get_bool("HideMap")) + toggle.hide_max_speed = advanced_custom_ui and (params.get_bool("HideMaxSpeed") if toggle.tuning_level >= level["HideMaxSpeed"] else default.get_bool("HideMaxSpeed")) and not toggle.debug_mode + toggle.hide_speed = advanced_custom_ui and (params.get_bool("HideSpeed") if toggle.tuning_level >= level["HideSpeed"] else default.get_bool("HideSpeed")) and not toggle.debug_mode + toggle.hide_speed_limit = advanced_custom_ui and (params.get_bool("HideSpeedLimit") if toggle.tuning_level >= level["HideSpeedLimit"] else default.get_bool("HideSpeedLimit")) and not toggle.debug_mode + toggle.use_wheel_speed = advanced_custom_ui and (params.get_bool("WheelSpeed") if toggle.tuning_level >= level["WheelSpeed"] else default.get_bool("WheelSpeed")) - advanced_lateral_tuning = params.get_bool("AdvancedLateralTune") if tuning_level >= level["AdvancedLateralTune"] else default.get_bool("AdvancedLateralTune") - toggle.force_auto_tune = advanced_lateral_tuning and not has_auto_tune and is_torque_car and (params.get_bool("ForceAutoTune") if tuning_level >= level["ForceAutoTune"] else default.get_bool("ForceAutoTune")) - toggle.force_auto_tune_off = advanced_lateral_tuning and has_auto_tune and is_torque_car and (params.get_bool("ForceAutoTuneOff") if tuning_level >= level["ForceAutoTuneOff"] else default.get_bool("ForceAutoTuneOff")) - toggle.steerActuatorDelay = np.clip(params.get_float("SteerDelay"), 0.01, 1.0) if advanced_lateral_tuning and tuning_level >= level["SteerDelay"] else steerActuatorDelay + advanced_lateral_tuning = params.get_bool("AdvancedLateralTune") if toggle.tuning_level >= level["AdvancedLateralTune"] else default.get_bool("AdvancedLateralTune") + toggle.force_auto_tune = advanced_lateral_tuning and not has_auto_tune and is_torque_car and (params.get_bool("ForceAutoTune") if toggle.tuning_level >= level["ForceAutoTune"] else default.get_bool("ForceAutoTune")) + toggle.force_auto_tune_off = advanced_lateral_tuning and has_auto_tune and is_torque_car and (params.get_bool("ForceAutoTuneOff") if toggle.tuning_level >= level["ForceAutoTuneOff"] else default.get_bool("ForceAutoTuneOff")) + toggle.steerActuatorDelay = np.clip(params.get_float("SteerDelay"), 0.01, 1.0) if advanced_lateral_tuning and toggle.tuning_level >= level["SteerDelay"] else steerActuatorDelay toggle.use_custom_steerActuatorDelay = bool(round(toggle.steerActuatorDelay, 2) != round(steerActuatorDelay, 2)) - toggle.friction = np.clip(params.get_float("SteerFriction"), 0, 0.5) if advanced_lateral_tuning and tuning_level >= level["SteerFriction"] else friction + toggle.friction = np.clip(params.get_float("SteerFriction"), 0, 0.5) if advanced_lateral_tuning and toggle.tuning_level >= level["SteerFriction"] else friction toggle.use_custom_friction = bool(round(toggle.friction, 2) != round(friction, 2)) and is_torque_car and not toggle.force_auto_tune or toggle.force_auto_tune_off - toggle.steerKp = [[0], [np.clip(params.get_float("SteerKP"), steerKp * 0.5, steerKp * 1.5) if advanced_lateral_tuning and is_torque_car and tuning_level >= level["SteerKP"] else steerKp]] - toggle.latAccelFactor = np.clip(params.get_float("SteerLatAccel"), latAccelFactor * 0.75, latAccelFactor * 1.25) if advanced_lateral_tuning and tuning_level >= level["SteerLatAccel"] else latAccelFactor + toggle.steerKp = [[0], [np.clip(params.get_float("SteerKP"), steerKp * 0.5, steerKp * 1.5) if advanced_lateral_tuning and is_torque_car and toggle.tuning_level >= level["SteerKP"] else steerKp]] + toggle.latAccelFactor = np.clip(params.get_float("SteerLatAccel"), latAccelFactor * 0.75, latAccelFactor * 1.25) if advanced_lateral_tuning and toggle.tuning_level >= level["SteerLatAccel"] else latAccelFactor toggle.use_custom_latAccelFactor = bool(round(toggle.latAccelFactor, 2) != round(latAccelFactor, 2)) and is_torque_car and not toggle.force_auto_tune or toggle.force_auto_tune_off - toggle.steerRatio = np.clip(params.get_float("SteerRatio"), steerRatio * 0.5, steerRatio * 1.5) if advanced_lateral_tuning and tuning_level >= level["SteerRatio"] else steerRatio + toggle.steerRatio = np.clip(params.get_float("SteerRatio"), steerRatio * 0.5, steerRatio * 1.5) if advanced_lateral_tuning and toggle.tuning_level >= level["SteerRatio"] else steerRatio toggle.use_custom_steerRatio = bool(round(toggle.steerRatio, 2) != round(steerRatio, 2)) and not toggle.force_auto_tune or toggle.force_auto_tune_off - advanced_longitudinal_tuning = toggle.openpilot_longitudinal and (params.get_bool("AdvancedLongitudinalTune") if tuning_level >= level["AdvancedLongitudinalTune"] else default.get_bool("AdvancedLongitudinalTune")) - toggle.longitudinalActuatorDelay = np.clip(params.get_float("LongitudinalActuatorDelay"), 0, 1) if advanced_longitudinal_tuning and tuning_level >= level["LongitudinalActuatorDelay"] else longitudinalActuatorDelay - toggle.max_desired_acceleration = np.clip(params.get_float("MaxDesiredAcceleration"), 0.1, 4.0) if advanced_longitudinal_tuning and tuning_level >= level["MaxDesiredAcceleration"] else default.get_float("MaxDesiredAcceleration") - toggle.startAccel = np.clip(params.get_float("StartAccel"), 0, 4) if advanced_longitudinal_tuning and tuning_level >= level["StartAccel"] else startAccel - toggle.stopAccel = np.clip(params.get_float("StopAccel"), -4, 0) if advanced_longitudinal_tuning and tuning_level >= level["StopAccel"] else stopAccel - toggle.stoppingDecelRate = np.clip(params.get_float("StoppingDecelRate"), 0.001, 1) if advanced_longitudinal_tuning and tuning_level >= level["StoppingDecelRate"] else toggle.stoppingDecelRate - toggle.vEgoStarting = np.clip(params.get_float("VEgoStarting"), 0.01, 1) if advanced_longitudinal_tuning and tuning_level >= level["VEgoStarting"] else toggle.vEgoStarting - toggle.vEgoStopping = np.clip(params.get_float("VEgoStopping"), 0.01, 1) if advanced_longitudinal_tuning and tuning_level >= level["VEgoStopping"] else toggle.vEgoStopping + advanced_longitudinal_tuning = toggle.openpilot_longitudinal and (params.get_bool("AdvancedLongitudinalTune") if toggle.tuning_level >= level["AdvancedLongitudinalTune"] else default.get_bool("AdvancedLongitudinalTune")) + toggle.longitudinalActuatorDelay = np.clip(params.get_float("LongitudinalActuatorDelay"), 0, 1) if advanced_longitudinal_tuning and toggle.tuning_level >= level["LongitudinalActuatorDelay"] else longitudinalActuatorDelay + toggle.max_desired_acceleration = np.clip(params.get_float("MaxDesiredAcceleration"), 0.1, 4.0) if advanced_longitudinal_tuning and toggle.tuning_level >= level["MaxDesiredAcceleration"] else default.get_float("MaxDesiredAcceleration") + toggle.startAccel = np.clip(params.get_float("StartAccel"), 0, 4) if advanced_longitudinal_tuning and toggle.tuning_level >= level["StartAccel"] else startAccel + toggle.stopAccel = np.clip(params.get_float("StopAccel"), -4, 0) if advanced_longitudinal_tuning and toggle.tuning_level >= level["StopAccel"] else stopAccel + toggle.stoppingDecelRate = np.clip(params.get_float("StoppingDecelRate"), 0.001, 1) if advanced_longitudinal_tuning and toggle.tuning_level >= level["StoppingDecelRate"] else toggle.stoppingDecelRate + toggle.vEgoStarting = np.clip(params.get_float("VEgoStarting"), 0.01, 1) if advanced_longitudinal_tuning and toggle.tuning_level >= level["VEgoStarting"] else toggle.vEgoStarting + toggle.vEgoStopping = np.clip(params.get_float("VEgoStopping"), 0.01, 1) if advanced_longitudinal_tuning and toggle.tuning_level >= level["VEgoStopping"] else toggle.vEgoStopping - toggle.alert_volume_controller = params.get_bool("AlertVolumeControl") if tuning_level >= level["AlertVolumeControl"] else default.get_bool("AlertVolumeControl") - toggle.disengage_volume = params.get_int("DisengageVolume") if toggle.alert_volume_controller and tuning_level >= level["DisengageVolume"] else default.get_int("DisengageVolume") - toggle.engage_volume = params.get_int("EngageVolume") if toggle.alert_volume_controller and tuning_level >= level["EngageVolume"] else default.get_int("EngageVolume") - toggle.prompt_volume = params.get_int("PromptVolume") if toggle.alert_volume_controller and tuning_level >= level["PromptVolume"] else default.get_int("PromptVolume") - toggle.promptDistracted_volume = params.get_int("PromptDistractedVolume") if toggle.alert_volume_controller and tuning_level >= level["PromptDistractedVolume"] else default.get_int("PromptDistractedVolume") - toggle.refuse_volume = params.get_int("RefuseVolume") if toggle.alert_volume_controller and tuning_level >= level["RefuseVolume"] else default.get_int("RefuseVolume") - toggle.warningSoft_volume = params.get_int("WarningSoftVolume") if toggle.alert_volume_controller and tuning_level >= level["WarningSoftVolume"] else default.get_int("WarningSoftVolume") - toggle.warningImmediate_volume = max(params.get_int("WarningImmediateVolume"), 25) if toggle.alert_volume_controller and tuning_level >= level["WarningImmediateVolume"] else default.get_int("WarningImmediateVolume") + toggle.alert_volume_controller = params.get_bool("AlertVolumeControl") if toggle.tuning_level >= level["AlertVolumeControl"] else default.get_bool("AlertVolumeControl") + toggle.disengage_volume = params.get_int("DisengageVolume") if toggle.alert_volume_controller and toggle.tuning_level >= level["DisengageVolume"] else default.get_int("DisengageVolume") + toggle.engage_volume = params.get_int("EngageVolume") if toggle.alert_volume_controller and toggle.tuning_level >= level["EngageVolume"] else default.get_int("EngageVolume") + toggle.prompt_volume = params.get_int("PromptVolume") if toggle.alert_volume_controller and toggle.tuning_level >= level["PromptVolume"] else default.get_int("PromptVolume") + toggle.promptDistracted_volume = params.get_int("PromptDistractedVolume") if toggle.alert_volume_controller and toggle.tuning_level >= level["PromptDistractedVolume"] else default.get_int("PromptDistractedVolume") + toggle.refuse_volume = params.get_int("RefuseVolume") if toggle.alert_volume_controller and toggle.tuning_level >= level["RefuseVolume"] else default.get_int("RefuseVolume") + toggle.warningSoft_volume = params.get_int("WarningSoftVolume") if toggle.alert_volume_controller and toggle.tuning_level >= level["WarningSoftVolume"] else default.get_int("WarningSoftVolume") + toggle.warningImmediate_volume = max(params.get_int("WarningImmediateVolume"), 25) if toggle.alert_volume_controller and toggle.tuning_level >= level["WarningImmediateVolume"] else default.get_int("WarningImmediateVolume") - toggle.always_on_lateral = params.get_bool("AlwaysOnLateral") if tuning_level >= level["AlwaysOnLateral"] else default.get_bool("AlwaysOnLateral") + toggle.always_on_lateral = params.get_bool("AlwaysOnLateral") if toggle.tuning_level >= level["AlwaysOnLateral"] else default.get_bool("AlwaysOnLateral") toggle.always_on_lateral_set &= toggle.always_on_lateral - toggle.always_on_lateral_lkas = toggle.always_on_lateral_set and toggle.use_lkas_for_aol and (params.get_bool("AlwaysOnLateralLKAS") if tuning_level >= level["AlwaysOnLateralLKAS"] else default.get_bool("AlwaysOnLateralLKAS")) - toggle.always_on_lateral_main = toggle.always_on_lateral_set and not toggle.use_lkas_for_aol and (params.get_bool("AlwaysOnLateralMain") if tuning_level >= level["AlwaysOnLateralMain"] else default.get_bool("AlwaysOnLateralMain")) - toggle.always_on_lateral_pause_speed = params.get_int("PauseAOLOnBrake") if toggle.always_on_lateral_set and tuning_level >= level["PauseAOLOnBrake"] else default.get_int("PauseAOLOnBrake") + toggle.always_on_lateral_lkas = toggle.always_on_lateral_set and toggle.use_lkas_for_aol and (params.get_bool("AlwaysOnLateralLKAS") if toggle.tuning_level >= level["AlwaysOnLateralLKAS"] else default.get_bool("AlwaysOnLateralLKAS")) + toggle.always_on_lateral_main = toggle.always_on_lateral_set and not toggle.use_lkas_for_aol and (params.get_bool("AlwaysOnLateralMain") if toggle.tuning_level >= level["AlwaysOnLateralMain"] else default.get_bool("AlwaysOnLateralMain")) + toggle.always_on_lateral_pause_speed = params.get_int("PauseAOLOnBrake") if toggle.always_on_lateral_set and toggle.tuning_level >= level["PauseAOLOnBrake"] else default.get_int("PauseAOLOnBrake") - toggle.automatic_updates = (params.get_bool("AutomaticUpdates") if tuning_level >= level["AutomaticUpdates"] and (self.release_branch or self.vetting_branch) else default.get_bool("AutomaticUpdates")) and not BACKUP_PATH.is_file() + toggle.automatic_updates = (params.get_bool("AutomaticUpdates") if toggle.tuning_level >= level["AutomaticUpdates"] and (self.release_branch or self.vetting_branch) else default.get_bool("AutomaticUpdates")) and not BACKUP_PATH.is_file() toggle.car_model = params.get("CarModel", encoding="utf-8") or toggle.car_model - toggle.cluster_offset = params.get_float("ClusterOffset") if toggle.car_make == "toyota" and tuning_level >= level["ClusterOffset"] else default.get_float("ClusterOffset") + toggle.cluster_offset = params.get_float("ClusterOffset") if toggle.car_make == "toyota" and toggle.tuning_level >= level["ClusterOffset"] else default.get_float("ClusterOffset") - toggle.conditional_experimental_mode = toggle.openpilot_longitudinal and (params.get_bool("ConditionalExperimental") if tuning_level >= level["ConditionalExperimental"] else default.get_bool("ConditionalExperimental")) - toggle.conditional_curves = toggle.conditional_experimental_mode and (params.get_bool("CECurves") if tuning_level >= level["CECurves"] else default.get_bool("CECurves")) - toggle.conditional_curves_lead = toggle.conditional_curves and (params.get_bool("CECurvesLead") if tuning_level >= level["CECurvesLead"] else default.get_bool("CECurvesLead")) - toggle.conditional_lead = toggle.conditional_experimental_mode and (params.get_bool("CELead") if tuning_level >= level["CELead"] else default.get_bool("CELead")) - toggle.conditional_slower_lead = toggle.conditional_lead and (params.get_bool("CESlowerLead") if tuning_level >= level["CESlowerLead"] else default.get_bool("CESlowerLead")) - toggle.conditional_stopped_lead = toggle.conditional_lead and (params.get_bool("CEStoppedLead") if tuning_level >= level["CEStoppedLead"] else default.get_bool("CEStoppedLead")) - toggle.conditional_limit = params.get_int("CESpeed") * speed_conversion if toggle.conditional_experimental_mode and tuning_level >= level["CESpeed"] else default.get_int("CESpeed") * CV.MPH_TO_MS - toggle.conditional_limit_lead = params.get_int("CESpeedLead") * speed_conversion if toggle.conditional_experimental_mode and tuning_level >= level["CESpeedLead"] else default.get_int("CESpeedLead") * CV.MPH_TO_MS - toggle.conditional_navigation = toggle.conditional_experimental_mode and (params.get_bool("CENavigation") if tuning_level >= level["CENavigation"] else default.get_bool("CENavigation")) - toggle.conditional_navigation_intersections = toggle.conditional_navigation and (params.get_bool("CENavigationIntersections") if tuning_level >= level["CENavigationIntersections"] else default.get_bool("CENavigationIntersections")) - toggle.conditional_navigation_lead = toggle.conditional_navigation and (params.get_bool("CENavigationLead") if tuning_level >= level["CENavigationLead"] else default.get_bool("CENavigationLead")) - toggle.conditional_navigation_turns = toggle.conditional_navigation and (params.get_bool("CENavigationTurns") if tuning_level >= level["CENavigationTurns"] else default.get_bool("CENavigationTurns")) - if tuning_level >= level["CEModelStopTime"]: + toggle.conditional_experimental_mode = toggle.openpilot_longitudinal and (params.get_bool("ConditionalExperimental") if toggle.tuning_level >= level["ConditionalExperimental"] else default.get_bool("ConditionalExperimental")) + toggle.conditional_curves = toggle.conditional_experimental_mode and (params.get_bool("CECurves") if toggle.tuning_level >= level["CECurves"] else default.get_bool("CECurves")) + toggle.conditional_curves_lead = toggle.conditional_curves and (params.get_bool("CECurvesLead") if toggle.tuning_level >= level["CECurvesLead"] else default.get_bool("CECurvesLead")) + toggle.conditional_lead = toggle.conditional_experimental_mode and (params.get_bool("CELead") if toggle.tuning_level >= level["CELead"] else default.get_bool("CELead")) + toggle.conditional_slower_lead = toggle.conditional_lead and (params.get_bool("CESlowerLead") if toggle.tuning_level >= level["CESlowerLead"] else default.get_bool("CESlowerLead")) + toggle.conditional_stopped_lead = toggle.conditional_lead and (params.get_bool("CEStoppedLead") if toggle.tuning_level >= level["CEStoppedLead"] else default.get_bool("CEStoppedLead")) + toggle.conditional_limit = params.get_int("CESpeed") * speed_conversion if toggle.conditional_experimental_mode and toggle.tuning_level >= level["CESpeed"] else default.get_int("CESpeed") * CV.MPH_TO_MS + toggle.conditional_limit_lead = params.get_int("CESpeedLead") * speed_conversion if toggle.conditional_experimental_mode and toggle.tuning_level >= level["CESpeedLead"] else default.get_int("CESpeedLead") * CV.MPH_TO_MS + toggle.conditional_navigation = toggle.conditional_experimental_mode and (params.get_bool("CENavigation") if toggle.tuning_level >= level["CENavigation"] else default.get_bool("CENavigation")) + toggle.conditional_navigation_intersections = toggle.conditional_navigation and (params.get_bool("CENavigationIntersections") if toggle.tuning_level >= level["CENavigationIntersections"] else default.get_bool("CENavigationIntersections")) + toggle.conditional_navigation_lead = toggle.conditional_navigation and (params.get_bool("CENavigationLead") if toggle.tuning_level >= level["CENavigationLead"] else default.get_bool("CENavigationLead")) + toggle.conditional_navigation_turns = toggle.conditional_navigation and (params.get_bool("CENavigationTurns") if toggle.tuning_level >= level["CENavigationTurns"] else default.get_bool("CENavigationTurns")) + if toggle.tuning_level >= level["CEModelStopTime"]: toggle.conditional_model_stop_time = params.get_int("CEModelStopTime") if toggle.conditional_experimental_mode else default.get_int("CEModelStopTime") else: toggle.conditional_model_stop_time = default.get_int("CEModelStopTime") if toggle.conditional_experimental_mode and params.get_bool("CEStopLights") else 0 - toggle.conditional_signal = params.get_int("CESignalSpeed") * speed_conversion if toggle.conditional_experimental_mode and tuning_level >= level["CESignalSpeed"] else default.get_int("CESignalSpeed") * CV.MPH_TO_MS - toggle.conditional_signal_lane_detection = toggle.conditional_signal != 0 and (params.get_bool("CESignalLaneDetection") if tuning_level >= level["CESignalLaneDetection"] else default.get_bool("CESignalLaneDetection")) - toggle.cem_status = toggle.conditional_experimental_mode and (params.get_bool("ShowCEMStatus") if tuning_level >= level["ShowCEMStatus"] else default.get_bool("ShowCEMStatus")) or toggle.debug_mode + toggle.conditional_signal = params.get_int("CESignalSpeed") * speed_conversion if toggle.conditional_experimental_mode and toggle.tuning_level >= level["CESignalSpeed"] else default.get_int("CESignalSpeed") * CV.MPH_TO_MS + toggle.conditional_signal_lane_detection = toggle.conditional_signal != 0 and (params.get_bool("CESignalLaneDetection") if toggle.tuning_level >= level["CESignalLaneDetection"] else default.get_bool("CESignalLaneDetection")) + toggle.cem_status = toggle.conditional_experimental_mode and (params.get_bool("ShowCEMStatus") if toggle.tuning_level >= level["ShowCEMStatus"] else default.get_bool("ShowCEMStatus")) or toggle.debug_mode - toggle.curve_speed_controller = toggle.openpilot_longitudinal and (params.get_bool("CurveSpeedController") if tuning_level >= level["CurveSpeedController"] else default.get_bool("CurveSpeedController")) - toggle.csc_status = toggle.curve_speed_controller and (params.get_bool("ShowCSCStatus") if tuning_level >= level["ShowCSCStatus"] else default.get_bool("ShowCSCStatus")) or toggle.debug_mode + toggle.curve_speed_controller = toggle.openpilot_longitudinal and (params.get_bool("CurveSpeedController") if toggle.tuning_level >= level["CurveSpeedController"] else default.get_bool("CurveSpeedController")) + toggle.csc_status = toggle.curve_speed_controller and (params.get_bool("ShowCSCStatus") if toggle.tuning_level >= level["ShowCSCStatus"] else default.get_bool("ShowCSCStatus")) or toggle.debug_mode - toggle.custom_alerts = params.get_bool("CustomAlerts") if tuning_level >= level["CustomAlerts"] else default.get_bool("CustomAlerts") - toggle.goat_scream_alert = toggle.custom_alerts and (params.get_bool("GoatScream") if tuning_level >= level["GoatScream"] else default.get_bool("GoatScream")) - toggle.green_light_alert = toggle.custom_alerts and (params.get_bool("GreenLightAlert") if tuning_level >= level["GreenLightAlert"] else default.get_bool("GreenLightAlert")) - toggle.lead_departing_alert = toggle.custom_alerts and (params.get_bool("LeadDepartingAlert") if tuning_level >= level["LeadDepartingAlert"] else default.get_bool("LeadDepartingAlert")) - toggle.loud_blindspot_alert = has_bsm and toggle.custom_alerts and (params.get_bool("LoudBlindspotAlert") if tuning_level >= level["LoudBlindspotAlert"] else default.get_bool("LoudBlindspotAlert")) - toggle.speed_limit_changed_alert = toggle.custom_alerts and (params.get_bool("SpeedLimitChangedAlert") if tuning_level >= level["SpeedLimitChangedAlert"] else default.get_bool("SpeedLimitChangedAlert")) + toggle.custom_alerts = params.get_bool("CustomAlerts") if toggle.tuning_level >= level["CustomAlerts"] else default.get_bool("CustomAlerts") + toggle.goat_scream_alert = toggle.custom_alerts and (params.get_bool("GoatScream") if toggle.tuning_level >= level["GoatScream"] else default.get_bool("GoatScream")) + toggle.green_light_alert = toggle.custom_alerts and (params.get_bool("GreenLightAlert") if toggle.tuning_level >= level["GreenLightAlert"] else default.get_bool("GreenLightAlert")) + toggle.lead_departing_alert = toggle.custom_alerts and (params.get_bool("LeadDepartingAlert") if toggle.tuning_level >= level["LeadDepartingAlert"] else default.get_bool("LeadDepartingAlert")) + toggle.loud_blindspot_alert = has_bsm and toggle.custom_alerts and (params.get_bool("LoudBlindspotAlert") if toggle.tuning_level >= level["LoudBlindspotAlert"] else default.get_bool("LoudBlindspotAlert")) + toggle.speed_limit_changed_alert = toggle.custom_alerts and (params.get_bool("SpeedLimitChangedAlert") if toggle.tuning_level >= level["SpeedLimitChangedAlert"] else default.get_bool("SpeedLimitChangedAlert")) - toggle.custom_personalities = toggle.openpilot_longitudinal and params.get_bool("CustomPersonalities") if tuning_level >= level["CustomPersonalities"] else default.get_bool("CustomPersonalities") - aggressive_profile = toggle.custom_personalities and (params.get_bool("AggressivePersonalityProfile") if tuning_level >= level["AggressivePersonalityProfile"] else default.get_bool("AggressivePersonalityProfile")) - toggle.aggressive_jerk_acceleration = np.clip(params.get_int("AggressiveJerkAcceleration") / 100, 0.25, 2) if aggressive_profile and tuning_level >= level["AggressiveJerkAcceleration"] else default.get_int("AggressiveJerkAcceleration") / 100 - toggle.aggressive_jerk_deceleration = np.clip(params.get_int("AggressiveJerkDeceleration") / 100, 0.25, 2) if aggressive_profile and tuning_level >= level["AggressiveJerkDeceleration"] else default.get_int("AggressiveJerkDeceleration") / 100 - toggle.aggressive_jerk_danger = np.clip(params.get_int("AggressiveJerkDanger") / 100, 0.25, 2) if aggressive_profile and tuning_level >= level["AggressiveJerkDanger"] else default.get_int("AggressiveJerkDanger") / 100 - toggle.aggressive_jerk_speed = np.clip(params.get_int("AggressiveJerkSpeed") / 100, 0.25, 2) if aggressive_profile and tuning_level >= level["AggressiveJerkSpeed"] else default.get_int("AggressiveJerkSpeed") / 100 - toggle.aggressive_jerk_speed_decrease = np.clip(params.get_int("AggressiveJerkSpeedDecrease") / 100, 0.25, 2) if aggressive_profile and tuning_level >= level["AggressiveJerkSpeedDecrease"] else default.get_int("AggressiveJerkSpeedDecrease") / 100 - toggle.aggressive_follow = np.clip(params.get_float("AggressiveFollow"), 1, MAX_T_FOLLOW) if aggressive_profile and tuning_level >= level["AggressiveFollow"] else default.get_float("AggressiveFollow") - standard_profile = toggle.custom_personalities and (params.get_bool("StandardPersonalityProfile") if tuning_level >= level["StandardPersonalityProfile"] else default.get_bool("StandardPersonalityProfile")) - toggle.standard_jerk_acceleration = np.clip(params.get_int("StandardJerkAcceleration") / 100, 0.25, 2) if standard_profile and tuning_level >= level["StandardJerkAcceleration"] else default.get_int("StandardJerkAcceleration") / 100 - toggle.standard_jerk_deceleration = np.clip(params.get_int("StandardJerkDeceleration") / 100, 0.25, 2) if standard_profile and tuning_level >= level["StandardJerkDeceleration"] else default.get_int("StandardJerkDeceleration") / 100 - toggle.standard_jerk_danger = np.clip(params.get_int("StandardJerkDanger") / 100, 0.25, 2) if standard_profile and tuning_level >= level["StandardJerkDanger"] else default.get_int("StandardJerkDanger") / 100 - toggle.standard_jerk_speed = np.clip(params.get_int("StandardJerkSpeed") / 100, 0.25, 2) if standard_profile and tuning_level >= level["StandardJerkSpeed"] else default.get_int("StandardJerkSpeed") / 100 - toggle.standard_jerk_speed_decrease = np.clip(params.get_int("StandardJerkSpeedDecrease") / 100, 0.25, 2) if standard_profile and tuning_level >= level["StandardJerkSpeedDecrease"] else default.get_int("StandardJerkSpeedDecrease") / 100 - toggle.standard_follow = np.clip(params.get_float("StandardFollow"), 1, MAX_T_FOLLOW) if standard_profile and tuning_level >= level["StandardFollow"] else default.get_float("StandardFollow") - relaxed_profile = toggle.custom_personalities and (params.get_bool("RelaxedPersonalityProfile") if tuning_level >= level["RelaxedPersonalityProfile"] else default.get_bool("RelaxedPersonalityProfile")) - toggle.relaxed_jerk_acceleration = np.clip(params.get_int("RelaxedJerkAcceleration") / 100, 0.25, 2) if relaxed_profile and tuning_level >= level["RelaxedJerkAcceleration"] else default.get_int("RelaxedJerkAcceleration") / 100 - toggle.relaxed_jerk_deceleration = np.clip(params.get_int("RelaxedJerkDeceleration") / 100, 0.25, 2) if relaxed_profile and tuning_level >= level["RelaxedJerkDeceleration"] else default.get_int("RelaxedJerkDeceleration") / 100 - toggle.relaxed_jerk_danger = np.clip(params.get_int("RelaxedJerkDanger") / 100, 0.25, 2) if relaxed_profile and tuning_level >= level["RelaxedJerkDanger"] else default.get_int("RelaxedJerkDanger") / 100 - toggle.relaxed_jerk_speed = np.clip(params.get_int("RelaxedJerkSpeed") / 100, 0.25, 2) if relaxed_profile and tuning_level >= level["RelaxedJerkSpeed"] else default.get_int("RelaxedJerkSpeed") / 100 - toggle.relaxed_jerk_speed_decrease = np.clip(params.get_int("RelaxedJerkSpeedDecrease") / 100, 0.25, 2) if relaxed_profile and tuning_level >= level["RelaxedJerkSpeedDecrease"] else default.get_int("RelaxedJerkSpeedDecrease") / 100 - toggle.relaxed_follow = np.clip(params.get_float("RelaxedFollow"), 1, MAX_T_FOLLOW) if relaxed_profile and tuning_level >= level["RelaxedFollow"] else default.get_float("RelaxedFollow") - traffic_profile = toggle.custom_personalities and (params.get_bool("TrafficPersonalityProfile") if tuning_level >= level["TrafficPersonalityProfile"] else default.get_bool("TrafficPersonalityProfile")) - toggle.traffic_mode_jerk_acceleration = [np.clip(params.get_int("TrafficJerkAcceleration") / 100, 0.25, 2) if traffic_profile and tuning_level >= level["TrafficJerkAcceleration"] else default.get_int("TrafficJerkAcceleration") / 100, toggle.aggressive_jerk_acceleration] - toggle.traffic_mode_jerk_deceleration = [np.clip(params.get_int("TrafficJerkDeceleration") / 100, 0.25, 2) if traffic_profile and tuning_level >= level["TrafficJerkDeceleration"] else default.get_int("TrafficJerkDeceleration") / 100, toggle.aggressive_jerk_deceleration] - toggle.traffic_mode_jerk_danger = [np.clip(params.get_int("TrafficJerkDanger") / 100, 0.25, 2) if traffic_profile and tuning_level >= level["TrafficJerkDanger"] else default.get_int("TrafficJerkDanger") / 100, toggle.aggressive_jerk_danger] - toggle.traffic_mode_jerk_speed = [np.clip(params.get_int("TrafficJerkSpeed") / 100, 0.25, 2) if traffic_profile and tuning_level >= level["TrafficJerkSpeed"] else default.get_int("TrafficJerkSpeed") / 100, toggle.aggressive_jerk_speed] - toggle.traffic_mode_jerk_speed_decrease = [np.clip(params.get_int("TrafficJerkSpeedDecrease") / 100, 0.25, 2) if traffic_profile and tuning_level >= level["TrafficJerkSpeedDecrease"] else default.get_int("TrafficJerkSpeedDecrease") / 100, toggle.aggressive_jerk_speed_decrease] - toggle.traffic_mode_follow = [np.clip(params.get_float("TrafficFollow"), 0.5, MAX_T_FOLLOW) if traffic_profile and tuning_level >= level["TrafficFollow"] else default.get_float("TrafficFollow"), toggle.aggressive_follow] + toggle.custom_personalities = toggle.openpilot_longitudinal and params.get_bool("CustomPersonalities") if toggle.tuning_level >= level["CustomPersonalities"] else default.get_bool("CustomPersonalities") + aggressive_profile = toggle.custom_personalities and (params.get_bool("AggressivePersonalityProfile") if toggle.tuning_level >= level["AggressivePersonalityProfile"] else default.get_bool("AggressivePersonalityProfile")) + toggle.aggressive_jerk_acceleration = np.clip(params.get_int("AggressiveJerkAcceleration") / 100, 0.25, 2) if aggressive_profile and toggle.tuning_level >= level["AggressiveJerkAcceleration"] else default.get_int("AggressiveJerkAcceleration") / 100 + toggle.aggressive_jerk_deceleration = np.clip(params.get_int("AggressiveJerkDeceleration") / 100, 0.25, 2) if aggressive_profile and toggle.tuning_level >= level["AggressiveJerkDeceleration"] else default.get_int("AggressiveJerkDeceleration") / 100 + toggle.aggressive_jerk_danger = np.clip(params.get_int("AggressiveJerkDanger") / 100, 0.25, 2) if aggressive_profile and toggle.tuning_level >= level["AggressiveJerkDanger"] else default.get_int("AggressiveJerkDanger") / 100 + toggle.aggressive_jerk_speed = np.clip(params.get_int("AggressiveJerkSpeed") / 100, 0.25, 2) if aggressive_profile and toggle.tuning_level >= level["AggressiveJerkSpeed"] else default.get_int("AggressiveJerkSpeed") / 100 + toggle.aggressive_jerk_speed_decrease = np.clip(params.get_int("AggressiveJerkSpeedDecrease") / 100, 0.25, 2) if aggressive_profile and toggle.tuning_level >= level["AggressiveJerkSpeedDecrease"] else default.get_int("AggressiveJerkSpeedDecrease") / 100 + toggle.aggressive_follow = np.clip(params.get_float("AggressiveFollow"), 1, MAX_T_FOLLOW) if aggressive_profile and toggle.tuning_level >= level["AggressiveFollow"] else default.get_float("AggressiveFollow") + standard_profile = toggle.custom_personalities and (params.get_bool("StandardPersonalityProfile") if toggle.tuning_level >= level["StandardPersonalityProfile"] else default.get_bool("StandardPersonalityProfile")) + toggle.standard_jerk_acceleration = np.clip(params.get_int("StandardJerkAcceleration") / 100, 0.25, 2) if standard_profile and toggle.tuning_level >= level["StandardJerkAcceleration"] else default.get_int("StandardJerkAcceleration") / 100 + toggle.standard_jerk_deceleration = np.clip(params.get_int("StandardJerkDeceleration") / 100, 0.25, 2) if standard_profile and toggle.tuning_level >= level["StandardJerkDeceleration"] else default.get_int("StandardJerkDeceleration") / 100 + toggle.standard_jerk_danger = np.clip(params.get_int("StandardJerkDanger") / 100, 0.25, 2) if standard_profile and toggle.tuning_level >= level["StandardJerkDanger"] else default.get_int("StandardJerkDanger") / 100 + toggle.standard_jerk_speed = np.clip(params.get_int("StandardJerkSpeed") / 100, 0.25, 2) if standard_profile and toggle.tuning_level >= level["StandardJerkSpeed"] else default.get_int("StandardJerkSpeed") / 100 + toggle.standard_jerk_speed_decrease = np.clip(params.get_int("StandardJerkSpeedDecrease") / 100, 0.25, 2) if standard_profile and toggle.tuning_level >= level["StandardJerkSpeedDecrease"] else default.get_int("StandardJerkSpeedDecrease") / 100 + toggle.standard_follow = np.clip(params.get_float("StandardFollow"), 1, MAX_T_FOLLOW) if standard_profile and toggle.tuning_level >= level["StandardFollow"] else default.get_float("StandardFollow") + relaxed_profile = toggle.custom_personalities and (params.get_bool("RelaxedPersonalityProfile") if toggle.tuning_level >= level["RelaxedPersonalityProfile"] else default.get_bool("RelaxedPersonalityProfile")) + toggle.relaxed_jerk_acceleration = np.clip(params.get_int("RelaxedJerkAcceleration") / 100, 0.25, 2) if relaxed_profile and toggle.tuning_level >= level["RelaxedJerkAcceleration"] else default.get_int("RelaxedJerkAcceleration") / 100 + toggle.relaxed_jerk_deceleration = np.clip(params.get_int("RelaxedJerkDeceleration") / 100, 0.25, 2) if relaxed_profile and toggle.tuning_level >= level["RelaxedJerkDeceleration"] else default.get_int("RelaxedJerkDeceleration") / 100 + toggle.relaxed_jerk_danger = np.clip(params.get_int("RelaxedJerkDanger") / 100, 0.25, 2) if relaxed_profile and toggle.tuning_level >= level["RelaxedJerkDanger"] else default.get_int("RelaxedJerkDanger") / 100 + toggle.relaxed_jerk_speed = np.clip(params.get_int("RelaxedJerkSpeed") / 100, 0.25, 2) if relaxed_profile and toggle.tuning_level >= level["RelaxedJerkSpeed"] else default.get_int("RelaxedJerkSpeed") / 100 + toggle.relaxed_jerk_speed_decrease = np.clip(params.get_int("RelaxedJerkSpeedDecrease") / 100, 0.25, 2) if relaxed_profile and toggle.tuning_level >= level["RelaxedJerkSpeedDecrease"] else default.get_int("RelaxedJerkSpeedDecrease") / 100 + toggle.relaxed_follow = np.clip(params.get_float("RelaxedFollow"), 1, MAX_T_FOLLOW) if relaxed_profile and toggle.tuning_level >= level["RelaxedFollow"] else default.get_float("RelaxedFollow") + traffic_profile = toggle.custom_personalities and (params.get_bool("TrafficPersonalityProfile") if toggle.tuning_level >= level["TrafficPersonalityProfile"] else default.get_bool("TrafficPersonalityProfile")) + toggle.traffic_mode_jerk_acceleration = [np.clip(params.get_int("TrafficJerkAcceleration") / 100, 0.25, 2) if traffic_profile and toggle.tuning_level >= level["TrafficJerkAcceleration"] else default.get_int("TrafficJerkAcceleration") / 100, toggle.aggressive_jerk_acceleration] + toggle.traffic_mode_jerk_deceleration = [np.clip(params.get_int("TrafficJerkDeceleration") / 100, 0.25, 2) if traffic_profile and toggle.tuning_level >= level["TrafficJerkDeceleration"] else default.get_int("TrafficJerkDeceleration") / 100, toggle.aggressive_jerk_deceleration] + toggle.traffic_mode_jerk_danger = [np.clip(params.get_int("TrafficJerkDanger") / 100, 0.25, 2) if traffic_profile and toggle.tuning_level >= level["TrafficJerkDanger"] else default.get_int("TrafficJerkDanger") / 100, toggle.aggressive_jerk_danger] + toggle.traffic_mode_jerk_speed = [np.clip(params.get_int("TrafficJerkSpeed") / 100, 0.25, 2) if traffic_profile and toggle.tuning_level >= level["TrafficJerkSpeed"] else default.get_int("TrafficJerkSpeed") / 100, toggle.aggressive_jerk_speed] + toggle.traffic_mode_jerk_speed_decrease = [np.clip(params.get_int("TrafficJerkSpeedDecrease") / 100, 0.25, 2) if traffic_profile and toggle.tuning_level >= level["TrafficJerkSpeedDecrease"] else default.get_int("TrafficJerkSpeedDecrease") / 100, toggle.aggressive_jerk_speed_decrease] + toggle.traffic_mode_follow = [np.clip(params.get_float("TrafficFollow"), 0.5, MAX_T_FOLLOW) if traffic_profile and toggle.tuning_level >= level["TrafficFollow"] else default.get_float("TrafficFollow"), toggle.aggressive_follow] - custom_ui = params.get_bool("CustomUI") if tuning_level >= level["CustomUI"] else default.get_bool("CustomUI") - toggle.acceleration_path = toggle.openpilot_longitudinal and (custom_ui and (params.get_bool("AccelerationPath") if tuning_level >= level["AccelerationPath"] else default.get_bool("AccelerationPath")) or toggle.debug_mode) - toggle.adjacent_paths = custom_ui and (params.get_bool("AdjacentPath") if tuning_level >= level["AdjacentPath"] else default.get_bool("AdjacentPath")) - toggle.blind_spot_path = has_bsm and (custom_ui and (params.get_bool("BlindSpotPath") if tuning_level >= level["BlindSpotPath"] else default.get_bool("BlindSpotPath")) or toggle.debug_mode) - toggle.compass = custom_ui and (params.get_bool("Compass") if tuning_level >= level["Compass"] else default.get_bool("Compass")) - toggle.pedals_on_ui = toggle.openpilot_longitudinal and (custom_ui and (params.get_bool("PedalsOnUI") if tuning_level >= level["PedalsOnUI"] else default.get_bool("PedalsOnUI"))) - toggle.dynamic_pedals_on_ui = toggle.pedals_on_ui and (params.get_bool("DynamicPedalsOnUI") if tuning_level >= level["DynamicPedalsOnUI"] else default.get_bool("DynamicPedalsOnUI")) - toggle.static_pedals_on_ui = toggle.pedals_on_ui and (params.get_bool("StaticPedalsOnUI") if tuning_level >= level["StaticPedalsOnUI"] else default.get_bool("StaticPedalsOnUI")) - toggle.rotating_wheel = custom_ui and (params.get_bool("RotatingWheel") if tuning_level >= level["RotatingWheel"] else default.get_bool("RotatingWheel")) + custom_ui = params.get_bool("CustomUI") if toggle.tuning_level >= level["CustomUI"] else default.get_bool("CustomUI") + toggle.acceleration_path = toggle.openpilot_longitudinal and (custom_ui and (params.get_bool("AccelerationPath") if toggle.tuning_level >= level["AccelerationPath"] else default.get_bool("AccelerationPath")) or toggle.debug_mode) + toggle.adjacent_paths = custom_ui and (params.get_bool("AdjacentPath") if toggle.tuning_level >= level["AdjacentPath"] else default.get_bool("AdjacentPath")) + toggle.blind_spot_path = has_bsm and (custom_ui and (params.get_bool("BlindSpotPath") if toggle.tuning_level >= level["BlindSpotPath"] else default.get_bool("BlindSpotPath")) or toggle.debug_mode) + toggle.compass = custom_ui and (params.get_bool("Compass") if toggle.tuning_level >= level["Compass"] else default.get_bool("Compass")) + toggle.pedals_on_ui = toggle.openpilot_longitudinal and (custom_ui and (params.get_bool("PedalsOnUI") if toggle.tuning_level >= level["PedalsOnUI"] else default.get_bool("PedalsOnUI"))) + toggle.dynamic_pedals_on_ui = toggle.pedals_on_ui and (params.get_bool("DynamicPedalsOnUI") if toggle.tuning_level >= level["DynamicPedalsOnUI"] else default.get_bool("DynamicPedalsOnUI")) + toggle.static_pedals_on_ui = toggle.pedals_on_ui and (params.get_bool("StaticPedalsOnUI") if toggle.tuning_level >= level["StaticPedalsOnUI"] else default.get_bool("StaticPedalsOnUI")) + toggle.rotating_wheel = custom_ui and (params.get_bool("RotatingWheel") if toggle.tuning_level >= level["RotatingWheel"] else default.get_bool("RotatingWheel")) - toggle.developer_ui = params.get_bool("DeveloperUI") if tuning_level >= level["DeveloperUI"] else default.get_bool("DeveloperUI") - developer_metrics = toggle.developer_ui and params.get_bool("DeveloperMetrics") if tuning_level >= level["DeveloperMetrics"] else default.get_bool("DeveloperMetrics") - border_metrics = developer_metrics and (params.get_bool("BorderMetrics") if tuning_level >= level["BorderMetrics"] else default.get_bool("BorderMetrics")) - toggle.blind_spot_metrics = has_bsm and border_metrics and (params.get_bool("BlindSpotMetrics") if tuning_level >= level["BlindSpotMetrics"] else default.get_bool("BlindSpotMetrics")) or toggle.debug_mode - toggle.signal_metrics = border_metrics and (params.get_bool("SignalMetrics") if tuning_level >= level["SignalMetrics"] else default.get_bool("SignalMetrics")) or toggle.debug_mode - toggle.steering_metrics = border_metrics and (params.get_bool("ShowSteering") if tuning_level >= level["ShowSteering"] else default.get_bool("ShowSteering")) or toggle.debug_mode - toggle.show_fps = developer_metrics and (params.get_bool("FPSCounter") if tuning_level >= level["FPSCounter"] else default.get_bool("FPSCounter")) or toggle.debug_mode - toggle.adjacent_path_metrics = (developer_metrics and params.get_bool("AdjacentPathMetrics") if tuning_level >= level["AdjacentPathMetrics"] else default.get_bool("AdjacentPathMetrics")) or toggle.debug_mode - toggle.lead_metrics = (developer_metrics and params.get_bool("LeadInfo") if tuning_level >= level["LeadInfo"] else default.get_bool("LeadInfo")) or toggle.debug_mode - toggle.numerical_temp = developer_metrics and (params.get_bool("NumericalTemp") if tuning_level >= level["NumericalTemp"] else default.get_bool("NumericalTemp")) or toggle.debug_mode - toggle.fahrenheit = toggle.numerical_temp and (params.get_bool("Fahrenheit") if tuning_level >= level["Fahrenheit"] else default.get_bool("Fahrenheit")) and not toggle.debug_mode - toggle.cpu_metrics = developer_metrics and (params.get_bool("ShowCPU") if tuning_level >= level["ShowCPU"] else default.get_bool("ShowCPU")) or toggle.debug_mode - toggle.gpu_metrics = developer_metrics and (params.get_bool("ShowGPU") if tuning_level >= level["ShowGPU"] else default.get_bool("ShowGPU")) and not toggle.debug_mode - toggle.ip_metrics = developer_metrics and (params.get_bool("ShowIP") if tuning_level >= level["ShowIP"] else default.get_bool("ShowIP")) - toggle.memory_metrics = developer_metrics and (params.get_bool("ShowMemoryUsage") if tuning_level >= level["ShowMemoryUsage"] else default.get_bool("ShowMemoryUsage")) or toggle.debug_mode - toggle.storage_left_metrics = developer_metrics and (params.get_bool("ShowStorageLeft") if tuning_level >= level["ShowStorageLeft"] else default.get_bool("ShowStorageLeft")) and not toggle.debug_mode - toggle.storage_used_metrics = developer_metrics and (params.get_bool("ShowStorageUsed") if tuning_level >= level["ShowStorageUsed"] else default.get_bool("ShowStorageUsed")) and not toggle.debug_mode - toggle.use_si_metrics = developer_metrics and (params.get_bool("UseSI") if tuning_level >= level["UseSI"] else default.get_bool("UseSI")) or toggle.debug_mode - toggle.developer_sidebar = toggle.developer_ui and (params.get_bool("DeveloperSidebar") if tuning_level >= level["DeveloperSidebar"] else default.get_bool("DeveloperSidebar")) or toggle.debug_mode - toggle.developer_sidebar_metric1 = params.get_int("DeveloperSidebarMetric1") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric1"] else DEVELOPER_SIDEBAR_METRICS["ACCELERATION_CURRENT"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric1") - toggle.developer_sidebar_metric2 = params.get_int("DeveloperSidebarMetric2") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric2"] else DEVELOPER_SIDEBAR_METRICS["AUTOTUNE_ACTUATOR_DELAY"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric2") - toggle.developer_sidebar_metric3 = params.get_int("DeveloperSidebarMetric3") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric3"] else DEVELOPER_SIDEBAR_METRICS["AUTOTUNE_FRICTION"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric3") - toggle.developer_sidebar_metric4 = params.get_int("DeveloperSidebarMetric4") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric4"] else DEVELOPER_SIDEBAR_METRICS["AUTOTUNE_LATERAL_ACCELERATION"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric4") - toggle.developer_sidebar_metric5 = params.get_int("DeveloperSidebarMetric5") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric5"] else DEVELOPER_SIDEBAR_METRICS["AUTOTUNE_STEER_RATIO"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric5") - toggle.developer_sidebar_metric6 = params.get_int("DeveloperSidebarMetric6") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric6"] else DEVELOPER_SIDEBAR_METRICS["AUTOTUNE_STIFFNESS_FACTOR"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric6") - toggle.developer_sidebar_metric7 = params.get_int("DeveloperSidebarMetric7") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric7"] else DEVELOPER_SIDEBAR_METRICS["LATERAL_TORQUE_USED"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric7") - developer_widgets = toggle.developer_ui and params.get_bool("DeveloperWidgets") if tuning_level >= level["DeveloperWidgets"] else default.get_bool("DeveloperWidgets") - toggle.adjacent_lead_tracking = has_radar and ((developer_widgets and params.get_bool("AdjacentLeadsUI") if tuning_level >= level["AdjacentLeadsUI"] else default.get_bool("AdjacentLeadsUI")) or toggle.debug_mode) - toggle.radar_tracks = has_radar and ((developer_widgets and params.get_bool("RadarTracksUI") if tuning_level >= level["RadarTracksUI"] else default.get_bool("RadarTracksUI")) or toggle.debug_mode) - toggle.show_stopping_point = toggle.openpilot_longitudinal and (developer_widgets and (params.get_bool("ShowStoppingPoint") if tuning_level >= level["ShowStoppingPoint"] else default.get_bool("ShowStoppingPoint")) or toggle.debug_mode) - toggle.show_stopping_point_metrics = toggle.show_stopping_point and (params.get_bool("ShowStoppingPointMetrics") if tuning_level >= level["ShowStoppingPointMetrics"] else default.get_bool("ShowStoppingPointMetrics") or toggle.debug_mode) + toggle.developer_ui = params.get_bool("DeveloperUI") if toggle.tuning_level >= level["DeveloperUI"] else default.get_bool("DeveloperUI") + developer_metrics = toggle.developer_ui and params.get_bool("DeveloperMetrics") if toggle.tuning_level >= level["DeveloperMetrics"] else default.get_bool("DeveloperMetrics") + border_metrics = developer_metrics and (params.get_bool("BorderMetrics") if toggle.tuning_level >= level["BorderMetrics"] else default.get_bool("BorderMetrics")) + toggle.blind_spot_metrics = has_bsm and border_metrics and (params.get_bool("BlindSpotMetrics") if toggle.tuning_level >= level["BlindSpotMetrics"] else default.get_bool("BlindSpotMetrics")) or toggle.debug_mode + toggle.signal_metrics = border_metrics and (params.get_bool("SignalMetrics") if toggle.tuning_level >= level["SignalMetrics"] else default.get_bool("SignalMetrics")) or toggle.debug_mode + toggle.steering_metrics = border_metrics and (params.get_bool("ShowSteering") if toggle.tuning_level >= level["ShowSteering"] else default.get_bool("ShowSteering")) or toggle.debug_mode + toggle.show_fps = developer_metrics and (params.get_bool("FPSCounter") if toggle.tuning_level >= level["FPSCounter"] else default.get_bool("FPSCounter")) or toggle.debug_mode + toggle.adjacent_path_metrics = (developer_metrics and params.get_bool("AdjacentPathMetrics") if toggle.tuning_level >= level["AdjacentPathMetrics"] else default.get_bool("AdjacentPathMetrics")) or toggle.debug_mode + toggle.lead_metrics = (developer_metrics and params.get_bool("LeadInfo") if toggle.tuning_level >= level["LeadInfo"] else default.get_bool("LeadInfo")) or toggle.debug_mode + toggle.numerical_temp = developer_metrics and (params.get_bool("NumericalTemp") if toggle.tuning_level >= level["NumericalTemp"] else default.get_bool("NumericalTemp")) or toggle.debug_mode + toggle.fahrenheit = toggle.numerical_temp and (params.get_bool("Fahrenheit") if toggle.tuning_level >= level["Fahrenheit"] else default.get_bool("Fahrenheit")) and not toggle.debug_mode + toggle.cpu_metrics = developer_metrics and (params.get_bool("ShowCPU") if toggle.tuning_level >= level["ShowCPU"] else default.get_bool("ShowCPU")) or toggle.debug_mode + toggle.gpu_metrics = developer_metrics and (params.get_bool("ShowGPU") if toggle.tuning_level >= level["ShowGPU"] else default.get_bool("ShowGPU")) and not toggle.debug_mode + toggle.ip_metrics = developer_metrics and (params.get_bool("ShowIP") if toggle.tuning_level >= level["ShowIP"] else default.get_bool("ShowIP")) + toggle.memory_metrics = developer_metrics and (params.get_bool("ShowMemoryUsage") if toggle.tuning_level >= level["ShowMemoryUsage"] else default.get_bool("ShowMemoryUsage")) or toggle.debug_mode + toggle.storage_left_metrics = developer_metrics and (params.get_bool("ShowStorageLeft") if toggle.tuning_level >= level["ShowStorageLeft"] else default.get_bool("ShowStorageLeft")) and not toggle.debug_mode + toggle.storage_used_metrics = developer_metrics and (params.get_bool("ShowStorageUsed") if toggle.tuning_level >= level["ShowStorageUsed"] else default.get_bool("ShowStorageUsed")) and not toggle.debug_mode + toggle.use_si_metrics = developer_metrics and (params.get_bool("UseSI") if toggle.tuning_level >= level["UseSI"] else default.get_bool("UseSI")) or toggle.debug_mode + toggle.developer_sidebar = toggle.developer_ui and (params.get_bool("DeveloperSidebar") if toggle.tuning_level >= level["DeveloperSidebar"] else default.get_bool("DeveloperSidebar")) or toggle.debug_mode + toggle.developer_sidebar_metric1 = params.get_int("DeveloperSidebarMetric1") if toggle.developer_sidebar and toggle.tuning_level >= level["DeveloperSidebarMetric1"] else DEVELOPER_SIDEBAR_METRICS["ACCELERATION_CURRENT"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric1") + toggle.developer_sidebar_metric2 = params.get_int("DeveloperSidebarMetric2") if toggle.developer_sidebar and toggle.tuning_level >= level["DeveloperSidebarMetric2"] else DEVELOPER_SIDEBAR_METRICS["AUTOTUNE_ACTUATOR_DELAY"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric2") + toggle.developer_sidebar_metric3 = params.get_int("DeveloperSidebarMetric3") if toggle.developer_sidebar and toggle.tuning_level >= level["DeveloperSidebarMetric3"] else DEVELOPER_SIDEBAR_METRICS["AUTOTUNE_FRICTION"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric3") + toggle.developer_sidebar_metric4 = params.get_int("DeveloperSidebarMetric4") if toggle.developer_sidebar and toggle.tuning_level >= level["DeveloperSidebarMetric4"] else DEVELOPER_SIDEBAR_METRICS["AUTOTUNE_LATERAL_ACCELERATION"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric4") + toggle.developer_sidebar_metric5 = params.get_int("DeveloperSidebarMetric5") if toggle.developer_sidebar and toggle.tuning_level >= level["DeveloperSidebarMetric5"] else DEVELOPER_SIDEBAR_METRICS["AUTOTUNE_STEER_RATIO"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric5") + toggle.developer_sidebar_metric6 = params.get_int("DeveloperSidebarMetric6") if toggle.developer_sidebar and toggle.tuning_level >= level["DeveloperSidebarMetric6"] else DEVELOPER_SIDEBAR_METRICS["AUTOTUNE_STIFFNESS_FACTOR"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric6") + toggle.developer_sidebar_metric7 = params.get_int("DeveloperSidebarMetric7") if toggle.developer_sidebar and toggle.tuning_level >= level["DeveloperSidebarMetric7"] else DEVELOPER_SIDEBAR_METRICS["LATERAL_TORQUE_USED"] if toggle.debug_mode else default.get_int("DeveloperSidebarMetric7") + developer_widgets = toggle.developer_ui and params.get_bool("DeveloperWidgets") if toggle.tuning_level >= level["DeveloperWidgets"] else default.get_bool("DeveloperWidgets") + toggle.adjacent_lead_tracking = has_radar and ((developer_widgets and params.get_bool("AdjacentLeadsUI") if toggle.tuning_level >= level["AdjacentLeadsUI"] else default.get_bool("AdjacentLeadsUI")) or toggle.debug_mode) + toggle.radar_tracks = has_radar and ((developer_widgets and params.get_bool("RadarTracksUI") if toggle.tuning_level >= level["RadarTracksUI"] else default.get_bool("RadarTracksUI")) or toggle.debug_mode) + toggle.show_stopping_point = toggle.openpilot_longitudinal and (developer_widgets and (params.get_bool("ShowStoppingPoint") if toggle.tuning_level >= level["ShowStoppingPoint"] else default.get_bool("ShowStoppingPoint")) or toggle.debug_mode) + toggle.show_stopping_point_metrics = toggle.show_stopping_point and (params.get_bool("ShowStoppingPointMetrics") if toggle.tuning_level >= level["ShowStoppingPointMetrics"] else default.get_bool("ShowStoppingPointMetrics") or toggle.debug_mode) - device_management = params.get_bool("DeviceManagement") if tuning_level >= level["DeviceManagement"] else default.get_bool("DeviceManagement") - device_shutdown_setting = params.get_int("DeviceShutdown") if device_management and tuning_level >= level["DeviceShutdown"] else default.get_int("DeviceShutdown") + device_management = params.get_bool("DeviceManagement") if toggle.tuning_level >= level["DeviceManagement"] else default.get_bool("DeviceManagement") + device_shutdown_setting = params.get_int("DeviceShutdown") if device_management and toggle.tuning_level >= level["DeviceShutdown"] else default.get_int("DeviceShutdown") toggle.device_shutdown_time = (device_shutdown_setting - 3) * 3600 if device_shutdown_setting >= 4 else device_shutdown_setting * (60 * 15) - toggle.increase_thermal_limits = device_management and (params.get_bool("IncreaseThermalLimits") if tuning_level >= level["IncreaseThermalLimits"] else default.get_bool("IncreaseThermalLimits")) - toggle.low_voltage_shutdown = np.clip(params.get_float("LowVoltageShutdown"), VBATT_PAUSE_CHARGING, 12.5) if device_management and tuning_level >= level["LowVoltageShutdown"] else default.get_float("LowVoltageShutdown") - toggle.no_logging = device_management and (params.get_bool("NoLogging") if tuning_level >= level["NoLogging"] else default.get_bool("NoLogging")) and not self.vetting_branch or toggle.force_onroad - toggle.no_uploads = device_management and (params.get_bool("NoUploads") if tuning_level >= level["NoUploads"] else default.get_bool("NoUploads")) and not self.vetting_branch or toggle.use_higher_bitrate - toggle.no_onroad_uploads = toggle.no_uploads and (params.get_bool("DisableOnroadUploads") if tuning_level >= level["DisableOnroadUploads"] else default.get_bool("DisableOnroadUploads")) and not toggle.use_higher_bitrate + toggle.increase_thermal_limits = device_management and (params.get_bool("IncreaseThermalLimits") if toggle.tuning_level >= level["IncreaseThermalLimits"] else default.get_bool("IncreaseThermalLimits")) + toggle.low_voltage_shutdown = np.clip(params.get_float("LowVoltageShutdown"), VBATT_PAUSE_CHARGING, 12.5) if device_management and toggle.tuning_level >= level["LowVoltageShutdown"] else default.get_float("LowVoltageShutdown") + toggle.no_logging = device_management and (params.get_bool("NoLogging") if toggle.tuning_level >= level["NoLogging"] else default.get_bool("NoLogging")) and not self.vetting_branch or toggle.force_onroad + toggle.no_uploads = device_management and (params.get_bool("NoUploads") if toggle.tuning_level >= level["NoUploads"] else default.get_bool("NoUploads")) and not self.vetting_branch or toggle.use_higher_bitrate + toggle.no_onroad_uploads = toggle.no_uploads and (params.get_bool("DisableOnroadUploads") if toggle.tuning_level >= level["DisableOnroadUploads"] else default.get_bool("DisableOnroadUploads")) and not toggle.use_higher_bitrate - distance_button_control = params.get_int("DistanceButtonControl") if tuning_level >= level["DistanceButtonControl"] else default.get_int("DistanceButtonControl") + distance_button_control = params.get_int("DistanceButtonControl") if toggle.tuning_level >= level["DistanceButtonControl"] else default.get_int("DistanceButtonControl") toggle.experimental_mode_via_distance = toggle.openpilot_longitudinal and distance_button_control == BUTTON_FUNCTIONS["EXPERIMENTAL_MODE"] toggle.experimental_mode_via_press = toggle.experimental_mode_via_distance toggle.force_coast_via_distance = toggle.openpilot_longitudinal and distance_button_control == BUTTON_FUNCTIONS["FORCE_COAST"] @@ -818,7 +817,7 @@ class FrogPilotVariables: toggle.personality_profile_via_distance = toggle.openpilot_longitudinal and distance_button_control == BUTTON_FUNCTIONS["PERSONALITY_PROFILE"] toggle.traffic_mode_via_distance = toggle.openpilot_longitudinal and distance_button_control == BUTTON_FUNCTIONS["TRAFFIC_MODE"] - distance_button_control_long = params.get_int("LongDistanceButtonControl") if tuning_level >= level["LongDistanceButtonControl"] else default.get_int("LongDistanceButtonControl") + distance_button_control_long = params.get_int("LongDistanceButtonControl") if toggle.tuning_level >= level["LongDistanceButtonControl"] else default.get_int("LongDistanceButtonControl") toggle.experimental_mode_via_distance_long = toggle.openpilot_longitudinal and distance_button_control_long == BUTTON_FUNCTIONS["EXPERIMENTAL_MODE"] toggle.experimental_mode_via_press |= toggle.experimental_mode_via_distance_long toggle.force_coast_via_distance_long = toggle.openpilot_longitudinal and distance_button_control_long == BUTTON_FUNCTIONS["FORCE_COAST"] @@ -827,7 +826,7 @@ class FrogPilotVariables: toggle.personality_profile_via_distance_long = toggle.openpilot_longitudinal and distance_button_control_long == BUTTON_FUNCTIONS["PERSONALITY_PROFILE"] toggle.traffic_mode_via_distance_long = toggle.openpilot_longitudinal and distance_button_control_long == BUTTON_FUNCTIONS["TRAFFIC_MODE"] - distance_button_control_very_long = params.get_int("VeryLongDistanceButtonControl") if tuning_level >= level["VeryLongDistanceButtonControl"] else default.get_int("VeryLongDistanceButtonControl") + distance_button_control_very_long = params.get_int("VeryLongDistanceButtonControl") if toggle.tuning_level >= level["VeryLongDistanceButtonControl"] else default.get_int("VeryLongDistanceButtonControl") toggle.experimental_mode_via_distance_very_long = toggle.openpilot_longitudinal and distance_button_control_very_long == BUTTON_FUNCTIONS["EXPERIMENTAL_MODE"] toggle.experimental_mode_via_press |= toggle.experimental_mode_via_distance_very_long toggle.force_coast_via_distance_very_long = toggle.openpilot_longitudinal and distance_button_control_very_long == BUTTON_FUNCTIONS["FORCE_COAST"] @@ -836,40 +835,40 @@ class FrogPilotVariables: toggle.personality_profile_via_distance_very_long = toggle.openpilot_longitudinal and distance_button_control_very_long == BUTTON_FUNCTIONS["PERSONALITY_PROFILE"] toggle.traffic_mode_via_distance_very_long = toggle.openpilot_longitudinal and distance_button_control_very_long == BUTTON_FUNCTIONS["TRAFFIC_MODE"] - toggle.experimental_gm_tune = toggle.openpilot_longitudinal and toggle.car_make == "gm" and (params.get_bool("ExperimentalGMTune") if tuning_level >= level["ExperimentalGMTune"] else default.get_bool("ExperimentalGMTune")) + toggle.experimental_gm_tune = toggle.openpilot_longitudinal and toggle.car_make == "gm" and (params.get_bool("ExperimentalGMTune") if toggle.tuning_level >= level["ExperimentalGMTune"] else default.get_bool("ExperimentalGMTune")) toggle.stoppingDecelRate = 0.3 if toggle.experimental_gm_tune else toggle.stoppingDecelRate toggle.vEgoStarting = 0.15 if toggle.experimental_gm_tune else toggle.vEgoStarting toggle.vEgoStopping = 0.15 if toggle.experimental_gm_tune else toggle.vEgoStopping - toggle.force_fingerprint = (params.get_bool("ForceFingerprint") if tuning_level >= level["ForceFingerprint"] else default.get_bool("ForceFingerprint")) and toggle.car_model is not None + toggle.force_fingerprint = (params.get_bool("ForceFingerprint") if toggle.tuning_level >= level["ForceFingerprint"] else default.get_bool("ForceFingerprint")) and toggle.car_model is not None - toggle.frogsgomoo_tweak = toggle.openpilot_longitudinal and toggle.car_make == "toyota" and (params.get_bool("FrogsGoMoosTweak") if tuning_level >= level["FrogsGoMoosTweak"] else default.get_bool("FrogsGoMoosTweak")) + toggle.frogsgomoo_tweak = toggle.openpilot_longitudinal and toggle.car_make == "toyota" and (params.get_bool("FrogsGoMoosTweak") if toggle.tuning_level >= level["FrogsGoMoosTweak"] else default.get_bool("FrogsGoMoosTweak")) toggle.stoppingDecelRate = 0.01 if toggle.frogsgomoo_tweak else toggle.stoppingDecelRate toggle.vEgoStarting = 0.1 if toggle.frogsgomoo_tweak else toggle.vEgoStarting toggle.vEgoStopping = 0.5 if toggle.frogsgomoo_tweak else toggle.vEgoStopping - toggle.holiday_themes = params.get_bool("HolidayThemes") if tuning_level >= level["HolidayThemes"] else default.get_bool("HolidayThemes") + toggle.holiday_themes = params.get_bool("HolidayThemes") if toggle.tuning_level >= level["HolidayThemes"] else default.get_bool("HolidayThemes") toggle.current_holiday_theme = holiday_theme if toggle.holiday_themes else "stock" - toggle.honda_alt_Tune = toggle.openpilot_longitudinal and toggle.car_make == "honda" and honda_nidec and (params.get_bool("HondaAltTune") if tuning_level >= level["HondaAltTune"] else default.get_bool("HondaAltTune")) - toggle.honda_low_speed_pedal = toggle.openpilot_longitudinal and toggle.car_make == "honda" and toggle.has_pedal and (params.get_bool("HondaLowSpeedPedal") if tuning_level >= level["HondaLowSpeedPedal"] else default.get_bool("HondaLowSpeedPedal")) - toggle.honda_nidec_max_brake = toggle.openpilot_longitudinal and toggle.car_make == "honda" and honda_nidec and (params.get_bool("HondaMaxBrake") if tuning_level >= level["HondaMaxBrake"] else default.get_bool("HondaMaxBrake")) + toggle.honda_alt_Tune = toggle.openpilot_longitudinal and toggle.car_make == "honda" and honda_nidec and (params.get_bool("HondaAltTune") if toggle.tuning_level >= level["HondaAltTune"] else default.get_bool("HondaAltTune")) + toggle.honda_low_speed_pedal = toggle.openpilot_longitudinal and toggle.car_make == "honda" and toggle.has_pedal and (params.get_bool("HondaLowSpeedPedal") if toggle.tuning_level >= level["HondaLowSpeedPedal"] else default.get_bool("HondaLowSpeedPedal")) + toggle.honda_nidec_max_brake = toggle.openpilot_longitudinal and toggle.car_make == "honda" and honda_nidec and (params.get_bool("HondaMaxBrake") if toggle.tuning_level >= level["HondaMaxBrake"] else default.get_bool("HondaMaxBrake")) - toggle.lane_changes = params.get_bool("LaneChanges") if tuning_level >= level["LaneChanges"] else default.get_bool("LaneChanges") - toggle.lane_change_delay = params.get_float("LaneChangeTime") if toggle.lane_changes and tuning_level >= level["LaneChangeTime"] else default.get_float("LaneChangeTime") - toggle.lane_detection_width = params.get_float("LaneDetectionWidth") * distance_conversion if toggle.lane_changes and tuning_level >= level["LaneDetectionWidth"] else default.get_float("LaneDetectionWidth") * CV.FOOT_TO_METER + toggle.lane_changes = params.get_bool("LaneChanges") if toggle.tuning_level >= level["LaneChanges"] else default.get_bool("LaneChanges") + toggle.lane_change_delay = params.get_float("LaneChangeTime") if toggle.lane_changes and toggle.tuning_level >= level["LaneChangeTime"] else default.get_float("LaneChangeTime") + toggle.lane_detection_width = params.get_float("LaneDetectionWidth") * distance_conversion if toggle.lane_changes and toggle.tuning_level >= level["LaneDetectionWidth"] else default.get_float("LaneDetectionWidth") * CV.FOOT_TO_METER toggle.lane_detection = toggle.lane_detection_width > 0 - toggle.minimum_lane_change_speed = params.get_float("MinimumLaneChangeSpeed") * speed_conversion if toggle.lane_changes and tuning_level >= level["MinimumLaneChangeSpeed"] else default.get_float("MinimumLaneChangeSpeed") * CV.MPH_TO_MS - toggle.nudgeless = toggle.lane_changes and (params.get_bool("NudgelessLaneChange") if tuning_level >= level["NudgelessLaneChange"] else default.get_bool("NudgelessLaneChange")) - toggle.one_lane_change = toggle.lane_changes and (params.get_bool("OneLaneChange") if tuning_level >= level["OneLaneChange"] else default.get_bool("OneLaneChange")) + toggle.minimum_lane_change_speed = params.get_float("MinimumLaneChangeSpeed") * speed_conversion if toggle.lane_changes and toggle.tuning_level >= level["MinimumLaneChangeSpeed"] else default.get_float("MinimumLaneChangeSpeed") * CV.MPH_TO_MS + toggle.nudgeless = toggle.lane_changes and (params.get_bool("NudgelessLaneChange") if toggle.tuning_level >= level["NudgelessLaneChange"] else default.get_bool("NudgelessLaneChange")) + toggle.one_lane_change = toggle.lane_changes and (params.get_bool("OneLaneChange") if toggle.tuning_level >= level["OneLaneChange"] else default.get_bool("OneLaneChange")) - lateral_tuning = params.get_bool("LateralTune") if tuning_level >= level["LateralTune"] else default.get_bool("LateralTune") - toggle.force_torque_controller = lateral_tuning and not is_torque_car and (params.get_bool("ForceTorqueController") if tuning_level >= level["ForceTorqueController"] else default.get_bool("ForceTorqueController")) - toggle.nnff = lateral_tuning and has_nnff and not is_angle_car and (params.get_bool("NNFF") if tuning_level >= level["NNFF"] else default.get_bool("NNFF")) - toggle.nnff_lite = not toggle.nnff and lateral_tuning and not is_angle_car and (params.get_bool("NNFFLite") if tuning_level >= level["NNFFLite"] else default.get_bool("NNFFLite")) - toggle.use_turn_desires = lateral_tuning and (params.get_bool("TurnDesires") if tuning_level >= level["TurnDesires"] else default.get_bool("TurnDesires")) + lateral_tuning = params.get_bool("LateralTune") if toggle.tuning_level >= level["LateralTune"] else default.get_bool("LateralTune") + toggle.force_torque_controller = lateral_tuning and not is_torque_car and (params.get_bool("ForceTorqueController") if toggle.tuning_level >= level["ForceTorqueController"] else default.get_bool("ForceTorqueController")) + toggle.nnff = lateral_tuning and has_nnff and not is_angle_car and (params.get_bool("NNFF") if toggle.tuning_level >= level["NNFF"] else default.get_bool("NNFF")) + toggle.nnff_lite = not toggle.nnff and lateral_tuning and not is_angle_car and (params.get_bool("NNFFLite") if toggle.tuning_level >= level["NNFFLite"] else default.get_bool("NNFFLite")) + toggle.use_turn_desires = lateral_tuning and (params.get_bool("TurnDesires") if toggle.tuning_level >= level["TurnDesires"] else default.get_bool("TurnDesires")) - lkas_button_control = (params.get_int("LKASButtonControl") if tuning_level >= level["LKASButtonControl"] else default.get_int("LKASButtonControl")) if toggle.car_make != "subaru" else 0 + lkas_button_control = (params.get_int("LKASButtonControl") if toggle.tuning_level >= level["LKASButtonControl"] else default.get_int("LKASButtonControl")) if toggle.car_make != "subaru" else 0 toggle.experimental_mode_via_lkas = toggle.openpilot_longitudinal and lkas_button_control == BUTTON_FUNCTIONS["EXPERIMENTAL_MODE"] toggle.experimental_mode_via_press |= toggle.experimental_mode_via_lkas toggle.force_coast_via_lkas = toggle.openpilot_longitudinal and lkas_button_control == BUTTON_FUNCTIONS["FORCE_COAST"] @@ -878,24 +877,24 @@ class FrogPilotVariables: toggle.personality_profile_via_lkas = toggle.openpilot_longitudinal and lkas_button_control == BUTTON_FUNCTIONS["PERSONALITY_PROFILE"] toggle.traffic_mode_via_lkas = toggle.openpilot_longitudinal and lkas_button_control == BUTTON_FUNCTIONS["TRAFFIC_MODE"] - toggle.lock_doors_timer = params.get_int("LockDoorsTimer") if toggle.car_make == "toyota" and tuning_level >= level["LockDoorsTimer"] else default.get_int("LockDoorsTimer") + toggle.lock_doors_timer = params.get_int("LockDoorsTimer") if toggle.car_make == "toyota" and toggle.tuning_level >= level["LockDoorsTimer"] else default.get_int("LockDoorsTimer") - toggle.long_pitch = toggle.openpilot_longitudinal and toggle.car_make == "gm" and (params.get_bool("LongPitch") if tuning_level >= level["LongPitch"] else default.get_bool("LongPitch")) + toggle.long_pitch = toggle.openpilot_longitudinal and toggle.car_make == "gm" and (params.get_bool("LongPitch") if toggle.tuning_level >= level["LongPitch"] else default.get_bool("LongPitch")) - longitudinal_tuning = toggle.openpilot_longitudinal and (params.get_bool("LongitudinalTune") if tuning_level >= level["LongitudinalTune"] else default.get_bool("LongitudinalTune")) - toggle.acceleration_profile = params.get_int("AccelerationProfile") if longitudinal_tuning and tuning_level >= level["AccelerationProfile"] else default.get_int("AccelerationProfile") - toggle.deceleration_profile = params.get_int("DecelerationProfile") if longitudinal_tuning and tuning_level >= level["DecelerationProfile"] else default.get_int("DecelerationProfile") - toggle.human_acceleration = longitudinal_tuning and (params.get_bool("HumanAcceleration") if tuning_level >= level["HumanAcceleration"] else default.get_bool("HumanAcceleration")) - toggle.human_following = longitudinal_tuning and (params.get_bool("HumanFollowing") if tuning_level >= level["HumanFollowing"] else default.get_bool("HumanFollowing")) - toggle.human_lane_changes = longitudinal_tuning and has_radar and (params.get_bool("HumanLaneChanges") if tuning_level >= level["HumanLaneChanges"] else default.get_bool("HumanLaneChanges")) - toggle.lead_detection_probability = np.clip(params.get_int("LeadDetectionThreshold") / 100, 0.25, 0.50) if longitudinal_tuning and tuning_level >= level["LeadDetectionThreshold"] else default.get_int("LeadDetectionThreshold") / 100 - toggle.taco_tune = longitudinal_tuning and (params.get_bool("TacoTune") if tuning_level >= level["TacoTune"] else default.get_bool("TacoTune")) + longitudinal_tuning = toggle.openpilot_longitudinal and (params.get_bool("LongitudinalTune") if toggle.tuning_level >= level["LongitudinalTune"] else default.get_bool("LongitudinalTune")) + toggle.acceleration_profile = params.get_int("AccelerationProfile") if longitudinal_tuning and toggle.tuning_level >= level["AccelerationProfile"] else default.get_int("AccelerationProfile") + toggle.deceleration_profile = params.get_int("DecelerationProfile") if longitudinal_tuning and toggle.tuning_level >= level["DecelerationProfile"] else default.get_int("DecelerationProfile") + toggle.human_acceleration = longitudinal_tuning and (params.get_bool("HumanAcceleration") if toggle.tuning_level >= level["HumanAcceleration"] else default.get_bool("HumanAcceleration")) + toggle.human_following = longitudinal_tuning and (params.get_bool("HumanFollowing") if toggle.tuning_level >= level["HumanFollowing"] else default.get_bool("HumanFollowing")) + toggle.human_lane_changes = longitudinal_tuning and has_radar and (params.get_bool("HumanLaneChanges") if toggle.tuning_level >= level["HumanLaneChanges"] else default.get_bool("HumanLaneChanges")) + toggle.lead_detection_probability = np.clip(params.get_int("LeadDetectionThreshold") / 100, 0.25, 0.50) if longitudinal_tuning and toggle.tuning_level >= level["LeadDetectionThreshold"] else default.get_int("LeadDetectionThreshold") / 100 + toggle.taco_tune = longitudinal_tuning and (params.get_bool("TacoTune") if toggle.tuning_level >= level["TacoTune"] else default.get_bool("TacoTune")) toggle.available_models = (params.get("AvailableModels", encoding="utf-8") or "") + f",{DEFAULT_MODEL}" toggle.available_model_names = (params.get("AvailableModelNames", encoding="utf-8") or "") + f",{DEFAULT_MODEL_NAME}" downloaded_models = [model for model in toggle.available_models.split(",") if (MODELS_PATH / f"{model}.thneed").is_file() or all((MODELS_PATH / f"{model}_{filename}").is_file() for filename, _ in TINYGRAD_FILES)] model_versions = (params.get("ModelVersions", encoding="utf-8") or "") + f",{DEFAULT_MODEL_VERSION}" - toggle.model_randomizer = params.get_bool("ModelRandomizer") if tuning_level >= level["ModelRandomizer"] else default.get_bool("ModelRandomizer") + toggle.model_randomizer = params.get_bool("ModelRandomizer") if toggle.tuning_level >= level["ModelRandomizer"] else default.get_bool("ModelRandomizer") if toggle.model_randomizer: if not started: blacklisted_models = (params.get("BlacklistedModels", encoding="utf-8") or "").split(",") @@ -904,7 +903,7 @@ class FrogPilotVariables: toggle.model_name = "Mystery Model 👻" toggle.model_version = dict(zip(toggle.available_models.split(","), model_versions.split(","))).get(toggle.model, DEFAULT_MODEL_VERSION) else: - model = ((params.get("Model", encoding="utf-8") if tuning_level >= level["Model"] else default.get("Model", encoding="utf-8")) or DEFAULT_MODEL).removesuffix("_default") + model = ((params.get("Model", encoding="utf-8") if toggle.tuning_level >= level["Model"] else default.get("Model", encoding="utf-8")) or DEFAULT_MODEL).removesuffix("_default") if model in downloaded_models: toggle.model = model toggle.model_name = dict(zip(toggle.available_models.split(","), toggle.available_model_names.split(","))).get(toggle.model, DEFAULT_MODEL_NAME) @@ -917,31 +916,31 @@ class FrogPilotVariables: toggle.classic_longitudinal = toggle.model_version in {"v1", "v2", "v3", "v4", "v5", "v6"} toggle.tinygrad_model = not toggle.classic_model and toggle.model_version not in {"v5", "v6"} - toggle.model_ui = params.get_bool("ModelUI") if tuning_level >= level["ModelUI"] else default.get_bool("ModelUI") - toggle.dynamic_path_width = toggle.model_ui and (params.get_bool("DynamicPathWidth") if tuning_level >= level["DynamicPathWidth"] else default.get_bool("DynamicPathWidth")) - toggle.lane_line_width = params.get_int("LaneLinesWidth") * small_distance_conversion / 200 if toggle.model_ui and tuning_level >= level["LaneLinesWidth"] else default.get_int("LaneLinesWidth") * CV.INCH_TO_CM / 200 - toggle.path_edge_width = params.get_int("PathEdgeWidth") if toggle.model_ui and tuning_level >= level["PathEdgeWidth"] else default.get_int("PathEdgeWidth") - toggle.path_width = params.get_float("PathWidth") * distance_conversion / 2 if toggle.model_ui and tuning_level >= level["PathWidth"] else default.get_float("PathWidth") * CV.FOOT_TO_METER / 2 - toggle.road_edge_width = params.get_int("RoadEdgesWidth") * small_distance_conversion / 200 if toggle.model_ui and tuning_level >= level["RoadEdgesWidth"] else default.get_int("RoadEdgesWidth") * CV.INCH_TO_CM / 200 - toggle.unlimited_road_ui_length = toggle.model_ui and (params.get_bool("UnlimitedLength") if tuning_level >= level["UnlimitedLength"] else default.get_bool("UnlimitedLength")) + toggle.model_ui = params.get_bool("ModelUI") if toggle.tuning_level >= level["ModelUI"] else default.get_bool("ModelUI") + toggle.dynamic_path_width = toggle.model_ui and (params.get_bool("DynamicPathWidth") if toggle.tuning_level >= level["DynamicPathWidth"] else default.get_bool("DynamicPathWidth")) + toggle.lane_line_width = params.get_int("LaneLinesWidth") * small_distance_conversion / 200 if toggle.model_ui and toggle.tuning_level >= level["LaneLinesWidth"] else default.get_int("LaneLinesWidth") * CV.INCH_TO_CM / 200 + toggle.path_edge_width = params.get_int("PathEdgeWidth") if toggle.model_ui and toggle.tuning_level >= level["PathEdgeWidth"] else default.get_int("PathEdgeWidth") + toggle.path_width = params.get_float("PathWidth") * distance_conversion / 2 if toggle.model_ui and toggle.tuning_level >= level["PathWidth"] else default.get_float("PathWidth") * CV.FOOT_TO_METER / 2 + toggle.road_edge_width = params.get_int("RoadEdgesWidth") * small_distance_conversion / 200 if toggle.model_ui and toggle.tuning_level >= level["RoadEdgesWidth"] else default.get_int("RoadEdgesWidth") * CV.INCH_TO_CM / 200 + toggle.unlimited_road_ui_length = toggle.model_ui and (params.get_bool("UnlimitedLength") if toggle.tuning_level >= level["UnlimitedLength"] else default.get_bool("UnlimitedLength")) - toggle.navigation_ui = params.get_bool("NavigationUI") if tuning_level >= level["NavigationUI"] else default.get_bool("NavigationUI") - toggle.big_map = toggle.navigation_ui and (params.get_bool("BigMap") if tuning_level >= level["BigMap"] else default.get_bool("BigMap")) - toggle.full_map = toggle.big_map and (params.get_bool("FullMap") if tuning_level >= level["FullMap"] else default.get_bool("FullMap")) - toggle.map_style = params.get_int("MapStyle") if toggle.navigation_ui and tuning_level >= level["MapStyle"] else default.get_int("MapStyle") - toggle.road_name_ui = toggle.navigation_ui and (params.get_bool("RoadNameUI") if tuning_level >= level["RoadNameUI"] else default.get_bool("RoadNameUI")) - toggle.show_speed_limits = toggle.navigation_ui and (params.get_bool("ShowSpeedLimits") if tuning_level >= level["ShowSpeedLimits"] else default.get_bool("ShowSpeedLimits")) - toggle.speed_limit_vienna = toggle.navigation_ui and (params.get_bool("UseVienna") if tuning_level >= level["UseVienna"] else default.get_bool("UseVienna")) + toggle.navigation_ui = params.get_bool("NavigationUI") if toggle.tuning_level >= level["NavigationUI"] else default.get_bool("NavigationUI") + toggle.big_map = toggle.navigation_ui and (params.get_bool("BigMap") if toggle.tuning_level >= level["BigMap"] else default.get_bool("BigMap")) + toggle.full_map = toggle.big_map and (params.get_bool("FullMap") if toggle.tuning_level >= level["FullMap"] else default.get_bool("FullMap")) + toggle.map_style = params.get_int("MapStyle") if toggle.navigation_ui and toggle.tuning_level >= level["MapStyle"] else default.get_int("MapStyle") + toggle.road_name_ui = toggle.navigation_ui and (params.get_bool("RoadNameUI") if toggle.tuning_level >= level["RoadNameUI"] else default.get_bool("RoadNameUI")) + toggle.show_speed_limits = toggle.navigation_ui and (params.get_bool("ShowSpeedLimits") if toggle.tuning_level >= level["ShowSpeedLimits"] else default.get_bool("ShowSpeedLimits")) + toggle.speed_limit_vienna = toggle.navigation_ui and (params.get_bool("UseVienna") if toggle.tuning_level >= level["UseVienna"] else default.get_bool("UseVienna")) if not started: toggle.old_long_api = toggle.openpilot_longitudinal and toggle.car_make == "gm" and toggle.has_cc_long and not toggle.has_pedal - toggle.old_long_api |= toggle.openpilot_longitudinal and toggle.car_make == "hyundai" and not (params.get_bool("NewLongAPI") if tuning_level >= level["NewLongAPI"] else default.get_bool("NewLongAPI")) + toggle.old_long_api |= toggle.openpilot_longitudinal and toggle.car_make == "hyundai" and not (params.get_bool("NewLongAPI") if toggle.tuning_level >= level["NewLongAPI"] else default.get_bool("NewLongAPI")) - personalize_openpilot = params.get_bool("PersonalizeOpenpilot") if tuning_level >= level["PersonalizeOpenpilot"] else default.get_bool("PersonalizeOpenpilot") + personalize_openpilot = params.get_bool("PersonalizeOpenpilot") if toggle.tuning_level >= level["PersonalizeOpenpilot"] else default.get_bool("PersonalizeOpenpilot") toggle.color_scheme = toggle.current_holiday_theme if toggle.current_holiday_theme != "stock" else params.get("CustomColors", encoding="utf-8") if personalize_openpilot else "stock" toggle.distance_icons = toggle.current_holiday_theme if toggle.current_holiday_theme != "stock" else params.get("CustomDistanceIcons", encoding="utf-8") if personalize_openpilot else "stock" toggle.icon_pack = toggle.current_holiday_theme if toggle.current_holiday_theme != "stock" else params.get("CustomIcons", encoding="utf-8") if personalize_openpilot else "stock" - toggle.random_themes = personalize_openpilot and (params.get_bool("RandomThemes") if tuning_level >= level["RandomThemes"] else default.get_bool("RandomThemes")) + toggle.random_themes = personalize_openpilot and (params.get_bool("RandomThemes") if toggle.tuning_level >= level["RandomThemes"] else default.get_bool("RandomThemes")) toggle.signal_icons = toggle.current_holiday_theme if toggle.current_holiday_theme != "stock" else params.get("CustomSignals", encoding="utf-8") if personalize_openpilot else "stock" toggle.sound_pack = toggle.current_holiday_theme if toggle.current_holiday_theme != "stock" else params.get("CustomSounds", encoding="utf-8") if personalize_openpilot else "stock" if not toggle.random_themes: @@ -949,105 +948,105 @@ class FrogPilotVariables: else: toggle.wheel_image = next((file.resolve().stem for file in (ACTIVE_THEME_PATH / "steering_wheel").glob("wheel.*")), "stock") - quality_of_life_lateral = params.get_bool("QOLLateral") if tuning_level >= level["QOLLateral"] else default.get_bool("QOLLateral") - toggle.pause_lateral_below_speed = params.get_int("PauseLateralSpeed") * speed_conversion if quality_of_life_lateral and tuning_level >= level["PauseLateralSpeed"] else default.get_int("PauseLateralSpeed") * CV.MPH_TO_MS - toggle.pause_lateral_below_signal = toggle.pause_lateral_below_speed != 0 and (params.get_bool("PauseLateralOnSignal") if tuning_level >= level["PauseLateralOnSignal"] else default.get_bool("PauseLateralOnSignal")) + quality_of_life_lateral = params.get_bool("QOLLateral") if toggle.tuning_level >= level["QOLLateral"] else default.get_bool("QOLLateral") + toggle.pause_lateral_below_speed = params.get_int("PauseLateralSpeed") * speed_conversion if quality_of_life_lateral and toggle.tuning_level >= level["PauseLateralSpeed"] else default.get_int("PauseLateralSpeed") * CV.MPH_TO_MS + toggle.pause_lateral_below_signal = toggle.pause_lateral_below_speed != 0 and (params.get_bool("PauseLateralOnSignal") if toggle.tuning_level >= level["PauseLateralOnSignal"] else default.get_bool("PauseLateralOnSignal")) - quality_of_life_longitudinal = toggle.openpilot_longitudinal and (params.get_bool("QOLLongitudinal") if tuning_level >= level["QOLLongitudinal"] else default.get_bool("QOLLongitudinal")) - toggle.cruise_increase = params.get_int("CustomCruise") if quality_of_life_longitudinal and not pcm_cruise and tuning_level >= level["CustomCruise"] else default.get_int("CustomCruise") - toggle.cruise_increase_long = params.get_int("CustomCruiseLong") if quality_of_life_longitudinal and not pcm_cruise and tuning_level >= level["CustomCruiseLong"] else default.get_int("CustomCruiseLong") - toggle.force_stops = quality_of_life_longitudinal and (params.get_bool("ForceStops") if tuning_level >= level["ForceStops"] else default.get_bool("ForceStops")) - toggle.increase_stopped_distance = params.get_int("IncreasedStoppedDistance") * distance_conversion if quality_of_life_longitudinal and tuning_level >= level["IncreasedStoppedDistance"] else default.get_int("IncreasedStoppedDistance") * CV.FOOT_TO_METER - map_gears = quality_of_life_longitudinal and (params.get_bool("MapGears") if tuning_level >= level["MapGears"] else default.get_bool("MapGears")) - toggle.map_acceleration = map_gears and (params.get_bool("MapAcceleration") if tuning_level >= level["MapAcceleration"] else default.get_bool("MapAcceleration")) - toggle.map_deceleration = map_gears and (params.get_bool("MapDeceleration") if tuning_level >= level["MapDeceleration"] else default.get_bool("MapDeceleration")) - toggle.reverse_cruise_increase = quality_of_life_longitudinal and toggle.car_make == "toyota" and pcm_cruise and (params.get_bool("ReverseCruise") if tuning_level >= level["ReverseCruise"] else default.get_bool("ReverseCruise")) - toggle.set_speed_offset = params.get_int("SetSpeedOffset") * (1 if toggle.is_metric else CV.MPH_TO_KPH) if quality_of_life_longitudinal and not pcm_cruise and tuning_level >= level["SetSpeedOffset"] else default.get_int("SetSpeedOffset") * CV.MPH_TO_KPH - toggle.weather_presets = quality_of_life_longitudinal and (params.get_bool("WeatherPresets") if tuning_level >= level["WeatherPresets"] else default.get_bool("WeatherPresets")) - toggle.increase_following_distance_low_visibility = params.get_float("IncreaseFollowingLowVisibility") if toggle.weather_presets and tuning_level >= level["IncreaseFollowingLowVisibility"] else default.get_float("IncreaseFollowingLowVisibility") - toggle.increase_following_distance_rain = params.get_float("IncreaseFollowingRain") if toggle.weather_presets and tuning_level >= level["IncreaseFollowingRain"] else default.get_float("IncreaseFollowingRain") - toggle.increase_following_distance_rain_storm = params.get_float("IncreaseFollowingRainStorm") if toggle.weather_presets and tuning_level >= level["IncreaseFollowingRainStorm"] else default.get_float("IncreaseFollowingRainStorm") - toggle.increase_following_distance_snow = params.get_float("IncreaseFollowingSnow") if toggle.weather_presets and tuning_level >= level["IncreaseFollowingSnow"] else default.get_float("IncreaseFollowingSnow") - toggle.increase_stopped_distance_low_visibility = params.get_int("IncreasedStoppedDistanceLowVisibility") * distance_conversion if toggle.weather_presets and tuning_level >= level["IncreasedStoppedDistanceLowVisibility"] else default.get_int("IncreasedStoppedDistanceLowVisibility") * CV.FOOT_TO_METER - toggle.increase_stopped_distance_rain = params.get_int("IncreasedStoppedDistanceRain") * distance_conversion if toggle.weather_presets and tuning_level >= level["IncreasedStoppedDistanceRain"] else default.get_int("IncreasedStoppedDistanceRain") * CV.FOOT_TO_METER - toggle.increase_stopped_distance_rain_storm = params.get_int("IncreasedStoppedDistanceRainStorm") * distance_conversion if toggle.weather_presets and tuning_level >= level["IncreasedStoppedDistanceRainStorm"] else default.get_int("IncreasedStoppedDistanceRainStorm") * CV.FOOT_TO_METER - toggle.increase_stopped_distance_snow = params.get_int("IncreasedStoppedDistanceSnow") * distance_conversion if toggle.weather_presets and tuning_level >= level["IncreasedStoppedDistanceSnow"] else default.get_int("IncreasedStoppedDistanceSnow") * CV.FOOT_TO_METER - toggle.reduce_acceleration_low_visibility = (params.get_int("ReduceAccelerationLowVisibility") if toggle.weather_presets and tuning_level >= level["ReduceAccelerationLowVisibility"] else default.get_int("ReduceAccelerationLowVisibility")) / 100 - toggle.reduce_acceleration_rain = (params.get_int("ReduceAccelerationRain") if toggle.weather_presets and tuning_level >= level["ReduceAccelerationRain"] else default.get_int("ReduceAccelerationRain")) / 100 - toggle.reduce_acceleration_rain_storm = (params.get_int("ReduceAccelerationRainStorm") if toggle.weather_presets and tuning_level >= level["ReduceAccelerationRainStorm"] else default.get_int("ReduceAccelerationRainStorm")) / 100 - toggle.reduce_acceleration_snow = (params.get_int("ReduceAccelerationSnow") if toggle.weather_presets and tuning_level >= level["ReduceAccelerationSnow"] else default.get_int("ReduceAccelerationSnow")) / 100 - toggle.reduce_lateral_acceleration_low_visibility = (params.get_int("ReduceLateralAccelerationLowVisibility") if toggle.weather_presets and tuning_level >= level["ReduceLateralAccelerationLowVisibility"] else default.get_int("ReduceLateralAccelerationLowVisibility")) / 100 - toggle.reduce_lateral_acceleration_rain = (params.get_int("ReduceLateralAccelerationRain") if toggle.weather_presets and tuning_level >= level["ReduceLateralAccelerationRain"] else default.get_int("ReduceLateralAccelerationRain")) / 100 - toggle.reduce_lateral_acceleration_rain_storm = (params.get_int("ReduceLateralAccelerationRainStorm") if toggle.weather_presets and tuning_level >= level["ReduceLateralAccelerationRainStorm"] else default.get_int("ReduceLateralAccelerationRainStorm")) / 100 - toggle.reduce_lateral_acceleration_snow = (params.get_int("ReduceLateralAccelerationSnow") if toggle.weather_presets and tuning_level >= level["ReduceLateralAccelerationSnow"] else default.get_int("ReduceLateralAccelerationSnow")) / 100 + quality_of_life_longitudinal = toggle.openpilot_longitudinal and (params.get_bool("QOLLongitudinal") if toggle.tuning_level >= level["QOLLongitudinal"] else default.get_bool("QOLLongitudinal")) + toggle.cruise_increase = params.get_int("CustomCruise") if quality_of_life_longitudinal and not pcm_cruise and toggle.tuning_level >= level["CustomCruise"] else default.get_int("CustomCruise") + toggle.cruise_increase_long = params.get_int("CustomCruiseLong") if quality_of_life_longitudinal and not pcm_cruise and toggle.tuning_level >= level["CustomCruiseLong"] else default.get_int("CustomCruiseLong") + toggle.force_stops = quality_of_life_longitudinal and (params.get_bool("ForceStops") if toggle.tuning_level >= level["ForceStops"] else default.get_bool("ForceStops")) + toggle.increase_stopped_distance = params.get_int("IncreasedStoppedDistance") * distance_conversion if quality_of_life_longitudinal and toggle.tuning_level >= level["IncreasedStoppedDistance"] else default.get_int("IncreasedStoppedDistance") * CV.FOOT_TO_METER + map_gears = quality_of_life_longitudinal and (params.get_bool("MapGears") if toggle.tuning_level >= level["MapGears"] else default.get_bool("MapGears")) + toggle.map_acceleration = map_gears and (params.get_bool("MapAcceleration") if toggle.tuning_level >= level["MapAcceleration"] else default.get_bool("MapAcceleration")) + toggle.map_deceleration = map_gears and (params.get_bool("MapDeceleration") if toggle.tuning_level >= level["MapDeceleration"] else default.get_bool("MapDeceleration")) + toggle.reverse_cruise_increase = quality_of_life_longitudinal and toggle.car_make == "toyota" and pcm_cruise and (params.get_bool("ReverseCruise") if toggle.tuning_level >= level["ReverseCruise"] else default.get_bool("ReverseCruise")) + toggle.set_speed_offset = params.get_int("SetSpeedOffset") * (1 if toggle.is_metric else CV.MPH_TO_KPH) if quality_of_life_longitudinal and not pcm_cruise and toggle.tuning_level >= level["SetSpeedOffset"] else default.get_int("SetSpeedOffset") * CV.MPH_TO_KPH + toggle.weather_presets = quality_of_life_longitudinal and (params.get_bool("WeatherPresets") if toggle.tuning_level >= level["WeatherPresets"] else default.get_bool("WeatherPresets")) + toggle.increase_following_distance_low_visibility = params.get_float("IncreaseFollowingLowVisibility") if toggle.weather_presets and toggle.tuning_level >= level["IncreaseFollowingLowVisibility"] else default.get_float("IncreaseFollowingLowVisibility") + toggle.increase_following_distance_rain = params.get_float("IncreaseFollowingRain") if toggle.weather_presets and toggle.tuning_level >= level["IncreaseFollowingRain"] else default.get_float("IncreaseFollowingRain") + toggle.increase_following_distance_rain_storm = params.get_float("IncreaseFollowingRainStorm") if toggle.weather_presets and toggle.tuning_level >= level["IncreaseFollowingRainStorm"] else default.get_float("IncreaseFollowingRainStorm") + toggle.increase_following_distance_snow = params.get_float("IncreaseFollowingSnow") if toggle.weather_presets and toggle.tuning_level >= level["IncreaseFollowingSnow"] else default.get_float("IncreaseFollowingSnow") + toggle.increase_stopped_distance_low_visibility = params.get_int("IncreasedStoppedDistanceLowVisibility") * distance_conversion if toggle.weather_presets and toggle.tuning_level >= level["IncreasedStoppedDistanceLowVisibility"] else default.get_int("IncreasedStoppedDistanceLowVisibility") * CV.FOOT_TO_METER + toggle.increase_stopped_distance_rain = params.get_int("IncreasedStoppedDistanceRain") * distance_conversion if toggle.weather_presets and toggle.tuning_level >= level["IncreasedStoppedDistanceRain"] else default.get_int("IncreasedStoppedDistanceRain") * CV.FOOT_TO_METER + toggle.increase_stopped_distance_rain_storm = params.get_int("IncreasedStoppedDistanceRainStorm") * distance_conversion if toggle.weather_presets and toggle.tuning_level >= level["IncreasedStoppedDistanceRainStorm"] else default.get_int("IncreasedStoppedDistanceRainStorm") * CV.FOOT_TO_METER + toggle.increase_stopped_distance_snow = params.get_int("IncreasedStoppedDistanceSnow") * distance_conversion if toggle.weather_presets and toggle.tuning_level >= level["IncreasedStoppedDistanceSnow"] else default.get_int("IncreasedStoppedDistanceSnow") * CV.FOOT_TO_METER + toggle.reduce_acceleration_low_visibility = (params.get_int("ReduceAccelerationLowVisibility") if toggle.weather_presets and toggle.tuning_level >= level["ReduceAccelerationLowVisibility"] else default.get_int("ReduceAccelerationLowVisibility")) / 100 + toggle.reduce_acceleration_rain = (params.get_int("ReduceAccelerationRain") if toggle.weather_presets and toggle.tuning_level >= level["ReduceAccelerationRain"] else default.get_int("ReduceAccelerationRain")) / 100 + toggle.reduce_acceleration_rain_storm = (params.get_int("ReduceAccelerationRainStorm") if toggle.weather_presets and toggle.tuning_level >= level["ReduceAccelerationRainStorm"] else default.get_int("ReduceAccelerationRainStorm")) / 100 + toggle.reduce_acceleration_snow = (params.get_int("ReduceAccelerationSnow") if toggle.weather_presets and toggle.tuning_level >= level["ReduceAccelerationSnow"] else default.get_int("ReduceAccelerationSnow")) / 100 + toggle.reduce_lateral_acceleration_low_visibility = (params.get_int("ReduceLateralAccelerationLowVisibility") if toggle.weather_presets and toggle.tuning_level >= level["ReduceLateralAccelerationLowVisibility"] else default.get_int("ReduceLateralAccelerationLowVisibility")) / 100 + toggle.reduce_lateral_acceleration_rain = (params.get_int("ReduceLateralAccelerationRain") if toggle.weather_presets and toggle.tuning_level >= level["ReduceLateralAccelerationRain"] else default.get_int("ReduceLateralAccelerationRain")) / 100 + toggle.reduce_lateral_acceleration_rain_storm = (params.get_int("ReduceLateralAccelerationRainStorm") if toggle.weather_presets and toggle.tuning_level >= level["ReduceLateralAccelerationRainStorm"] else default.get_int("ReduceLateralAccelerationRainStorm")) / 100 + toggle.reduce_lateral_acceleration_snow = (params.get_int("ReduceLateralAccelerationSnow") if toggle.weather_presets and toggle.tuning_level >= level["ReduceLateralAccelerationSnow"] else default.get_int("ReduceLateralAccelerationSnow")) / 100 - quality_of_life_visuals = params.get_bool("QOLVisuals") if tuning_level >= level["QOLVisuals"] else default.get_bool("QOLVisuals") - toggle.camera_view = params.get_int("CameraView") if quality_of_life_visuals and tuning_level >= level["CameraView"] else default.get_int("CameraView") - toggle.driver_camera_in_reverse = quality_of_life_visuals and (params.get_bool("DriverCamera") if tuning_level >= level["DriverCamera"] else default.get_bool("DriverCamera")) - toggle.onroad_distance_button = toggle.openpilot_longitudinal and (quality_of_life_visuals and (params.get_bool("OnroadDistanceButton") if tuning_level >= level["OnroadDistanceButton"] else default.get_bool("OnroadDistanceButton")) or toggle.debug_mode) - toggle.stopped_timer = quality_of_life_visuals and (params.get_bool("StoppedTimer") if tuning_level >= level["StoppedTimer"] else default.get_bool("StoppedTimer")) + quality_of_life_visuals = params.get_bool("QOLVisuals") if toggle.tuning_level >= level["QOLVisuals"] else default.get_bool("QOLVisuals") + toggle.camera_view = params.get_int("CameraView") if quality_of_life_visuals and toggle.tuning_level >= level["CameraView"] else default.get_int("CameraView") + toggle.driver_camera_in_reverse = quality_of_life_visuals and (params.get_bool("DriverCamera") if toggle.tuning_level >= level["DriverCamera"] else default.get_bool("DriverCamera")) + toggle.onroad_distance_button = toggle.openpilot_longitudinal and (quality_of_life_visuals and (params.get_bool("OnroadDistanceButton") if toggle.tuning_level >= level["OnroadDistanceButton"] else default.get_bool("OnroadDistanceButton")) or toggle.debug_mode) + toggle.stopped_timer = quality_of_life_visuals and (params.get_bool("StoppedTimer") if toggle.tuning_level >= level["StoppedTimer"] else default.get_bool("StoppedTimer")) - toggle.rainbow_path = params.get_bool("RainbowPath") if tuning_level >= level["RainbowPath"] else default.get_bool("RainbowPath") + toggle.rainbow_path = params.get_bool("RainbowPath") if toggle.tuning_level >= level["RainbowPath"] else default.get_bool("RainbowPath") - toggle.random_events = params.get_bool("RandomEvents") if tuning_level >= level["RandomEvents"] else default.get_bool("RandomEvents") + toggle.random_events = params.get_bool("RandomEvents") if toggle.tuning_level >= level["RandomEvents"] else default.get_bool("RandomEvents") - screen_management = params.get_bool("ScreenManagement") if tuning_level >= level["ScreenManagement"] else default.get_bool("ScreenManagement") - toggle.screen_brightness = params.get_int("ScreenBrightness") if screen_management and tuning_level >= level["ScreenBrightness"] else default.get_int("ScreenBrightness") - toggle.screen_brightness_onroad = params.get_int("ScreenBrightnessOnroad") if screen_management and tuning_level >= level["ScreenBrightnessOnroad"] else default.get_int("ScreenBrightnessOnroad") - toggle.screen_recorder = screen_management and (params.get_bool("ScreenRecorder") if tuning_level >= level["ScreenRecorder"] else default.get_bool("ScreenRecorder")) or toggle.debug_mode - toggle.screen_timeout = params.get_int("ScreenTimeout") if screen_management and tuning_level >= level["ScreenTimeout"] else default.get_int("ScreenTimeout") - toggle.screen_timeout_onroad = params.get_int("ScreenTimeoutOnroad") if screen_management and tuning_level >= level["ScreenTimeoutOnroad"] else default.get_int("ScreenTimeoutOnroad") - toggle.standby_mode = screen_management and (params.get_bool("StandbyMode") if tuning_level >= level["StandbyMode"] else default.get_bool("StandbyMode")) + screen_management = params.get_bool("ScreenManagement") if toggle.tuning_level >= level["ScreenManagement"] else default.get_bool("ScreenManagement") + toggle.screen_brightness = params.get_int("ScreenBrightness") if screen_management and toggle.tuning_level >= level["ScreenBrightness"] else default.get_int("ScreenBrightness") + toggle.screen_brightness_onroad = params.get_int("ScreenBrightnessOnroad") if screen_management and toggle.tuning_level >= level["ScreenBrightnessOnroad"] else default.get_int("ScreenBrightnessOnroad") + toggle.screen_recorder = screen_management and (params.get_bool("ScreenRecorder") if toggle.tuning_level >= level["ScreenRecorder"] else default.get_bool("ScreenRecorder")) or toggle.debug_mode + toggle.screen_timeout = params.get_int("ScreenTimeout") if screen_management and toggle.tuning_level >= level["ScreenTimeout"] else default.get_int("ScreenTimeout") + toggle.screen_timeout_onroad = params.get_int("ScreenTimeoutOnroad") if screen_management and toggle.tuning_level >= level["ScreenTimeoutOnroad"] else default.get_int("ScreenTimeoutOnroad") + toggle.standby_mode = screen_management and (params.get_bool("StandbyMode") if toggle.tuning_level >= level["StandbyMode"] else default.get_bool("StandbyMode")) - toggle.sng_hack = toggle.openpilot_longitudinal and toggle.car_make == "toyota" and not toggle.has_pedal and not has_sng and (params.get_bool("SNGHack") if tuning_level >= level["SNGHack"] else default.get_bool("SNGHack")) + toggle.sng_hack = toggle.openpilot_longitudinal and toggle.car_make == "toyota" and not toggle.has_pedal and not has_sng and (params.get_bool("SNGHack") if toggle.tuning_level >= level["SNGHack"] else default.get_bool("SNGHack")) - toggle.speed_limit_controller = toggle.openpilot_longitudinal and (params.get_bool("SpeedLimitController") if tuning_level >= level["SpeedLimitController"] else default.get_bool("SpeedLimitController")) - toggle.force_mph_dashboard = toggle.speed_limit_controller and (params.get_bool("ForceMPHDashboard") if tuning_level >= level["ForceMPHDashboard"] else default.get_bool("ForceMPHDashboard")) - toggle.map_speed_lookahead_higher = params.get_int("SLCLookaheadHigher") if toggle.speed_limit_controller and tuning_level >= level["SLCLookaheadHigher"] else default.get_int("SLCLookaheadHigher") - toggle.map_speed_lookahead_lower = params.get_int("SLCLookaheadLower") if toggle.speed_limit_controller and tuning_level >= level["SLCLookaheadLower"] else default.get_int("SLCLookaheadLower") - toggle.set_speed_limit = toggle.speed_limit_controller and (params.get_bool("SetSpeedLimit") if tuning_level >= level["SetSpeedLimit"] else default.get_bool("SetSpeedLimit")) - toggle.show_speed_limit_offset = toggle.speed_limit_controller and (params.get_bool("ShowSLCOffset") if tuning_level >= level["ShowSLCOffset"] else default.get_bool("ShowSLCOffset")) or toggle.debug_mode - slc_fallback_method = params.get_int("SLCFallback") if toggle.speed_limit_controller and tuning_level >= level["SLCFallback"] else default.get_int("SLCFallback") + toggle.speed_limit_controller = toggle.openpilot_longitudinal and (params.get_bool("SpeedLimitController") if toggle.tuning_level >= level["SpeedLimitController"] else default.get_bool("SpeedLimitController")) + toggle.force_mph_dashboard = toggle.speed_limit_controller and (params.get_bool("ForceMPHDashboard") if toggle.tuning_level >= level["ForceMPHDashboard"] else default.get_bool("ForceMPHDashboard")) + toggle.map_speed_lookahead_higher = params.get_int("SLCLookaheadHigher") if toggle.speed_limit_controller and toggle.tuning_level >= level["SLCLookaheadHigher"] else default.get_int("SLCLookaheadHigher") + toggle.map_speed_lookahead_lower = params.get_int("SLCLookaheadLower") if toggle.speed_limit_controller and toggle.tuning_level >= level["SLCLookaheadLower"] else default.get_int("SLCLookaheadLower") + toggle.set_speed_limit = toggle.speed_limit_controller and (params.get_bool("SetSpeedLimit") if toggle.tuning_level >= level["SetSpeedLimit"] else default.get_bool("SetSpeedLimit")) + toggle.show_speed_limit_offset = toggle.speed_limit_controller and (params.get_bool("ShowSLCOffset") if toggle.tuning_level >= level["ShowSLCOffset"] else default.get_bool("ShowSLCOffset")) or toggle.debug_mode + slc_fallback_method = params.get_int("SLCFallback") if toggle.speed_limit_controller and toggle.tuning_level >= level["SLCFallback"] else default.get_int("SLCFallback") toggle.slc_fallback_experimental_mode = slc_fallback_method == 1 toggle.slc_fallback_previous_speed_limit = slc_fallback_method == 2 toggle.slc_fallback_set_speed = slc_fallback_method == 0 - toggle.slc_mapbox_filler = (toggle.show_speed_limits or toggle.speed_limit_controller) and params.get("MapboxSecretKey", encoding="utf-8") != None and (params.get_bool("SLCMapboxFiller") if tuning_level >= level["SLCMapboxFiller"] else default.get_bool("SLCMapboxFiller")) - toggle.speed_limit_confirmation = toggle.speed_limit_controller and (params.get_bool("SLCConfirmation") if tuning_level >= level["SLCConfirmation"] else default.get_bool("SLCConfirmation")) - toggle.speed_limit_confirmation_higher = toggle.speed_limit_confirmation and (params.get_bool("SLCConfirmationHigher") if tuning_level >= level["SLCConfirmationHigher"] else default.get_bool("SLCConfirmationHigher")) - toggle.speed_limit_confirmation_lower = toggle.speed_limit_confirmation and (params.get_bool("SLCConfirmationLower") if tuning_level >= level["SLCConfirmationLower"] else default.get_bool("SLCConfirmationLower")) - slc_override_method = params.get_int("SLCOverride") if toggle.speed_limit_controller and tuning_level >= level["SLCOverride"] else default.get_int("SLCOverride") + toggle.slc_mapbox_filler = (toggle.show_speed_limits or toggle.speed_limit_controller) and params.get("MapboxSecretKey", encoding="utf-8") != None and (params.get_bool("SLCMapboxFiller") if toggle.tuning_level >= level["SLCMapboxFiller"] else default.get_bool("SLCMapboxFiller")) + toggle.speed_limit_confirmation = toggle.speed_limit_controller and (params.get_bool("SLCConfirmation") if toggle.tuning_level >= level["SLCConfirmation"] else default.get_bool("SLCConfirmation")) + toggle.speed_limit_confirmation_higher = toggle.speed_limit_confirmation and (params.get_bool("SLCConfirmationHigher") if toggle.tuning_level >= level["SLCConfirmationHigher"] else default.get_bool("SLCConfirmationHigher")) + toggle.speed_limit_confirmation_lower = toggle.speed_limit_confirmation and (params.get_bool("SLCConfirmationLower") if toggle.tuning_level >= level["SLCConfirmationLower"] else default.get_bool("SLCConfirmationLower")) + slc_override_method = params.get_int("SLCOverride") if toggle.speed_limit_controller and toggle.tuning_level >= level["SLCOverride"] else default.get_int("SLCOverride") toggle.speed_limit_controller_override_manual = slc_override_method == 1 toggle.speed_limit_controller_override_set_speed = slc_override_method == 2 - toggle.speed_limit_offset1 = (params.get_int("Offset1") * speed_conversion if tuning_level >= level["Offset1"] else default.get_int("Offset1") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 - toggle.speed_limit_offset2 = (params.get_int("Offset2") * speed_conversion if tuning_level >= level["Offset2"] else default.get_int("Offset2") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 - toggle.speed_limit_offset3 = (params.get_int("Offset3") * speed_conversion if tuning_level >= level["Offset3"] else default.get_int("Offset3") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 - toggle.speed_limit_offset4 = (params.get_int("Offset4") * speed_conversion if tuning_level >= level["Offset4"] else default.get_int("Offset4") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 - toggle.speed_limit_offset5 = (params.get_int("Offset5") * speed_conversion if tuning_level >= level["Offset5"] else default.get_int("Offset5") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 - toggle.speed_limit_offset6 = (params.get_int("Offset6") * speed_conversion if tuning_level >= level["Offset6"] else default.get_int("Offset6") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 - toggle.speed_limit_offset7 = (params.get_int("Offset7") * speed_conversion if tuning_level >= level["Offset7"] else default.get_int("Offset7") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 - toggle.speed_limit_priority1 = params.get("SLCPriority1", encoding="utf-8") if toggle.speed_limit_controller and tuning_level >= level["SLCPriority1"] else default.get("SLCPriority1", encoding="utf-8") - toggle.speed_limit_priority2 = params.get("SLCPriority2", encoding="utf-8") if toggle.speed_limit_controller and tuning_level >= level["SLCPriority2"] else default.get("SLCPriority2", encoding="utf-8") - toggle.speed_limit_priority3 = params.get("SLCPriority3", encoding="utf-8") if toggle.speed_limit_controller and tuning_level >= level["SLCPriority3"] else default.get("SLCPriority3", encoding="utf-8") + toggle.speed_limit_offset1 = (params.get_int("Offset1") * speed_conversion if toggle.tuning_level >= level["Offset1"] else default.get_int("Offset1") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 + toggle.speed_limit_offset2 = (params.get_int("Offset2") * speed_conversion if toggle.tuning_level >= level["Offset2"] else default.get_int("Offset2") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 + toggle.speed_limit_offset3 = (params.get_int("Offset3") * speed_conversion if toggle.tuning_level >= level["Offset3"] else default.get_int("Offset3") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 + toggle.speed_limit_offset4 = (params.get_int("Offset4") * speed_conversion if toggle.tuning_level >= level["Offset4"] else default.get_int("Offset4") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 + toggle.speed_limit_offset5 = (params.get_int("Offset5") * speed_conversion if toggle.tuning_level >= level["Offset5"] else default.get_int("Offset5") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 + toggle.speed_limit_offset6 = (params.get_int("Offset6") * speed_conversion if toggle.tuning_level >= level["Offset6"] else default.get_int("Offset6") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 + toggle.speed_limit_offset7 = (params.get_int("Offset7") * speed_conversion if toggle.tuning_level >= level["Offset7"] else default.get_int("Offset7") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 + toggle.speed_limit_priority1 = params.get("SLCPriority1", encoding="utf-8") if toggle.speed_limit_controller and toggle.tuning_level >= level["SLCPriority1"] else default.get("SLCPriority1", encoding="utf-8") + toggle.speed_limit_priority2 = params.get("SLCPriority2", encoding="utf-8") if toggle.speed_limit_controller and toggle.tuning_level >= level["SLCPriority2"] else default.get("SLCPriority2", encoding="utf-8") + toggle.speed_limit_priority3 = params.get("SLCPriority3", encoding="utf-8") if toggle.speed_limit_controller and toggle.tuning_level >= level["SLCPriority3"] else default.get("SLCPriority3", encoding="utf-8") toggle.speed_limit_priority_highest = toggle.speed_limit_priority1 == "Highest" toggle.speed_limit_priority_lowest = toggle.speed_limit_priority1 == "Lowest" - toggle.speed_limit_sources = toggle.speed_limit_controller and (params.get_bool("SpeedLimitSources") if tuning_level >= level["SpeedLimitSources"] else default.get_bool("SpeedLimitSources")) + toggle.speed_limit_sources = toggle.speed_limit_controller and (params.get_bool("SpeedLimitSources") if toggle.tuning_level >= level["SpeedLimitSources"] else default.get_bool("SpeedLimitSources")) - toggle.speed_limit_filler = params.get_bool("SpeedLimitFiller") if tuning_level >= level["SpeedLimitFiller"] else default.get_bool("SpeedLimitFiller") + toggle.speed_limit_filler = params.get_bool("SpeedLimitFiller") if toggle.tuning_level >= level["SpeedLimitFiller"] else default.get_bool("SpeedLimitFiller") - toggle.startup_alert_top = params.get("StartupMessageTop", encoding="utf-8") if tuning_level >= level["StartupMessageTop"] else default.get("StartupMessageTop", encoding="utf-8") - toggle.startup_alert_bottom = params.get("StartupMessageBottom", encoding="utf-8") if tuning_level >= level["StartupMessageBottom"] else default.get("StartupMessageBottom", encoding="utf-8") + toggle.startup_alert_top = params.get("StartupMessageTop", encoding="utf-8") if toggle.tuning_level >= level["StartupMessageTop"] else default.get("StartupMessageTop", encoding="utf-8") + toggle.startup_alert_bottom = params.get("StartupMessageBottom", encoding="utf-8") if toggle.tuning_level >= level["StartupMessageBottom"] else default.get("StartupMessageBottom", encoding="utf-8") - toggle.subaru_sng = toggle.car_make == "subaru" and not (CP.flags & SubaruFlags.GLOBAL_GEN2 or CP.flags & SubaruFlags.HYBRID) and (params.get_bool("SubaruSNG") if tuning_level >= level["SubaruSNG"] else default.get_bool("SubaruSNG")) + toggle.subaru_sng = toggle.car_make == "subaru" and not (CP.flags & SubaruFlags.GLOBAL_GEN2 or CP.flags & SubaruFlags.HYBRID) and (params.get_bool("SubaruSNG") if toggle.tuning_level >= level["SubaruSNG"] else default.get_bool("SubaruSNG")) - toggle.taco_tune_hacks = taco_hacks_allowed and (params.get_bool("TacoTuneHacks") if tuning_level >= level["TacoTuneHacks"] else default.get_bool("TacoTuneHacks")) + toggle.taco_tune_hacks = taco_hacks_allowed and (params.get_bool("TacoTuneHacks") if toggle.tuning_level >= level["TacoTuneHacks"] else default.get_bool("TacoTuneHacks")) toggle.tethering_config = params.get_int("TetheringEnabled") - toyota_doors = toggle.car_make == "toyota" and (params.get_bool("ToyotaDoors") if tuning_level >= level["ToyotaDoors"] else default.get_bool("ToyotaDoors")) - toggle.lock_doors = toyota_doors and (params.get_bool("LockDoors") if tuning_level >= level["LockDoors"] else default.get_bool("LockDoors")) - toggle.unlock_doors = toyota_doors and (params.get_bool("UnlockDoors") if tuning_level >= level["UnlockDoors"] else default.get_bool("UnlockDoors")) + toyota_doors = toggle.car_make == "toyota" and (params.get_bool("ToyotaDoors") if toggle.tuning_level >= level["ToyotaDoors"] else default.get_bool("ToyotaDoors")) + toggle.lock_doors = toyota_doors and (params.get_bool("LockDoors") if toggle.tuning_level >= level["LockDoors"] else default.get_bool("LockDoors")) + toggle.unlock_doors = toyota_doors and (params.get_bool("UnlockDoors") if toggle.tuning_level >= level["UnlockDoors"] else default.get_bool("UnlockDoors")) - toggle.volt_sng = toggle.car_model == "CHEVROLET_VOLT" and (params.get_bool("VoltSNG") if tuning_level >= level["VoltSNG"] else default.get_bool("VoltSNG")) + toggle.volt_sng = toggle.car_model == "CHEVROLET_VOLT" and (params.get_bool("VoltSNG") if toggle.tuning_level >= level["VoltSNG"] else default.get_bool("VoltSNG")) params_memory.put("FrogPilotToggles", json.dumps(toggle.__dict__)) params_memory.remove("FrogPilotTogglesUpdated") diff --git a/frogpilot/controls/frogpilot_card.py b/frogpilot/controls/frogpilot_card.py index c67edb9cd..c4dd8d3b5 100644 --- a/frogpilot/controls/frogpilot_card.py +++ b/frogpilot/controls/frogpilot_card.py @@ -3,7 +3,7 @@ from cereal import car, custom from openpilot.selfdrive.controls.lib.drive_helpers import CRUISE_LONG_PRESS from openpilot.selfdrive.controls.lib.events import ET -from openpilot.frogpilot.common.frogpilot_variables import ERROR_LOGS_PATH, NON_DRIVING_GEARS, params, params_memory +from openpilot.frogpilot.common.frogpilot_variables import ERROR_LOGS_PATH, GearShifter, NON_DRIVING_GEARS, params, params_memory ButtonType = car.CarState.ButtonEvent.Type FrogPilotButtonType = custom.FrogPilotCarState.ButtonEvent.Type @@ -139,6 +139,7 @@ class FrogPilotCard: frogpilotCarState.distanceLongPressed = self.very_long_press_threshold > self.gap_counter >= self.long_press_threshold frogpilotCarState.distanceVeryLongPressed = self.gap_counter >= self.very_long_press_threshold frogpilotCarState.forceCoast = self.force_coast + frogpilotCarState.isParked = carState.gearShifter == GearShifter.park frogpilotCarState.pauseLateral = self.pause_lateral frogpilotCarState.pauseLongitudinal = self.pause_longitudinal frogpilotCarState.trafficModeEnabled = self.traffic_mode_enabled diff --git a/frogpilot/controls/lib/frogpilot_events.py b/frogpilot/controls/lib/frogpilot_events.py index c5bec2272..09b6ddaa3 100644 --- a/frogpilot/controls/lib/frogpilot_events.py +++ b/frogpilot/controls/lib/frogpilot_events.py @@ -51,7 +51,7 @@ class FrogPilotEvents: self.random_event_playing = False self.random_event_timer = 0 - acceleration = sm["carState"].aEgo + acceleration = sm["carControl"].actuators.accel if not sm["carState"].gasPressed: self.max_acceleration = max(acceleration, self.max_acceleration) diff --git a/frogpilot/controls/lib/weather_checker.py b/frogpilot/controls/lib/weather_checker.py index 541d174ec..041b4306b 100644 --- a/frogpilot/controls/lib/weather_checker.py +++ b/frogpilot/controls/lib/weather_checker.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -import os import requests import time @@ -8,7 +7,8 @@ from concurrent.futures import ThreadPoolExecutor from openpilot.common.conversions import Conversions as CV from openpilot.common.params import Params -from openpilot.frogpilot.common.frogpilot_utilities import calculate_distance_to_point, is_url_pingable +from openpilot.frogpilot.common.frogpilot_utilities import calculate_distance_to_point, get_frogpilot_api_info +from openpilot.frogpilot.common.frogpilot_variables import FROGPILOT_API CACHE_DISTANCE = 25 MAX_RETRIES = 3 @@ -55,18 +55,19 @@ class WeatherChecker: self.hourly_forecast = None self.last_gps_position = None self.last_updated = None + self.requesting = False - user_api_key = Params().get("WeatherToken", encoding="utf-8") - self.api_key = user_api_key or os.environ.get("WEATHER_TOKEN", "") + self.user_api_key = Params().get("WeatherToken", encoding="utf-8") - if user_api_key: + if self.user_api_key: self.check_interval = 60 else: self.check_interval = 15 * 60 + self.api_token, self.build_metadata, self.device_type, self.dongle_id = get_frogpilot_api_info() + self.session = requests.Session() - self.session.headers.update({"Accept-Language": "en"}) - self.session.headers.update({"User-Agent": "frogpilot-weather-checker/1.0 (https://github.com/FrogAi/FrogPilot)"}) + self.session.headers.update({"Accept-Language": "en", "User-Agent": "frogpilot-api/1.0"}) self.executor = ThreadPoolExecutor(max_workers=1) @@ -89,10 +90,6 @@ class WeatherChecker: self.reduce_lateral_acceleration = 0 def update_weather(self, gps_position, now, frogpilot_toggles): - if not self.api_key: - self.weather_id = 0 - return - if self.last_gps_position and self.last_updated: distance = calculate_distance_to_point( self.last_gps_position["latitude"] * CV.DEG_TO_RAD, @@ -114,10 +111,15 @@ class WeatherChecker: self.update_offsets(frogpilot_toggles) return - self.last_updated = now + if self.requesting: + return + + self.requesting = True def complete_request(future): + self.requesting = False data = future.result() + self.last_updated = now if data: self.hourly_forecast = data.get("hourly") self.last_gps_position = gps_position @@ -136,32 +138,27 @@ class WeatherChecker: self.update_offsets(frogpilot_toggles) def make_request(): - if not is_url_pingable("https://api.openweathermap.org"): - return None - - params = { + payload = { + "api_key": self.user_api_key, + "api_token": self.api_token, + "build_metadata": self.build_metadata, + "device": self.device_type, + "frogpilot_dongle_id": self.dongle_id, "lat": gps_position["latitude"], "lon": gps_position["longitude"], - "appid": self.api_key, - "units": "metric", - "exclude": "alerts,minutely,daily", } for attempt in range(1, MAX_RETRIES + 1): try: - self.api_3_calls += 1 - response = self.session.get("https://api.openweathermap.org/data/3.0/onecall", params=params, timeout=10) - - if response.status_code in (401, 403, 429): - fallback_params = params.copy() - fallback_params.pop("exclude", None) - self.api_25_calls += 1 - fallback_response = self.session.get("https://api.openweathermap.org/data/2.5/weather", params=fallback_params, timeout=10) - fallback_response.raise_for_status() - return fallback_response.json() - + response = self.session.post(f"{FROGPILOT_API}/weather", json=payload, headers={"Content-Type": "application/json"}, timeout=10) response.raise_for_status() - return response.json() + + data = response.json() + if data.get("api_version") == "2.5": + self.api_25_calls += 1 + else: + self.api_3_calls += 1 + return data except Exception: if attempt < MAX_RETRIES: time.sleep(RETRY_DELAY) diff --git a/frogpilot/frogpilot_process.py b/frogpilot/frogpilot_process.py index 8dfb91e04..360ac86ce 100644 --- a/frogpilot/frogpilot_process.py +++ b/frogpilot/frogpilot_process.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import datetime import json -import os import time from cereal import messaging @@ -104,7 +103,7 @@ def frogpilot_thread(): if frogpilot_toggles.random_themes: theme_manager.update_active_theme(time_validated, frogpilot_toggles, randomize_theme=True) - if time_validated and is_url_pingable(os.environ.get("STATS_URL", "")): + if time_validated: send_stats() elif started and not started_previously: diff --git a/frogpilot/system/environment_variables b/frogpilot/system/environment_variables deleted file mode 100755 index c1cfbaa8ce601bde70508be77b0aec4e9d3ed3a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 460728 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'Sa3)q%|zmOQ+W{(HMM`nE*<$PIjzy=jHu)KN$7J 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%0DM;DcB4Noy;L5f`uC*hZqRQO+~)btKL@W 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≶mYq` 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%0D)0#@&3hI-=qEu)U6% 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

Pkl!w$-DZih-JX1)e~CesRzbZn7+ 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 diff --git a/frogpilot/system/frogpilot_stats.py b/frogpilot/system/frogpilot_stats.py index 6efe479ba..e1a525598 100644 --- a/frogpilot/system/frogpilot_stats.py +++ b/frogpilot/system/frogpilot_stats.py @@ -1,25 +1,41 @@ import json -import os import random import requests -from collections import Counter -from datetime import datetime, timezone -from influxdb_client import InfluxDBClient, Point -from influxdb_client.client.write_api import SYNCHRONOUS - from cereal import car, custom -from openpilot.common.conversions import Conversions as CV -from openpilot.system.hardware import HARDWARE -from openpilot.system.version import get_build_metadata -from openpilot.frogpilot.common.frogpilot_utilities import clean_model_name -from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles, params +from openpilot.frogpilot.common.frogpilot_utilities import clean_model_name, get_frogpilot_api_info +from openpilot.frogpilot.common.frogpilot_variables import FROGPILOT_API, get_frogpilot_toggles, params BASE_URL = "https://nominatim.openstreetmap.org" +GITHUB_API_URL = "https://api.github.com/repos/FrogAi/FrogPilot/commits" MINIMUM_POPULATION = 100_000 +TRACKED_BRANCHES = ["FrogPilot", "FrogPilot-Staging", "FrogPilot-Testing"] + +def get_branch_commits(): + commits = [] + + with requests.Session() as session: + session.headers.update({"Accept": "application/vnd.github.v3+json", "User-Agent": "frogpilot-stats/1.0"}) + + for branch in TRACKED_BRANCHES: + try: + response = session.get(f"{GITHUB_API_URL}/{branch}", timeout=10) + response.raise_for_status() + + sha = response.json().get("sha") + if sha: + commits.append({"branch": branch, "commit": sha}) + except requests.exceptions.RequestException as exception: + print(f"Failed to get commit for {branch}: {exception}") + + return commits + def get_city_center(latitude, longitude): + if latitude == 0 and longitude == 0: + return (0.0, 0.0, "N/A", "N/A", "N/A") + try: with requests.Session() as session: session.headers.update({"Accept-Language": "en"}) @@ -95,30 +111,14 @@ def get_city_center(latitude, longitude): print(f"Falling back to (0, 0) for {latitude}, {longitude}") return float(0.0), float(0.0), "N/A", "N/A", "N/A" -def update_branch_commits(now): - points = [] - for branch in ["FrogPilot", "FrogPilot-Staging", "FrogPilot-Testing"]: - try: - response = requests.get(f"https://api.github.com/repos/FrogAi/FrogPilot/commits/{branch}") - response.raise_for_status() - sha = response.json()["sha"] - points.append(Point("branch_commits").field("commit", sha).tag("branch", branch).time(now)) - except Exception as e: - print(f"Failed to fetch commit for {branch}: {e}") - return points - def send_stats(): try: - build_metadata = get_build_metadata() frogpilot_toggles = get_frogpilot_toggles() if frogpilot_toggles.car_make == "mock": return - bucket = os.environ.get("STATS_BUCKET", "") - org_ID = os.environ.get("STATS_ORG_ID", "") - token = os.environ.get("STATS_TOKEN", "") - url = os.environ.get("STATS_URL", "") + api_token, build_metadata, device_type, dongle_id = get_frogpilot_api_info() car_params = "{}" msg_bytes = params.get("CarParamsPersistent") @@ -138,7 +138,6 @@ def send_stats(): fpcp_dict.pop("carVin", None) frogpilot_car_params = json.dumps(fpcp_dict) - dongle_id = params.get("FrogPilotDongleId", encoding="utf-8") frogpilot_stats = json.loads(params.get("FrogPilotStats") or "{}") location = json.loads(params.get("LastGPSPosition") or "{}") @@ -146,60 +145,43 @@ def send_stats(): original_longitude = location.get("longitude", 0.0) latitude, longitude, city, state, country = get_city_center(original_latitude, original_longitude) - now = datetime.now(timezone.utc) - - theme_attributes = sorted(["color_scheme", "distance_icons", "icon_pack", "signal_icons", "sound_pack"]) - theme_counts = Counter(getattr(frogpilot_toggles, attribute).replace("-animated", "") for attribute in theme_attributes) - winners = [theme for theme, count in theme_counts.items() if count == max(theme_counts.values(), default=0)] - if len(winners) > 1 and "stock" in winners: - winners.remove("stock") - selected_theme = random.choice(winners).replace("-user_created", "").replace("_", " ") if winners else "stock" - - user_point = ( - Point("user_stats") - .field("calibrated_lateral_acceleration", params.get_float("CalibratedLateralAcceleration")) - .field("calibration_progress", params.get_float("CalibrationProgress")) - .field("car_params", car_params) - .field("city", city) - .field("commit", build_metadata.openpilot.git_commit) - .field("country", country) - .field("device", HARDWARE.get_device_type()) - .field("event", 1) - .field("frogpilot_car_params", frogpilot_car_params) - .field("latitude", latitude) - .field("longitude", longitude) - .field("state", state) - .field("stats", json.dumps(frogpilot_stats)) - .field("theme", selected_theme.title()) - .field("toggles", json.dumps(frogpilot_toggles.__dict__)) - .field("tuning_level", params.get_int("TuningLevel") + 1 if params.get_bool("TuningLevelConfirmed") else 0) - .field("using_default_model", params.get("Model", encoding="utf-8").endswith("_default")) - .tag("branch", build_metadata.channel) - .tag("dongle_id", dongle_id) - .time(now) - ) + payload = { + "api_token": api_token, + "branch_commits": get_branch_commits(), + "build_metadata": build_metadata, + "model_scores": [], + "user_stats": { + "calibrated_lateral_acceleration": params.get_float("CalibratedLateralAcceleration"), + "calibration_progress": params.get_float("CalibrationProgress"), + "car_params": car_params, + "city": city, + "country": country, + "device": device_type, + "frogpilot_car_params": frogpilot_car_params, + "frogpilot_dongle_id": dongle_id, + "frogpilot_stats": json.dumps(frogpilot_stats), + "latitude": latitude, + "longitude": longitude, + "state": state, + "toggles": json.dumps(frogpilot_toggles.__dict__), + "using_default_model": params.get("Model", encoding="utf-8").endswith("_default"), + }, + } model_scores = json.loads(params.get("ModelDrivesAndScores") or "{}") - model_points = [] for model_name, data in sorted(model_scores.items()): drives = data.get("Drives", 0) score = data.get("Score", 0) if drives > 0: - point = ( - Point("model_scores") - .field("drives", int(drives)) - .field("score", int(score)) - .tag("dongle_id", dongle_id) - .tag("model_name", clean_model_name(model_name)) - .time(now) - ) - model_points.append(point) + payload["model_scores"].append({ + "model_name": clean_model_name(model_name), + "drives": int(drives), + "score": int(score), + }) - all_points = model_points + [user_point] + update_branch_commits(now) - - client = InfluxDBClient(org=org_ID, token=token, url=url) - client.write_api(write_options=SYNCHRONOUS).write(bucket=bucket, org=org_ID, record=all_points) + response = requests.post(f"{FROGPILOT_API}/stats", json=payload, headers={"Content-Type": "application/json", "User-Agent": "frogpilot-api/1.0"}, timeout=30) + response.raise_for_status() print("Successfully sent FrogPilot stats!") except Exception as exception: diff --git a/frogpilot/system/frogpilot_tracking.py b/frogpilot/system/frogpilot_tracking.py index 63e581c0b..589b0bdb2 100644 --- a/frogpilot/system/frogpilot_tracking.py +++ b/frogpilot/system/frogpilot_tracking.py @@ -120,7 +120,7 @@ class FrogPilotTracking: self.previous_sound = sm["frogpilotControlsState"].alertSound - self.frogpilot_stats["HighestAcceleration"] = max(self.frogpilot_events.max_acceleration, self.frogpilot_stats.get("HighestAcceleration", 0)) + self.frogpilot_stats["MaxAcceleration"] = max(self.frogpilot_events.max_acceleration, self.frogpilot_stats.get("MaxAcceleration", 0)) if sm["carControl"].latActive: self.frogpilot_stats["LateralTime"] = self.frogpilot_stats.get("LateralTime", 0) + DT_MDL diff --git a/frogpilot/system/the_pond/assets/images/android-chrome-192x192.png b/frogpilot/system/the_pond/assets/images/android-chrome-192x192.png index 4ad74d653d61c17f59d84df1a0d6d728bfc97a12..fd46b8ee65b9eb9ab6193c63c0bc7b92268254e9 100644 GIT binary patch literal 59532 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≦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 S{@exDM7*ptu!xcZXtwySp>EyAH#^{CMxT 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 hSk+&jTVLqF8+z8c}>Z(bU^9m3c8;` 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%0D(!3%_(!Z`Dd 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 A0{{R3 literal 39968 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 AxBvhE literal 11165 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 diff --git a/frogpilot/system/the_pond/assets/images/favicon-16x16.png b/frogpilot/system/the_pond/assets/images/favicon-16x16.png index a1d0478621ea4340a83a876ce03e8ab8e2a23068..5cfd6b2f24ddb6d718e2d17fda9252a547927d8a 100644 GIT binary patch delta 959 zcmV;w13>(!1=I(SBYy*lNklE@0dz{P^eT5QN_w!sH)5n9n6R1jC%ze==aLGjvowLb5=4b(^N{I5V80 z^7H4fJpfGu%6}ctL-Jfc#JLi1d13@98k3j&kmsoiYmISJQ`5=(43Y(QcP78qRaZ)N zuYV44Lkmcff!DK&5amNS=m(t$fyX5wJJEykeSN5`RjOrr|7TesGcd)AsbkwEM*QjW zV%MGmXe;z6suH2JUYL#u+e;LvH&jDbRDd5H9+b(9P=CC@bRRru6qB-wSgTScBkX=D z5?d_zEQMS}7>!3b=sG3Dt33i}Urs=x*aDvpAr?!*6W2moLW%-RsF4)PQ#%U;8Z6&? z047GGOlpI^Z3Pl3($8lRrdYgG50vk9LdCa%iPKo8lE~dw0Es5KlT0B6hGl{17KmUJ zw_H+)^M3%T9FWKe5B?^4DN@$h~DL{l9YX$dBx?1RvAT3Gy-gH z!1M22c&x>smz$v`Phr+XBQiY)u6q;WPzX|y6My&aFfk%WG)~Ul_bmYde7 zqU?X@b-S@eC&0;Ju(k>cDKH3FCZxx8c9$ef!%U(AvnQRw$wYFPx%Vo5|nR5(wSQ(Z_?VHkeibIv?-Q`4=D z&FE)F6hynTAr<6}VU%Gx?T3DZ3c83uD$Bf(s0gi#t^$!Vq7bKKQ@Zd*BE|l$7C}O` zigec6%%9^nclLd84p}o6@F>tanc{4_1X{0=s4$F(q&}^5pUjscR;+N@ zaQk`V=;iWz>wl=Bd#}@OEgIjNdl2Uu8qwL+h8qKCGHrmfrMFOBbsR0%u3&KHA%at5 z4$}52GSZhy_X)>Z>qhjy>p&nhoRProEJ4|Z{TPkBMbDeo&}a-Rbq~(>R@D-xI~lwF z0TNJqy~5W{r=OI|W;N#}2i!{}2q@C*X1dtxtz#TFmw(c{P%Da5NA5Ysc9bErubhAe{)C+Cxp3=)WR%l-sGrAvJW zA}UiY8Y&3}SaR&Jn3p3rJ0Dq+Q7@iX4W|015yANkvXXu0mjfby_$X diff --git a/frogpilot/system/the_pond/assets/images/favicon-32x32.png b/frogpilot/system/the_pond/assets/images/favicon-32x32.png index 130785c99c12b1b7f4c3158f0363bc8fa0573a0c..2814a5825664f6b21154ad58cc3d4a5eab0be1e0 100644 GIT binary patch delta 2906 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 literal 15406 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


L^T*_(j&cD$hN2V;kz6zW9 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½Y`1N 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π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 z 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

&UHw>i=%;(z!b0xJ4e0!s? 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 z zVxN%YVBBVsK$Q}TFo|$%?#6o)MMGD>(Sw*SHj@=xm5U9c%b_;ae|mtSoeeAw**K;G z(d_qETPWvk#2FoTdKi zbt&NFj$nn;sG~z306z_#oDQ1!u$m$2bHkXLkuJ{zWey}E5jo^fGlI7FQg9kDor)yYIiRqvyvpZ4g3W%U6Pj*=QLem)Gp+B0}RhY5{p!95l75L)kK_T1W#} z+gKW&WRCLu`Ug@uNq8_tGX%3({lY|;t9D_CgtZZ&*1}n%$tLnI_~m~K8res$$K?42 zeBJ}+urAhYy_geqa+)r3Dxo<6EF#om8uLD@8g_G7iox~$18efF4(`@*F2 zi&K96f3B<5N)4a&pIzQ3&N*8B1 z=rI6C7`dSnRJ{$U2#kpn3I)POXHTt}ae0)tAp$vYH3~H6Gp^P} zO{9~}A(^T6k0hQh6jG6TGuouG28%V$Iio$K$mc-fB}MJeoWXqXAh+}&U|P3sQs=JG z@HIK1oi^Y!GdX_1J|g(b=hO2`eRO=Pr)L*cQ3NQu;1Qt!=P5|xveDdaF}KNxCR>}O znFkp{Lyb&J_YsCdT8_KAweyztwjSW8BAzcXE5f6*nRjvlHEj)AH{78>HNmP|Hjd~1 z9_Q_-v?TySNk2qz01&B5^523eIHBgCsz*5AfNT!oM^T-x#2f3ER00B9TGyinw8*jh! zP|{shcE;EJmDm9e^(#@wm#v7M|L8yY6Tf51@yr!JH2^ zi`*-Gt!Qg|)SY`Fe*p4X#IMp7B4e7=u2zS(4;E0q36wL+#H611C`t;L7ee)ad>hQ@kLyP1V9vTsjV1r3@PEl%K0w0{)TiV^-)`G&4`38kz z0Oz&BQNg;lNvbP2;J+EYRsP-1lyv}IFLlzz0)_~gyg>u&+U1wMZD<%pW4DO`B3L70 zYIcS|4miNx%Yqz55utgTWSof@_iIW;fMeCj^gFWRW%DM@ha|d745a}4ng;2fV z>-B@gT@G?ZpaV$eMZ%J}lH(dI2bqrKC1aN&&>#dWkh>#+FehC|MT9mOS^Xf~?6}ZN zX71uP1w#>00|LEZ#j#O;k~|_RXCErO%|2;dPTJ$+YiDo39elO~NmVjoaLcK>#%peg zMOF^|3v2nsGXrhMgSsQCUQ7xy1Y>p@y3d9C-!a+W+tqSW7qnP(p#?VBui8Vkmc`oW z3(;RNR;w#Ldv>G`K73sNIhDxm`^5c+Te|yTDZf-nLj1W^dsXLHDtfLg9*XFM9)YaT z(UW(HJH07?m;uRrHUVJkeRt!O}!`=n98FqB08EW*%$)HqwtP8 zEpJr_t^vFk73ZWy_`xTOGlFPMpnadNXXx@_02`ckKBitcAEQi}I^mc9_n)8W176Or z_$((4U@{TsTx17_M0`R>_~#y8M){j18e=2_c8{(GPVN>~f{Yrx*I<_(E6H!2Ba|zWFuW zJQmo=AuqdhkTb`O=+Qp?*&N+2thGJDD|Cv@|wA^k$wDU~p(R zg2iAZJW!T#C1>+xw|9o)`-3joOGxPpEYyZ#E0C zzu7#ZQIF?JvYFc|Z1fV7(FA)*x5q>Y-Mjw6&~4mQ~a-QJ~dzl

EWX--RC7hI1$f3W~8M@QA-z2QJE;JaYo0i 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

GYpCZ>q%6AMD$J)|5Q>VQk20Yn}>)^dDgYo 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

B76mp_2 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%0AKcV4HFCOmMo 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в8?KfIQQm^8M4N*G44j8kSnZQDlRpTLP(S#y2K7T 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≺=>+no>-c4M965gN6ug21;CXn*X3!C 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� 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

Fn}CJ+1sMar2n=};9r6Zw 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

xM^@0#k~Nj5 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�^M8T+BYt4h$6RSA%+`IdK3wx|CkKNfhSGrkONi&jZs zl3)p_??M71lxv9pWX~B+h^lF&v0Tjr{#a85tm`tC(KUf49DiF2jXPv5q?po3q9e0x zrK=U-;j`6%Zul86=qlY~6uAbh@kZ_fCl5S0bOX|Xuz0CAJflnSgFWxvX?saSiC4Eb z(B%NDKvcgANtLi6sA*&+JnD&TJ}R;Z`D|sm1=i&|ICqM=L{u4<5*aKS z0vp|fE$GsGKbH&{P}olaHZ)tPN(=5cLSsrI#jK$_~ z(gfKjVUB^Hkq%P-L&jAdmc&@kV5dO>0!ecYTN!s9=Wdq#hkUAHAhn*W$%br76qHGj z#ej@wC0cAWEhnqNf@&5i9iMKfC9}@Z;lVm+{uyxcd)_@$q&+_)`Wl~5Rk8V*j|5bWG_BGw%48++0p*kR=Xox`BiEW5o&Ln{mzLs8Bum|jjW}y#Y4^? z*z|a2SKM%w-TIOD*d5>h0lVSOn{9D4w}bQhHeYyfu0#q0w;(B1<;B$?nG1U=R;&4# zwl2V2t*-za4#_PZMd1{sKVg@>+K!oGU}*MV@z=4rXqqLm++i=5-oK&U{Vg{cW#Ns` zp;scMqsr=kP(2Hj{EDo%5(24WE!m@NxiE&-RY#||F9FR}-kz~X$r5}oJVn~mxZVeL z#N+Py@jR~K+dXx{&VA#IJ@reUu_u4=x9r?}X{+5G1{=AtG?Ahl)?zPMxMD{`)YpA` z`-}p9?V$jOH;5Z=_z{l3Wsg4mCjokMo&RcoeD}M5$u>8C1f8{cCy|Vpe29#OTbOQ=Rrf zL4dldGgyx6G6;O6M?mMan9RP480f4Ws>XRTvo(A{>1SNN$WqSAG{`Q(Iv3c46X#v= zOf?8_N_bU8f_{Wi?LDGwCBivk=$z04k|=QXtlr@WoJN+)d^nCsgwS6YxKNT`GB z4!^*jDi)HU;k#gt2n3mp^oo|)g9sLALzE3oBB72RbkI~KtL^MLfpkbt-Z|UkPy*MF z&uGs`zUt0+;S>Z}rKT#^^rynIlB`J+pvoh>H}(Y0hZ(R{gpbM;s(|;C$PBoQA3!He zml|y1MX8xB2!bfWF3N>wz>{Q60m*z$Ho9c669F(9E;aAQ2{EEdStr>O4{PVbqk*N? zrvX8-)hL%0K&I{H$1o*kC{w;$kCfa;C?Ir@ipV1yxjv0E4SS%2MN0EDVAF#4_fjGiAo6k4noLkoG(FTK%c+1b=>ozc%Aph&nFe^iO3 z7bZzp$prX7yc<<#g5anq^K0<@>mpQRPnoSPlB)c=O5F1~EpRDG<(&961>zh@p4Tlh z5aV+Dfc`63mjP1|QiT$QX3K4q28js4B?5x`i2J-+UQV%_;BWI4KWm zC>RySiG>$=N*kON4BpVK`**_8Rw=3_kc@gDo0Y3kX~wKRu}D?(o z#!uWqj6EGI7PT_c3YO^ml_{dlA7rlMK|0S`*R7>9H? zOldgvd%Uvod=wqsPhGvT8{f6G>+YJ{sq2&heeB=91jSK+SUTNc&D*>!dG?*@Gcohl&ag)1y|4W}xsroaS;4k+`I51&_-189dC zC~>@0s0>7@6FDjpL~yPIqny9w0w#w#Kw#|aCvphU`w&PMpeca6ZZ6jWaLS=ee>PdT z(8xLfp(~|4imWO*))AewC#jdZPO)k+701M?>RPTf)>}?LavIrePO+0O7_V8&vUpyn zCXm5+Qy4>{o~6r@Ik5r+Jb@dM9BhzO`btnCq79~pOun_kH75ZaZ!gH9xGthqC)3Lj7r4VHk5uV6EM%|KNo%S9+;rmmAml1ajB5i|iF zUGL@AXfGvixSzKI{L+oGdqqUF^<6Jr4N}y>BCdCXjc>uLTy_u{tP%069L3uoeRO`@0 zp|Y*{+%~=xe<`fwuLUsj2Ee?SLlDurTbX7%rV$ED;zU@6_$9t4Kalp2!MOCBNBuCa zB4A=~8;IAkL7ymSe2>DtQaHRASg7`34e}?^R75LfC2e(SDe#Z0RXO^uvyAVcmy$V> zEP+d6?N~*Z2K?-77DP_qoJ zxx6Jx^x?YJE=sx82cQ}OYgMtowLe83qU>CRwe}}o7gy7^qi71U6WI-$qzV6te2Hh| z#_<|aUSH@sq^i)o_ONP|NN$Dz@}?tI_5d@8hl+8tVR0rBQtesA#u&kAC{NbuXbNPQ zzC5ZHc!aI~06&tGDEtBc03VIpb#T3^NNtfPz%n9cOP&QZU`uO06+@K2lQ@CEgYEI} zEoKWlar$I*aR1sPPupkzk5Ae+o_f}1JKJVkTU?{Gs(g$bhwM$$)D#c?AP3s*R}MzT zTFfdH%`@mnvm=`?|E7KE@&BQ#!lnH4MZCwQJlt<%Y;S-2wq0}W-?P!^uiDZBbivIc z83%|-uSm9r+R~h4;mM9{(xsI{Z~w(tL-ec-QrpPjt>VFeyv>h} zZNiMF+(_RLf%qV7*(joeyKrDd`nSNZ)=4@jX03|f*nA=Ylg^jodyLoXyqy?sS3a_Y zx*s-SEP*XyM=p_ql{TUrriFlRjdP4qI@hkm4~fee^g8pnPfiH;H28lUM`QPG^mHy6EI^`PvKV5K!ak(={- zCO5aYZ0E9Fo9!Rk%TGLOPk-{W_O;J`$qvpR+H!l-YaEJmMCXXZe)l=mnQW`yw5HvnntRtjdg6mWCmS z-~dSqW6zT)>t<^h#kTUv7EuUL_H)(^ZIdob*#nlWOd-~)zgQv zN-`b<+^ft;8b3LOBmuETbw707#ok2>g<`t$F~uY^mkQ8R_nP=hR(wP{nj<+DNQ?Q% z4svZo6sWC-%1)DfX7o~-$|`13(44+Pgh|`$n9l&r3nW)2Gp3PvzrY+~BG`N!wbE+I z5AY7;B*H{|@Q8{Q1p-Er1{1y%aSD2_#w#ok!|VQ{L7y1c06X)Kt->urArz#ieaF?}l^DST%C^OGK(NRzX_gSjr;St(H1Bag2Pn!2^%JzNI&pkX3RgJ;Z{ylAdr5OAi=s;#9uaQ8%z zr3nWH?0!40>=jm&O=4y{Z-rn5WK3TbASM2kO2{g>FemK2w~DlK*q_aSH)Mu3t4HHUMYz_CDX9xI#bU*;V^U+?TO1yn)fk$`qv+| zhkoXhcJ{S1wmiLqtIpO6GU9O_LE-+F@`oOdn*@DL1s1%U?e&S7hu)9FL(?Q0XbzFuLdUhbg+ejD#}u@yCj>$#UvY}pCcBsBh(4jjvR^{ zE&c>xnx#D*IfU=>!Fq<)YqBq7WrN@&U_cOG07@mI$h5%yV0`><%&ksEN<4CJ@|^Ba zu6n`+wit5|%_{qxZ_N$B!Y61?$HX-b<2|%J9_C=Owxz|oFmO`v)NC}K5BWo&)~S@bR!_jK zmtQJ7nxHPWOP~=_;NqYLLgDbJC*o_m1WC7J?=$FJ3pR2Ox(*AB7Kny;wCl$P8r@{$ z_c2?gqxyhI49a@<2CB{(l$CYV*R4VWtbLza=`Jc52&SoJ0=x0{_HLb{4jtf?F$#MV zkkD=@zbP{k`xhppSvmr6w-E`j+u6GwFn6{Fa7nds+qHAMb3%Z7dncWB|O2D>t3N*PsHW#+w9Jh(p;W;Su>WK@kOWN)B`%s+b}P4ax7C z4U!&lGBm}~NeN3;S^?urBAQ*v!Idm0Q5CkibzBR^s8t1|Om>u|5S_o1eP_d8ZI2`; z0$d(t^k;h(-g{PgBRDUcKl`nbz47eGzVVfjee3HZJJ_GtYU-JDf-AbYTH1c@ZluK$pqD*c;Af zb!d4->NDq=Hj+43S!l?nj*wP!Ml4AQvIuCmGpy5Wwwl(1NeoD*s$b|&@+gpCKFNQU z#|sWAvsRv2K?O761D{8|9`LtLNT{!dFmP?KZbyp2$Bi*qv0iE5_I0x1R|B80*|`II z@)v*G9{$;1vjgw`?*Y2&nF4ezQT&$=)3y{iPLYu=bs4Hm1PQFQPX_>u^XJi1>o3^n zKKFC$AGwtO-Ob^pJkCGd*xvWx|6=3GUyI;8g7ju_r7EefiXwl%S9XxvK663FT|i=G zc6emtgJZkwrfcnc{-Zx{H^1i&o6i<@xPO@0nQB-SQBoVDg5Nb~qo6=;xR?AiuN`)q zWwT|w@hlj}wGfN}WISG(uGT#}9IH|u$_cf2SfoM%J^`Wl&Y+s9Z9;{_IM*sL!BX&W z4lp|ka^wJIMvxWrhI`CaCvt2cGy zUp-^X%}rZ*Ns%*%+I)4jN)kh5OhjcmH`$G63o2sMoCBGUY&2ilbhNUalPkO8=9S(2 zo|RpD>%z89dN#o9_;6$k|D0b16VJu9g0Xnqz|3K_bBsP2o$UpfL8n&9UdkAm_R5TQ zy=I_8#(Ujqma!MmEWOU4ijg<`hr)PNo+u+EFqnR&?VYScfwgMTRnEPi^VOAmRX%<( zTZIwxct&Q*^=vF{#V-Xmy6ninC@F(u2%?Jc1XX>g-{l~~-fXCX<^*ZY-x3qj24P^z z$49W-m73wBoUZm&bAit$xKi0ISwHQA&dUY{$Sj0F1_stl14^FP#AZO?vKbTt3YMu- z!9$dl1&VA7NtIrD-(&|_Ga*L4G%^S3U&=s3I#}BbyTH!Bu`X424Owhux7ufAp#b=F zKLj2sH5|xjsio*rtWP3a1|^+%X#fvyN7AWaiG+u4+_FXl@BRj zH4i+WAz=4c;@5bzKmmH_Fm6JPGooRg#=voChD8gZV4u%cScVL&_Nz!d@eXlJg#!vs4yO^#HKwuJLOhsZ0YE$IwX^!jJEy|M5&naO~hW4}l ztF2SlBj^==BcH41l<%%%Y&7mQpMn2w1|{(d3}01Nw53RmmM1Q-G_X+({ighM#bDr2 zo}q6sa3hP;ARR~BNjMzV<*@B0rEpI%Fh1_nuj%cp_k1H`-37x<4g;*-xSyQJ!l zrn9kBB5tsQ34JoC zo-~?9bGES2c{hr?_MLzI&)7S@>pixyHMPUNgE+5&%r0fB8`;o*Hlm_2OY}`gfJ_k? z@^!G8-FWrzGGM6mZd_Xz@_0_2|H-V#K!N2f7-Z5R6IWyjm>5QAe)iR><{$|G+nUh; z%SY#(+gbxU(J%^G_DuF)PLU3@G8xQR0mTg(iQo?Qx{o|70#vr8^1K9V%$CWlcMq=f zO1`1lY1uzW=+&BkXntU&byXICC;;LxuqgMe#yKpLn{3$D?zZ`T*l)b>sy*}TkJ@ve z`hvanjW=xW?4cV+clZfDL_$^ngBH;Z>}ExK4Fu>p9;naE#xpv3 z(8z{VKtQ=`0eX=;rP;a9eXp8MKu>x}Bd=fc^VKw=gX0Gx5vYIt`R!NYd!#lQkO9<+ zybRN&V5=O*O*Xvo6K_lv89lHU3^YpFwL9_OLAM2w;It#LLkaRz>1aeK z@e<_=FiIo0<8Kx4gzU=RMfF*$rl3*C;{!4h=?iL*dS%_IOo18@GDR@qz0@4pB0fLG zCW9&Bl(n^#sm0fN2|IlSjeu-XCxM^_?03?Mp$zFl-%@)sWiIHNH>*4bJFx(IGUoWrX1eDw@LU4Q-}a?1#w%3 zhNmRiso$adqX{ff{6CaB$YRSzWeDDqTV2y~C)$lcgV2HQPt?`W_frG7w(3zDgK8C3 z^t!OutO_NtAjVQ+O}fiD4T!h$QHbw#X202#3-BiuSKB7SG@z{~P$Knii^b9|yYe!# z(Zs&~#jn^G|Ix46bDw$A7N<{|`AtJQdsc?9TZ{|kSs3iay!~Pu%rDW+lcZDI;hl4SVm-#P+nAw zpk#CuXPD)XW2nNeG$I1~-2rxN5ymi)JRHBy(&&6q(!K08{9Z zWr!`f)p^Fjn)Yl=c86_7EEQZCU_3B0X?eX0vP-d&+$ZKgdG?$nNWU`2L9o(>EG3Pl zRrh0+=q9m=G5C5FVB}cac^?H_z*m)P^6s8PA_Hb0&!Yh9>KuVRHUlD!Yvaizy1P#{ zr*`J~SL~TjK5Sq8t;g(557NC6VPw*sNfeb#&zpvC7+7KS7c&nP9H+3&{Lb{TZ7j!j z`So+V?(Vr=f6u}$yJ2Y?lab92c^w-|j8skvg3QSEG9 zo)IG+@1%mr7R-j3h!m9+^z`TG0?R#RcEV*fo0W4O{iq7@_c~9+c~C+UAPGrJM~A^M zhE{C7bUnru``4K|fn-cPu7?UcMY2VspH}^Gz_$<0WCEA;SruSv3^v%PgdF zvq%^y=wugdm3L|!X=}N^T<1&zRy;KzhP05Cd*LeSd3np5Y(?vzl0Ju-XWBjic4cU_ ztO%n3U@FV24Azje(cZ{T#tKNb_`qJ$FXBemwn^^mJJ??NlRCd%7GJh;-QDII>TF~a z?XdTG##Q@ScD@)%oF#W|9!CjyBSPFzfDF1n%grOMI|5;oXG+`rGcZP^$0Jt-DT+U9 zd#S3l+#`{CYx}KiS|=M}EE#|Es15`4)cpX-7z5nRppF5WCp#s3kr;(+L|l=E*&$$qL95khm380b8Z|#yfCC(wiU(n<2F4@w?EE%6Q@^1Pse$y0Ymu7Wv#a$M%h< zC-(AFBRli5+3a{_tDTYAR&%?tN8R}A=OQ`>K05wP1(AJ-vJel>7dGBIu-)A)yZM24 z+FjrO0ejo~?y|}5mhDBu;^V6BVKqzo3sr(hT@|21u&Qb%$#dZu&LtG7SCEJZrq0HK zJ0XuX4cs%h`b@;DYbAqc`7-)G5H-Zhvh1xiTze(kgYN6V)jpkxU%^HE2A|Akd@a$V zCT=20v8%!jBxSWVbTEaJ=@(15V2)$U_@wBE1YNBFUCr0ZR(6b^$vqwGq7L^8pcKi} z0Xn*<$m*9{G2z4YPb)$>gw5v!*)TGe-?3R7=k)-6VOL&%wH@yr+n0a+5qsk2KV{#1 z=0#gxe%fqn%I@tQTk4rROnk3xX1vqNd92`qHALm)`P;^?%=j`V{r&2Snu z>;ma=ri)G*GExD01>wUiMmmHHxGO;Ltd8uEjG|cH0%2f~b%xU!b~qBkNe>(+WX|LQBzIPUr1dECyt`YoIJe(iXNcb)<2*IcAR^}wiLdKzT~g1R=x?=+#&H{O{( zK3>}H6$`ue?nT_2e$~yZIA^yw8Ucj(O?XLk5(=i?aklMlRP^dWmv)UKF-U@^<~TA~ zWkAaEErF!OI}!Nl?#+yLD0TI3baoawBN?TGq4k9GukVz7s@==rx@UD0fHhRC23%=6 zsLNT}-2#zLH8N{E0PW38u@EPn-#Tk95T7=HlK@Gy1{xC`^DJodBBc%tap`yE+wa|RxDqriXi(7>Twnb&mC%BH5%}xXOpNF^}3* zhEE_(wnyYi*@g;?yOf03r+iAL7(k0e(G3M!*cPb9ud;!qMk^AC|IXkEax8TnRFSbi zfZMeej_|WJPnb;(CFVs)u2(|{jMJ`Wp)>=XSip)T2c`0~ z>k!=@)Y29#J!8%}@@Rps)r+h-?NV0ha8f;F8#pali`0DuZNw7_jD5_W?2(Ru%(`#RQor7Q`jDzMKoVfr|37s$6pT8e0*Y>{(d))Mj)Dn>#SXY)z2rS6s7 zX^$_kgmE<_@jwS}7i5R!N^4EwWyfVCrLkUnWm6^jsT)U)9CLBv8PR2`Li zDaKA!G)$B@p$JZ~_0>qCwgMQeHH2z9T}2}}ce`)BHnNwV*sxa~_b%;bOV660Sebc4 zIIW4uM-hzSgk*=?hSx9a?~+Fuy17?y9@>fRO}p_uci5dj^g+Aj1NYeG?xyXZ-LvDv zSzt$LTn5QPk3mWc3)VJdww!V$-%+XDk|8)zafCQRg5VX#KK5WKUx#0#R}eGa`m7V> zQBv8Cer6?^0`xi`oxyZM8(~W>HP!Dt^OJOxzi7ue z@}-5zV|{rRK5Xk^VOQOBZ5*-u{6GGbefbj)MMLb>_CT4AhKm>gPfR=p{_-GiT zl`amUR=~Lgla)aqkC(Q8@EiYM!1Z6+Gtc~PH$j*B&wbjL`dGjH@!fRWd+e&yf77T0EYXc&(MYJ@maXp$ORI}0RtROYR|(gO6Oxozwn+STv6)!zFTK5BP<T^g1|o|qNDlV{0b2$iV`ou|QKMO?;U z{aKYsY*7Vu6X$TrKytzec*vG&ja4SdWfG&v5M2~2MoUEE&&e~$^!mUMdI&&5mXSth zUXmLE^ZKm+TIJE14KI)b1LHv}j55hyV!+CfWCkJ}2^|N!eEQJxo^!5bo+Xcr%#bAn zt4^>RbLI6V?L7S8Jdm)dPv1M-JJaemEVhLi$Y79>-JR}k+jM8s&b;uN{oXG>Y|sA2 z=k1M`Ubp%7me~ovXf;~mlDLtx*ZRtl=7vd_io{G^>7dCys$XTXvhlImbYp2(+`6z^ z-fMQ_-7DKVv9#I2(&k6bv{Foz9SY|^JjxL(95rbQ0=eh9c1zU?G~fu1>SigBQ5Wyz zTZV*$jv9ecDKdDa^XtJka2`uLvw;~iR0NX_Ac6%K14Y>ltdh;JewdV+&a@|*LarHHQS?7atE>t zX0<0BAaksdJ@58a6+^NG3?>93q{pEOo&I~M@ni_)ua-za=Cq}0devl# z_LPB$d>odw2!jZQREjJe&>HH9QW7&*!6IJxG|Eh7@aY#_4g=d|pw^DjaE*kMdt3@T zfo!<`r>tYVk?WD?%^67gyyE7N+fxm-mOBoK2psLFN6=&*;XI2y)v z8GJT73iCvt#$diGyu8W)dpdGCj5d8OfC>M@3~~~c&3nKaeUz$P23P%ct6q{LdzmB)eLUUFMsz^=+XmpIk&E+wCG`ANczmbi6@x|=%GVzcN&q-w{w zLmV<&`&F@9>ZywPLa_=9LQW7cCV?fQMmCGpefV0NjEGN>OClAL_=6=~hLcocjMu;_ z++e)fOpF{88u|IZGSNUvT330J1n)RNGEPg80lJ7c=!1-aEIn*lg!Ed3CH%*@`6gB1 zTzUOf_S(}g*k^y{llIJ~zi10Tu5q$8h-)!)5}q9g42Zk5taOX?WoeLqzYtal!Lbtq z3p;oIZ`=8^|C_z|;!9;IF8!bW{}G`3KD_tA|J=so|2FE}Tp_f<$=>u>amf7FHVR#o z01vj92ER(20Jy`LIE#7q&~`36We@(vkJ|k|_8qoyV%y$&?Jb;z1EOHi3$)c8_-Hgy zF1*e~(y1z#%`S@^6bvYvr^#^(NHK8s@5Z$s4aACt0x?>kS6Of1TVCVSjdo&IIxA%! z`}HWwR3sP|{3eUdrZNDm0%$U*A_aJ53>95AL)UOAM$gnAgDN=-{9d34!AAfEftEP0 zq;j7`fpq3|O@)k$G7QnAn>yzi!Wc=5c%WS0A<4fA3{mdUy8|-l0ZTvPBr{_DZ<3e>8qxzp9Yn zBDyYlInl^Q$19somUh`SX4l`lw42_uuq$qu+iGq$+Z#ux_W%S8u5inHWik{)seD!* zk|LQ7Ls(HjIh*ljz#xCi@H8trM7A<`(0WobQdUGTad%)Y&`G_MND1ti?a{wc5QEY+ z#&*Q*B6`?Cn6^W~R0k6RHNswcj+7Q4L;j04M^Tmh6h(*A9M~7#^*n&pk@XVTFMFu{ z2%U*QxyU{RBDzo719Sz<&<$1s<@r7hyfX1UL#MUw&|7~GP3h-egTzwFYT1ok7=k5` zl>+7z@a6?Gz@p8-yIV$7_AX0mH9BU6ILEX}{JM`QO7*#B@oQxsWSa*8I)f(gHTl0D zQ2Q^l!lAn)j$K$0euVL2v&pg_K;EpBAkmi@?&2~t5JfD3MN_A70o~By+?T$vLYmD8 z_UvEdUt?`TPvHj@j7rAkW-$QlA+0$`F;$^u0E29&Y^#zu@DtcK1>1^;(o+NZ@@(1z35reR2K^iNFLh0=wd#Pn;0mJ~h zB^jz`aM46UmYRYrQfMOi>T<+pj6?i@2LvwgyRvx(3V|ZY5S9JL^>Ahz)0J)R`g!w} zoqc1qmxAR003ZNKL_t(#uRJxeSH3i{H(wgt(b3qJ(WQN9=1o+caaSPM>wpKZOz%vjML9#jtpkt?)H^v4f5oxE}BS?uC z(W)aqp09|iUM7-=GxAE^=Hq0qk{^@vjj?e?B(D%GvxytUM>pE|IP-eEh7aUhgM`u% zywsGEPGA$rOp==bbGEs&Wjm)%*z>>plzr}}KVdI?;Tf~bPMYmZv499lWUwKp!k77v zH0W!8m%k>n(`;KN@1*DYZyX;U&1|vysD0s)&#eFXQvY}JpqKhk|B&N*&jbIdO(*|- z2!m6ZAs7X`QWBa|AHGpiB#CZ7quI#DSGOS0Y~;P^_Ks{aTiBoavmdbse)6Ms;)W~j z{OfPoYQBuPCYmiU8(W4825M{`pf{#FgtO-uDCfDOG?qGVne<<%EvMF4CIQlxESJ8> z*($r?3K|(>mf~ogbY>4pKms^sv~n%uNR<9oE8JFh07^1YQ8p~*4FjU}5YF@M6bqbL zAh@7r2deZr4PJVBvb}>wTFh3egs2uHGSLW96wI?^PM18%3kY~?O&Cl=1RFpjU{jW^ zn*E67_x)F>hr58{S|DY9+?cYFiW}gqlRGxq+ORiY{-!?dCi^f|y+)-V8O_hJD*T$fZqWM)YfSWwU9g5@XRlm!Ct zj_i<{SrPy|g$7c81r9M*o>5E!p=Gwgv zTIG&(O(a#O?U;$U$Y*bFU_st|%WW5tfJGqyt5|~$wkjrS zm5imQ!%BrBQM7jOXIwi?qS+Y8k4jTnNx&dp#1^j0qGr-oEBG!j&X44EY69l6^$Z%A zF(q8598uP&cOV3~3lh}}@FOdEk_2hpr87X6kD_nPfV7jl{0!%KF_R55(n@iY)u^+w zD6Q|%57sQ69>UygZ6lcl%ylK8gfa5!qmg-~M^--Zc@<>i`7~!uj-k)8yKE%UuAAd6 zG%yi^9wO?iQL>GFsLBTJXU??%eqsWWSA2XP;XwAj0lN$YF^6S1TF5pCbdG%CP2fi1 z<0f0HxW(k`Ya@I4%VsZqX=3MI9^2ga+|Qc(6>45uE<+*($bD!ryMp!@68BD6Bm*Dz z6L8k!;K)Y%hqk-BZMQynm)-Rff7-6U{|=jOZP@Yo1DhQj;M$H}i9KLh5AdE!$epOfyw?3H-2hEy=~ZQ=VPlazA*tJNX2_Ap%)K$* z8rF^RY5hVxKrrcIPGs6y$R;eneF5p-;>pa{kvOZfdkr0wEs?eDe%_xM0eTWrRmI_B z^I#dboyfnGOr+>$XG$C)91>T=2k@|Ls*Fm@YK|GhQc+H?8^RF885`%{H~TBwYb38ZsysU>G<< zemd@5U(Ref{;+-F;fI?$`D5{8x6*$s2K;Rg^1k={4cnajceXJ>fG)?=Ye%xaxwF=K zV`W|jpec={tkil`)4qQ&GkfE#-SdO*vj_gl57Rzd!tX|8Imzx~`;La^D`Bm&P zn_CHtr=#wKK#MfMP>WO%(9qZ#2&?U-QSR)nWQp)19by^0JSnzX*~HJJpW2Paac{o- zt?2Il)sH`9Z+!hVn{RBGo!mv^jn$cMu|Ep3k$z&pFk^OLx8LZ%kEFX+ak-vYD4Pi20 z#rY`6KtQ8+c5<#VTofsc@4~n|oi(~wSAZjE3ASIrmS8h&42Y8qrBrUKpr4La<%0>b z8N4Xl>v@#Qh$%a&@>Z4~MyGuOCayJ(f+(XSLbXmPX}`L~O%92Kq$*9IdsRiz)QnkJ zf*S_SxVyS!U8T5jjK^)9&TA)mv?dQMe}>S|0?{60qaf4)!d&*-aSVKi<|0eZn_khP zVT!aNi5#V<3@h_&Y=N-yp$gingudhfb~StevuHA4$PU4t0VLwtsU!La=Lb_!a}1f{ ztr-=xw=#Zywm+3FsSH5|@)&1To}{8`%aiOvfZl@7aI4shtPB}CtMVtMJ$x=C2vrau z)U*Ht-H&ZxutHlZq5;7qH=Djf1mhqWl{`@3<2unKYMWf}@39|Ya75Cp(xLQRK2fru zWkGPmHNw>!Bu&I0LQhmBC{h)D9BG$Yg-mi6TxT3*s-s7N0kV9s)+xB!Mgk%5FXGh4 zh%8`{fZ)Q|%coZ|H9L~-OqEe0eb#K6hc7%~&~&i~P#h~!*+P*BKBmq8m%TTS)%?89 z!_K$eeeTSV!(~VgSCJA$irQD(qSZEb?bHrj*QwhegL?K*1Rc#UOSn;~T`;FdzKU`n zU_cw>a@qVgXC+j~0{>2VkzW;-^`JJ}8>zBFI5fxUWjt60c#Z@O^ic#~ayxMfQxIL; zXQ9$U>PgvfeUcGgu8(U&mxMIin(;Iu8Aq;X*pOIHDKpoT%IVu6P(YiQ=Rpd~F-I8o zb>&6mZ3s$G3PsFb3~m@LmA=;uevlN^$LfX(vUJ|M;sKR{k{#vs1k7p$KsrPQuF)%r zAT{J8WI{C(ZF20$*0(qPzgNy(v{yg(l)dm9U$VEp^|E>Q+3q%uVUv+m)Ki>g2!wA& zg?1%0ipZ##l=kaZtTJBuact{-v)wzFcI@GW-SNoMj-6Q8#?Hd#6SK+w(k7D@`y}wk zmM}n1nk7Mu-yYAcn>S3Myy? z6H=fV9xF^dZ>i0}6Gf(9L}~k}YJM2BGx*2a;euFxJhzNE#1rzV?7u1_O868(20oWz zt}>PZ&IC-j9tv_jHrK2R-V-Md0MrP-g$q;kAA^O`kD;tQ?X4;S;;CA(hPXyvU%OiW zi)W_{6yGWHA{!g}T?3_BcFgsQ9^Z5`*WFfeWhd~BPn9fG(Iak79lRYj$CoJx!9svl zxDW(Qv4y?|0@4VMUE8@P!2(OS;zWloNh;C++m&)5U>m+Zh?4S$LJp_EXTTjGw~#Do zO<|Cc3=zl_R^R{^Kwcns9nJ)Vr}U%jknauHoU}j8TSA)XXQ zdac^rmaU{+XPb8tLtH3KL{0ojEQsII@3w`=5#7buw>C-!=LcgyCFs5%cmieZkKS)B z_0!7QC*w&3yWJ{+?t9A1N7h)eRIFR})JT_6QHcQ1ACm-;)IoO$l1#r)exeQpRMnyM zUB`1Va1~w=w1iyJFO<({iy_uZPC+N7R&eLFf&_&PbYsQF;|;Qn20HGzoX4YTmM!!n zPee)_vl?q~zojd_@b&mn`VYPz@^8$hYbdmwxCiKvp~U0q-#ey^I$D!(Sq)Sb7Y4%D zsFdR4^e6gPA6~q$;o8WKow&_j`pR?mjbHhUo&5aMb}*S*|LCsk1pFZ@K;>g1;90S8 zH}WmQQ=u2Dv6lQ8HPyGL-+<)>>-B!fo_gx5H}X~A%Reh<`g{2?{|uh(9q)LzZSDM= zt*`yf?x47pO$~jKWmsisC>$ z^^pe3uYta@F!FM-{MV zj#2)O^UryY(&L$A73GQRgfg(qx~P)EuhEHQ>l$}6hjP>2uPO)O*XM&!2Rys)Z5*|K zje%fB35?p(K_VW;{w5rfbXQ!)ER_Nrsx5#}I&5G$W#ROmm9EK5J9N5h?r};3ejYm3 ze!`=uBC?Yl61;cp99129C<}piteJWJK5J>^`YA0RuHFs=_>$I zZv;}aWD>dZde(>~G%KWJ@zH0PK|53n$NT`eYIqQ{{3SqFRe>z70{;khsQeCMd7P_4 z6!HoLlpvYXbgL}^vLI<#Ex*KjLy`UMOJWqDk~0Bx1@5DOq)2K6mfAG{@Q}Ntbh{23 z(Uf9T`Wuyp0#s#yPG1?Xczq_leZjj}n~N**E@`eH9Km^aU2sG8iw1$R^2oW$gp6u; z;^VKHyOof+-WSqV2M0)QV)6WHvIJ-c!DMm>G=CHJ`g%e!L*j+uoY4^hYd4&oLN(|VO9j1PI z#xsqHuO|Gy{Gt4j$g|=Hi0fG(5Q5CUmMz+ z&-Cr|3uaf(b5`~ij!;93G8Ld?uu*Fs6WLaTQ`n1OB#i-;acMT0T5oS+Ys;k_z4tad z@rn1?gP;1K-SO!Cwj57vy0>rh=^V1ns>&#xjw3ilXeN=NL_sAgU=%|Vvt<%5hYT%) zM3<8el%&N{c|!OeDbxxHS{#e)yp!w2uJ~J0##Kx4m32I=$s0+_2XvHgSJvxCKdYA-$W zLRYcA_y5*KY~TCO``ta^hd%nF*0WznfIbHkDccvCTy9aoXMlWp81+HO)9U*ruS-7kAMSy^69lagM9u-fE;F4BJ4%x(DJ#I> z08KzLt8hAjH71bbPS6dM`?wnxK4ak8p2(eWe~@KI0yp%DRkv7|Q-V!o=$w#HudRZ1 zG2QhrN zkh(}cVYVm&7XiFjNSem3Ff-u6E>@?Hb`3JyQ5&f?3d)%Pfr61vAR%l_kW_-Az+(}K zq%?}mgCWD2pR3|02aPN)0YW%3888Yif9`L?Qafkm2}Y|+O?$(OGU~eht?xUmRy^f`~r@T z<z^qMZAB=jooSI!Z*SAwI4D9sN1G{qCY&==m zq77qhS@ZVa(3#MRG>Qyv;|CpN&Y&jz3g1ERH<{UBJh9E;(2l+H9((9h@3Z?p{*D2AMZ_hklTTl5tib?%frfE?%cwt`J(0 z&5k`v*^qt*@ycERR7X;;LjY+f>DYA20OY3v_|R0^4-yBo@f!LHZB6->97=~gC8ah} zVmJ&KZpw*4xAnHtTPMfeKDBf+Kkh!H?^$n0vT@!#78OSmG6)xLRa=w~5{92h^RMI( zd(5Mn5Hq8$ldbAEf^>r~4;ff3*pOTX!;P!@=|LN7wsmC7zVb`IXW#fge%~&hKJT-R zdYi36Gh1srf=BZR#~NU3B|w+Z@%PpFNU2;$Rocba2^Gng?8@HXvgyIE*h?>6Dpu>J z_+!Tm+!Rmz-8|%nKJ?>ey?^df-_msc_Ayy3jivvoAW}K8h*m?Yr1kiGMaC5gJHp^} z%S-##pDykGk34E0`I#TKdq46BdV*(d@EN8ewqB3OWO&~q<38?I$Glf7TVg1@K^nBo zDhPn)P$&fY3<|4HQ+Z?o?Szgjd%?}crUP7a2%G;RK_oB=)-=Gse^y>U%OMe%=Jr%r z-!41Q`K7HlsU78^jK4?^BX{xd+8i0*FEmD0g%e8%8~!7rkq zprQsiWH^O#G(kSB63f^Sr1Q8a0!U@%B6w=oRUaxrjrR+2&tg~~`>oe~%I1bGCNn$# z@+o`a51z7@zxXY?{Ki?EPUp60L3;bQp%0e@I-FJdS2~g2v;dG~S4(t&y0P|P)4tgR z=en$|E$r}7vs>;nyX~QNZu;Cdb`jvrCO!WbQl_pb0tg_a(?wrX8s{N)1zsY+nhq zbYDH7Oo%Ss3D9{DqO%AwtNoQT+!Jh|yWNS#2FSTF9@u29tSGm9IS0_ME z+u-XYf-ZVW&}*+F0#*5mWy~IS45O8%&`O5t-pGf`qp6;wT4`0#BsSMPiqZO-t#7T_ z!NJ(R`VW7@p8NGL+O>m;Sv&uHC~s7Bpc>i$ZiU->T z&e&r1e*4=t1yLry{zyHUr*Z=1+D6Wf67zKA+bO*2pfcBB=38ur5 zR_9s`Yx@Ap*z90tcHxTM`S1z*(9is^J^Vu-w7pALZM;A66X5))5|-&j#;Z81GJOg> zS7*Qn0e3L;>{%|sG3-7C+2y?fJ@!X;lqM;Ps8|o<%-nU9S39x-fYHF5Vhm9xgHH$$ zE87y&tb?`0vmpbj3^mVM4ToX2m@RBJo7-%$u(=26ygiqC*c|9!fMC7^*mW?SForuM z*1IL}#$v!9)RLQw$OV#vm?!|?dT>P>LO|lz?69fR5K0t_^&;YwH=haO$kR^5tjjH==O!59oud5Fv|QfsghWnjykMn%A<&*mZ#pssz8rjBlxgarurc5dsF4=SlYS8d)-p-zhK% zh?X+90*2~681V;r7=&K&vGCW-I*J?+AdBcQ35|4O4D6M~4U#ndHwz~qmQl5$^6Omt zkXzZ6nq_X;L_TAJO@J4*S}5iR9^~4&Areqzz$z_bO>3xfgJe4@lsW z;{j>Y0_=%eEy)WJ3RT4=(-IhO?MOL~xU&!uH49a3Q-nrkGO^YNZYkHtvt_>iDiuW_ zSQw-T62lu8j8_SREa|U2Qz?z$a#cX&a_c6ruBiwM5K#U#_D08ZwX>SZm~_v_PB{!0 zTnL7k7B$*d>SPbKBWk6D8~MjQ4tW>2%M|ykvIf#lBsBb7-?^-O}W z>)?axl5q8V31g^=OSA!JF}SYzX+OE)!E^KR-B#9$hHB#YwGPolJncK<_fY`fOOTSJ z001BWNkl^?@Hl=UFh+BaE#D8-eMIh|P>aDl! zmfMfoV?Xtzz3Z=hpRI3i*xsdUHanQwKn8pzioB%6_*J6E9AxlE_dsfHE5NZGAMb^|hh@*Go(tK=X`N@V6Xvk?jG#?b+fa z+5vHDluaf`bMw&7fE6Q5syzT>;E@E(zJm;SRmPaMiB5}FwUcEjfnNJQ_JGcXwoRhz zK)Cv_2C%})<4oq!+PZCQuGx5h-%dSy(q8@S({}31&)LPZ7i`wbqgrXwsG$rBj{^;s zomVH~4`1l_Rm~63&1wMoM|tN-&-&Aa^%qOq*fu+ISIed&P~SPWw6%?eE$0iHPR(Ym zKfM7&29_xQB#|KfBgm+BU4)SOtNrf+K;bc!O|4}QcsCIP4(bGe*~^=ySp+Ul_GdNNhzx=vh7t`3j06ct zV<%IBqlhv<4+9W#%B&upX$0OL+{vNpT<9V+p*(qxdKIZktcmF0+oI&pfgA%npi6*p zr1{d6Mx_a}1QZy*y$cra$_-ERPLNx&Mp!m5JIcUhkji5zB`>;cDIt&Itmw%k0aJjU zU%q8s)U)i_7|K#Df2B=Vh7*6q%lUMAu15+-0Y;J~_aW)O0^X}yN9(A4teN6?KY>LN z$?&OI->i7S-!(Tw_N6-vReOT6&IH(!xwNp=S?6P3cX zH1D`<0h_)IY+%kakQGBH$Wb;*#CWNJ;G+26&{jm{N)dj@6aw@J+QJ9peLH2g#R!Uy z!3tG>BwLYLeR^~5DlXE%INI;<40$pGs{(Wag2)9LX<9KFvF!l4zk3D$Y?tikCw7R>L3Y-?>tyl^=3FQ?xe^<5?~#+-EDlS-Yda$W}#IgpRh*eKFiUz4QxYsT?}BC~1kIKa)%GbdRE zyu+)v`(czy$f?Mc%*2cQV3Lpf3bD+SkQ!;%2#Bp)c5O5q*f;*4FWGay`ule7`PXc= zwQjxLZ9hgjhL^}sRrLs6jdVq&#J7k8lxb$Uxa$>1`8b%*J{A|@&a)?j z$=sXVdtv+pa_H?5ROmBqNsdT8&uUGymeQtccsGZhzGHc{Y&$bTr?C|lW9eV&}@7qTg)^BIWHsIDqNHl(JZpf;u$2djx zI>p4Xw(9?_RS{*#T4C%F*Og3CfvT(7_D)7mEVXovWP#$uSf0ur(6=b?2nP-p0=rr= z-vZbXfH2?+pVz^LaJ?0j2TzkZ?`#jy%J~;4umoZ#e;3HbTL&ZGd57XqV<)PdCIOfO z>IlGt2p2%mg!hu=rIJNoId8`pCovm^UPn^Z^Km^;tpRyh5GZOap@aPb90*jfJPdPG zG2z$Ce)On-BAFH$;nL#>!iIA~iqwYb_iGDHF+gY51Rsww5&V?_Z~#AED1!0;&RHU@ zYiP?Uaown0a?E$l_EL~`nQ2P_^7YaA(DDN$T=Ci|sGUF6suewydioW7MaH9E>GXz^$#3MPX-H7v9b3tRoieU6HBWCBAo%Th=1%mu%0 z7h>0Wi>#yxkR4SzNsf!t5H};@BKBIk;Of>fAdoUY6CQq0d5p+_^2JcHTb~ctL4U8> zDX?y7Un%>!d}%SH8(>2y?VS>d(&j;OQp-l$1)EU!QTK*0B)nsZF$YS5sBal_v%#=u zty*?D?b-gNo}GWAXQ#i@v$szUZ0}Of59jfqe6%!UXIM8NuOPBiZFGc$oiGzSr*gz{9qA%VC?1r#2n8O3c;+4qJ`sLTM-DGvE{C zjWS3Co>bLgshTR;URgv{5Yq6JY8Pf@-QSY5>?EA>k-~?pPW10^8pR?hFpuO)CA9da z{7l&2m{qXSzg~*wPz3@2fg}(FGAiF1j*jEs%F%uzO=;uhgYe~QMynQzU^c71*J&gHC5}jIkr(-F- z?WIj`U$d=S4%uQlwLkcUU$>Wj_bayd_GMch+BDnR!07_SW*yVw;wRtA_44;xCA4l} zoU2^NpZTzDOPdV2 z$3Es|?)w+7!4EmZT)=rkL}s2Cl=~0}GQX~iJVSr77_N}nrD z^ASo$;~tqAI!`)k0oP7x6D?MhfEEv?mGq2nEb8gm~ z_I*ls;|8`5FKqYrxgEV{X@~DIJ9KQ}!zhS@|3uhv%Oll1~sM@rUI_bY8Hl3QGx*)~`v zyw!DaPucA9OAu&^|3n64FX)PD#6CsoZ^!Eqms^PjdN!f=bFCM33VzQz|baZ|)!we^T7zis9BmznDnn9%kH4)f+%PMLP3(9+Q zMg^_37BS_ssC?KG{x;`e6g^wP4Zc7A4x-dDgoMe>hl}82MK`2YRSq(5pMkNSFCHO| zN2~o*boi{gK;R%!uG+Uq`e%S%GRVkAtDGFK5gAzpZXJ8T=cLc|rziujP;HUZs}j#( zeN@?yBsKT8L#W~T!)!g*lpX%G`7YBC!WY4ag@7Z|Lvqcl? zmN{?#4O8cmf4wj(AYS=(`XAv%UaPfI$`3TGdN8%&d|`)<9kF{p@Q6L|$@khFkKJeM zn;SNrOl{mU=ggYoSrF*e7MHZE)HwN(sMJZ@n=;FjD@wqc8TM*RYN@uex)=tjYKLlj zeOE#;Wmo9iI_*7_U=g8oFT%I3(>fK%iHzcZ1bca(N@6+0E|0H7kO#aG2&-*ML=WV~ zt!WA39S>HyW>`^7T2lO;>j3ug`}alAV!v@jX8M3Q!6!sY6{`3QutmlJZGb6aTw2Sx zRK9SuJOqXnHWiW1A&Xof@9Qr*>e4gEaOEa{8@th7ND=S zK5)r(3B18xFK(7U zR~K=!Jo9(=oFDkWqh`IY+Gx1pHM6kj5$q*vSsAb{$c$8ISol~H?4XM^`HU9rV%R!+O3gOstQj|P+1=kX>CCfw`s+-EQ6&aAJD zS2BuG^~r|=cyl#U_999l2@;sWSFa3KEVCB@J9MUNC-9^$DtIYU$K;#`yDFJQX-?T1 zYo~}T?Amx@`{RktJUY)~xMWxhgaNxqP}+LYw>Q>pdt+q7R{7%Dv%-R^XHC;;HL2dq zWK`~yK`$~0s8T>lV%|9W-1^P_ zx8vC+eOvfB>dC}HE{Y=z`BOmIHGdJeGiA~e_D0rV6n=pP|i)iY|x92jKDzOutvS%X%EZtQ^Jeyz2jqFTqu zKCv3>2{A1J2x)Wu++W9a2YcelmB_4MEfToL>QbaS`JRw1y(L~(y}JN;uur)T(dG~j zn}k7?Xz5%8#Vh-uTu5BG*eXq+u7M!-iC{`n!{=?shADu8xN0Bqtza4)u&O#~B^yh_ z9X33bkb$)>Q)JL@CiJx;o6_c})au$1lsN0_%v=Vr%0Mh_As3w4$xb%qy7#SQ5fd++ zkr!GM>{t!-@J5s)Wqc@Koh__`Ok)~pt*YSytb)bTCo1U-xrqQkqN(b%oP7~CTk9^l zQ6`ydn_ai7$BLC!2w`1{RO*K7SUMlK0|Z7hutJ3pDrQ1J3wS+D3^RkQT=V{R`oc&$5Nm|_3$hE(sC7(yz-pop_e_FB zK-Ta1k!hp#o-KL{JGk1jE2sN*@nql5pX}S)r~0;k&@$8QT=O=uR%=EHlaZ_TzOrbv z-|0TPx`(wbGmF}d+7W8|2R2&v?A8a4+r1xu+#dM&V|MF<$E`OU*!W;#vz9sclKdi> zZtItRG@)>92I#QEi7&Ff!SQ0R=dFZkCFDm{Mh=X5-9OTq&}*!*+g?@uaj9hQ@+wKX z;E^d;4CFgLl+Wj~&{_;zzq9Zd2MlW~U{*cVomh#_E{Fhgm{k~1(J*o=?iK4Q>4zS% zf>ZvcR1AcEu3!L&tFp^k^(xE~G90=?+g5Z`BOl~r{fQm_SAR@TLK35rh4`%SQ2NTy z=ThwwfP{Own9gl98rs(Gj`apZd-L0`*dP86|JcsHcE%Rln`n^?b5SctXwak8jW{q2 zlD@Q(z>%@-nxM`;d4S$#CpBO=oqgT@%8z}}{?6aI!4#+KMfZF0C-qgo7oYFX{+ZtU z-p9=BGq$;Tt4%o~dewlY*UkIuGdHrQ@u|Xi%Cxza5K}~8J)7I|(w?m?%^v#X`|RWY z*-zT$t%vO3+MZ3X?W4D=^$x{z(Aku7_F_+Xj&1|cD3=ansNQh}%_}{V^qSGf=xQ7Q z8s*~XVJUQAfVK?KsG33spQCA#yWQjT9W0iS#V@@*%qz>B@!-3$`o1@qpPwnc# z#3zjdh$rv}pHTJ~*-6aJBux$kw+v-Emxc?X(B!uYB$)JNwdGHlEDPHr8zE1LVqm!V})Wpz7vA$n~>T zyFK`mvm$V6pKaScG3!rzPOhwPo9*7Yv|CQh?daWe+qr#d>$~U;Y@c0BdOlvFO&g{l z@;&7%1gO*!k=dV)8cPl%%aQ@4ULgXt`q>KpSHfJ88VOVh90XWg&)5w}ARNmk!jFMK zEidJ^@7j)!5kaRQ82X{t4q}=1H3*%8Z}f%h+?R^R zN-&@5hzsKAr82OrZAUvL$deR2PK-9U1J;>&&f@C|^a(_H6rFCLrKGSsS zbcfBC_-DpT7(0n%X;bc45{<>?6fwY<8p(HYe${prOdviri>F1zIc3i6;J(u2;S~x< z6|qz+NjyNu{0R-pg1%Njf(tSX?Q*C(QdaAwbCio}A&6n1%~$o63W6lby|}B3WH;*` zi2%Nzh+_{3rDw%e=!s>oMcTDIGsH4MPIqOd+%QM>s~rz5HYaLD22+PgR!u z5>(D6e0vkKgNbdfuh|`sobZ10dq4V^9X)=l&jZ-oJMg}9R26h*ENWYpecC(PH^Dh! zD3OXt+!9-HihA{levf!ZBs$24#k)vvgWPQRQ8P1?G?85U(rG4;stSRTqk4z7BuH*4 zwa*ipJ6>zo_hG;y0Vs~~Q5kn17+hv>ly!#~$u9|C77XsclF?KGDYN}jU-^W3Z`H$y z7!zqmBa3lYYgo*9>V-0Cet9(l>0)|5%4Ej z9J(u~CbcTKfNCZm36abyD;sh;?HEN$mh$qb51KP_+X|A|PG7&7{Tq{ztPRu;S> zBz%gFhyDo8JhMOWQ37*0h@)lQV(6PQvssFByNntVGV? zuL*475cDBBI82`5|L4S0*qM|Y>^Z+*tAl(P3T2EJkNpdRB3RzxJX%|65OLEzBSAit7KDVBjgg_jejC0kZg8?Kqz^FwBEVTl|uNnb*XC74qQ0?A>LCanwh*y>*f<@my0vYwF zs$4FJ(bXVB#u!4cARdlbvZgEn)-QpHYzO|UcM#|o0muvEg2dPU?9_MP#pt`$7GdpL zPb$%MTH>kl60hVk_PYF-qYuZXh>Kc%EU|^fUfiai|b*zPBMwOMnS1amzBK^@eL^l zv7%=Q+nY960kUi;Z{5i=1erl)ggJHs zzT%(OV?J2gXbrw&GVa;Mvu0;r>e+?w4D9M#eLL7gV7_c;nR}l(C6M!O;^KiL8OTMj zj*6_nnaXI_R!+67%mb27@ zLQ*-r>|iD?lvr(N^B}IH{tN4@>WTVje)~+BXfIpR!Cg?&^y0oo@L_eH z34&_M6XAUkM{c*iqid#ZR=^Qtwt`G1iSSn`uxjS0lalcp)-lLl(nl3LsrOXnCu|1& z3rG1QIar2t3iEi&g%U$;&i2fT*dki9$vIZy+6l+e?5evm)a?8nw?}v#VD=ZT;TQ+^ps8dd;vee{TNp z!4Dp{!SG9F%X_R%807SGc)b$Y%4mky7F)`t3!@r7pNLFLE8s2mh?uT9*u4YmUAkgN z?!3j``BR^=$NuuiY;$MRuAIN<1G@$c&^fLe3gcXYo==8VfF*cyy1C3?VIFT9VrSu% z;i^V2;tG|5!EocA_@w|)1U6yDpu8|B?9nYuUg%UCfX8D;+!d8r20Djl11^AZ+i%(P z{i#h_L=PBfvl=U(Ole7t+!n^lfcp&CA}W`x86&!W;JT=byHdfAlT8bn>*#W=mUcZ|{H zws63;nD%UX(6iaJlFpC`lI_M6!FO0nKOad_k7%P8`3GK9Ln%@{UEj*htBDjzL zo&*2UON$HR`)TVqzdXqO7LbzL^6z+n?)sPZJ+id%__Wl4Y1P}822TVZAW~*J{J#OpaabnR;|1JaK8lXW4 zIp;%L-3d(7`U-ae42%83g%gKm`Za?#O;)XhR}!=}zytV{e{4ZGkGd@H20}-tmB4P- z{SxNv07&{EsVAOS8EFO6i5;8(QsAT;N)IAqkfr0zT{U0P0`&A7lEFe;+@PQnK%91m z@}crtEpr6u{w(x^TF$5(VJUQAes_av%l5n0YrcPAy}f;FV{MO|xZUpm#CyEo z{Mf_yT7NXK$^O_T<1vqP#ItDPI$GY6$8@XXoq9^b;1S&xM*lKPXJIKxvXEecLRWH!x)JJKs&@i~5>JJZtXP3$g0>^L=)}U= z-mMBu+I|J!lCwGk#orwndaMOT?`74GATQQh#3x`NGy>c#d%|EOeT|y0iNZATI@Gy1 zP3SsGlEU0@46jp)F2fMWuZ9_AYix6Zm`uQySjwr08b}6hUP}&Ca$i>1T~Whchiz>* zvX{U3jQzpi|Fm8F&Kovw^NMyhpqwqEruGy!T3wqS?0C{4#m}t-2SKb9y?5-eQgzpQ zR2GZp?c&A%(O$gkADDe+R&B}6^yjhyH`8N(m(Tja4<56neZ@wjd)*+mk3Z8LY6S001BWNkl9J8z{$3LeCM;;cv*v79)ZTqMh|Xn@4d1MFa-J@9VtMF-K2cDZ&iu`Byi zKli)=V};6*L>49C&tJ~&CR-|JvbnZqhj%t@ZPcn0+L1BUv2xWS$k5+`)EbD>^VKXE zQw-cIm3$G3(Ago-DWFi!jwmlG3>4(kX$eFE@Zn5wV8CY7OW7z$OsYRCk46;OE+Ntls}wohufzLPAXlmk z5aN};*ssf(XcquM{g45YsbLOCTg15P>Ws zCE;V2ZI$cBDG4ITm=$Jl0I_Vc!`TtO9#Fwi~|q*M;-CaUQ0 zeJT+d03pB6cMP5>-UW6j0&(hj?2!t-REp`>%g_=N!3(HY09;69l+BifbTt+c#79(S zPC+gf2_SeEqP}KJzDrkY!>3SlBlUov|q9Xl+D16(Tfh0 z+umLNkPqwMR3(gt5<(QRQbu;P4(SDEL1JJzPnptSHpG5uUxU;SdrNy9m|FlSv2n_J zl5MzV8=T2DP~rdu$H0rJiyfH6$^>P>WwSz!vq+BmDqjgagBDL6{TVwB&E$>zG%45h zW=nbgJLTIyGhcX><<8Mvo9|8RnSb#m`@_HgX`4x*X=HE;6CaXa7pqXq0x3;);)s=k!t}NF`{q-d@Hgal?ZA5DsonD6aeMOTe$wuI z;vqY@yzl2&dWlgh9d*Zv;M|p#rE_58a?lw_Z+~D{Onq zYSVdkVhx=2z~Hm?02PBq5lb_c!~(E)VK=GJ0MdOAHm9w;eSd7%_S@w4dGw!xy(AsS zY0{o`am-Rm{mZ*=j7GN003BC4yv^k0!^aw+i=1Im&rE)nUL+x^piBww&c1_HAuz z!!|ZHZ8DzO>o1(N7yreV?XAy$%dVZdVDol#;Gqq(bxwMRr7y}-)|V?+u?z%!H9%LE z0+1pr9W=p=0Y=;JmQkOzKJ~u0J#F1Ow<8bC?T&{RcI=*|Z5>|NaIm!5WMR|E5+^J! z+rMx@`d7~c*NJCj^!-H8s`7Q;{Sx3RA?&N@ zM@j)RgWMwd#>{aG_(V*=M(d0RyhTb3WV-_|b2yhitgM zW_#E6Y_fk4Gjd$#bz82ZXUd~An|7}Z2}Gi%U@q5nW`tb^FlY_?416I%5L6KK+^-^n zs`xa1(R~X@BuwwuQIg_cGy|vxzOn&o_(#5;3Xi~|`w=v6!E^N{Q(IoTYKL|<>=QrtlYTCGGYc(9U(DwizNBmMQ3L{T z4Q0mDNvkK!gDkRxzya(j(e!Z{B?o(16Bn!{9c;WK!GvB2Mgj&zhBgDtZt1Pmo}XsG z0Y!!GW|Q2CVOM>*S+ZQ0O$NOUh}+p(w-%_Y>^~e@ zD0?*kST}$P8Z>ygBo+d7WRAjHZrQV>44{^8)hVf`uZl24CQI0XTd~)`1D$+HNSi`Q zWMWcw0>Hx$1>l0CrGyFa$~}~ydywAm+h~2wMw=Tp@0;zPI&W`&Ag04)DnGk~4%Q;))Nj{9bl7H}?YZDV0ON0&bJ z{pfvWx3**2ZkyTqW&@-ZZ{iKy=sX$nco}^0lMN={9ei1xj zp>a*LBd9CK?a!0E-HwXeyLOrCI`n6)(|5BM`yQVa}@+f-&_Ev%rJzl5$ace zqW5i*bBUP<%s4YRhgoUa0IgZ#);!4ofKcxX|C`6vRC}uOTV*>^PO;vh3#vM)rczn< zj$h!uur&l1;g?D_KK7OU=WRqu8yeLCXFfHU<^5%hF1P}Mst^n92f(UtpUx^*g$+$k z_v-}8BCn{col_w??{^)IL^})lf*jIrkW5glpiH=eOk|>3K*Kc>LZvSYa#6_;owiI{ z?pbd2FT?m#J47|4%}@EK-bVqN+Ol+kQl76Nz^+&;;I)0c(?Y?c*L2P?gKhQ4cKvgy z0Ei$Yf9BN>@&odpWnC%y;-J#36|q3|h!)Zxmd=~|9mAVs>53c#lt?080cx5;=%0I# zlJteQPVyz~fk;{%$)x~5#Flzd+jBG-R^~Qhm6XB`DXW)81|R$$-$n8y^;3dO?Kgs5 z4g;t+UiFpi0f;&T@xTH2pRf+?&rNr2Y3)?#wT-!L?6gBj`nI>%w{x%c?Ci4xyYSM$ zE}a?J!GYPrj|^Fut@TmPPQobOR3&?g(qw~Wd$bbH`srCqRalUe0);*6%@?-ZYp42L zv*BoD$KQ3oz2gVoYbQSbZri=@PU{bcHrYF{aSP5lvD{4;+p~&#k*JZ$ryLN6gl#W= zD#(T6YDHEF6ZTPG6+|Wiznmu#_(*}jj;<9s#@4%9(Nf$CMIu3RAe-p>?s^4iOx8)e zKO^bZp1D>1q(_#>b!T`$WwmMeui9KxfrzbD^%j^A5RQS6!>*yF5bbgcuf}a{Py=MD zogB~U`U$y+pXvHhp&7dwxWm8C%EG{^^jq!&`5yYZ&-tL@` zQN~W8;9MVVuv)R&Giv$P*IRS^X}fy$7wp+*|C^4Byb1rZYFci>SNJX-`QxAXoXzK- zuxUFYPs$kHgcn{dyDdo2m6+beWv2$@$+qPa^1DsIyxe19cHy#Z&S&=cfAGWht{?wC zJ9@{hwtwlGjjxTZ*PH}}IR^)sLXYnm)5wjTisdUmh|0Q`bSNt6gkAOpzz z`VaHEdK$3M!g0*{2N+=hDDYoEOcEw|6HzL11O63e`;%nJRem$tUq`s^1zNN&~w^)aTu z`+hSk>`z)FYA>Eru*t^1#nB&R7warV}@NJ3^Sts z{$Z<9Z)mm{jL9U1LKKh(&<-V*%$L9*&{4i{$C^|5Gb@KIdQ0XY;N-q?FdmMW>jo+c zc9pH_fW>qK%$%~Cihw(0fno>uf+uv#qNG8gI72QfJ5=le#DM~7zJNpZX$T{ z=T?xc47b1mCsiTcvLeJIvb0>K|uQuexlG;Jqfc=e+sba9~iirvh`jTZV; zk#q;)e=;+?YV&=NCf7>3;Sk(6JBKQ28?ZsNuF*y$IV~yaFa+39zZ^FRa-@nle6Y56 zd@YL zzHjGW?c2encAVPMmK#g6wU&{T#mZ_H*m(WCXtW54PU(&IU3N#`E&b>1BTcx+Q?qMh z8!YB_=;$H4o%rB8ZRgg*Hl55ob3UI=VHb<97A=*Jwt`Em-e@n2=KyI( zjKZKR$yMoA&ME>1QCpo#-OIabd3?XRz2m}Z*`il8E(lGX*Itoswk5>+yE$OHp=2y@ zL|DThYBG%kK?)xe+nJSK?MIkXBH}Og6mpnkGKdKc%Y-99+a!*U8Su2Awq_oDhaFG5 zpf`o?CwWHY&q^r;=z$MJcu9Zrc^ww{ObwDKFfxe&d>@sGr{3|AM7)N-?+|XyhRE9E z^rNG99<%+c`}VEh{<3}h|NN|7dj6Cxjvwaqb{e1<461<}WoUI8i}FHRA2|=2dSPSV z2l|sTD>OvA|gdE7*>Gt6nKO?FCa-jGwAhgxV3KUEmJ;U+Qrl7?Uk=S zXD|Qm*X-hpuiC-hfz8*}Y`M7sV=bU8R$S_}nsGr)rKQV1M1anh_s?~SlSoxd=$fCL z^}PJOwGfVmeOupM*v?%GyXC&6-P(fnV{_Zs#yw~4c(y4^n#G*2tc&czLZFt<3lfG7 zC~{&fUG;ZO@FYA^B|al$elBc@SbIp)>OaDaSPnSlE@edPP|7N^jCZ9>m_cGZYPC9i zXwMLMRRK!cg^%*dD#=;Yy2L2h%81;;de!nv5j3y@6dry6nLuX02Wle1r)K|U3!_|t zq|R#JAJ<3!X$s#7yj6l6Okkpi-GLn1fO0Hv)>eAQlP^8ocm3EgbdND@|xLwu! z*|<7vtLSJjKF}d|@G5M1Dt0B7L?WQGtGnzpO2yTN!3wSjB6$8Wrfk>jA$?Rhc-oud zLyJ#Rs2{pO2V8~A2+;q{)q_2S6RzcR3cw|h2joO3%at!2#{B=A0S0UzPO6{VD5 zhD{A779XsHZpDXnpkiB$@yvSrV_WN)9l7T=yXRw%+k>BcpB;PXZX2$TY`#D7tohVS zyl|=yF0aMl8daZJNgaPql}f7^fEY|fC=p8A$N7?NOs=Qx|6p4%OcnkGL|jlTWKKl< z1riC*fm}h_Xbi($nGHZ$(;zy(GlNQuf60my1kQLCVPX*YrBY35r^-j_8MdvokX3i8 zio`-5hc6|_BVG$l}-~6)8Co@~#vT5E&;y9t$Xb4e)X6cGP6S|UQZhT)xxPuQ%#j~>YO-I%@+WP&x zefG0|dqs0^%D-NZ`fkeC_)|P|3(zlI{1sap{ixYu=;O&SmuNnyvaT=kZ{Qq$W)L}?FMaw zXX;8hBnb2jXp)Q(FhO};@rW6$mkhfAlT=1J*jfT)mJrOP*~&~AWC}^RESYwo#QwYL zfU^x$naWigNKjw7sX$t^a#5Zskj^zIb~mq(Tl)ArTsl@4xP!8jp`oW_gRph^YEUIRuum{e;M zo}kl{FYp}}sh)lj(p0io#XjJ2@sk}+-Rt5+Ks17BZqorqC_Xi5_mqg0q(S3yBasgO|l-LfXl77bGV{1rr^ z%Z$ax%k#GDvh*9KI&HSr6Q@6ASugwmj+b(9&7eaBvDT%Mhb}*~9od>8asslA;7c%t zPeNtD>t}hqcj1O#NgvpG2kK+kA6;8fOW9AqcT~3G+D$KqZC>d*`p2hZvuhW7cJU3f zw_oeq+iwi);+ejUuQmI+!~nQ;WzFgSA_!3B7L_y>m!DhhC9jIx0TVP1%FMT3^Mi@? zr&HV5*|gi=akt&~@yG1MM;^B$_uk?7b8>CZrhBd5yq#Lp<)9>1ondP+lK~G8+mv5a zjHc=(*&?_e**0W;k1J^aV$n{tPFRh-_nKzEioGvGB6T9t_J@DsYF8rM6ILW6R{jq*XCXg9uk&@bCmJ2O_kqSjr5lT;2%{K5HgtI84v4gFR6dr=HvQ zN4@Rx1AIn3%4mDTHg>k`&9A;-U;RhFVXyqrGiFD3&9+8}p(0UN4P>cA3Aj>$Z#bP! z`&j~#Rj^0h(vOFYk@E@ef6xBti~qUS=4SqHH7hssd;Dphy>Aac{L^;imjA-~_8yz? zEc+Nu-ZhMnW*Y6Fbjxi6ACx5x7QOwF*$y>}H05dkj^}2V_iVUa+G9Wd3H#7r`!{Uk zmP2;nrA=OQ3-BCaIi5jIm%Jc9M?e~nm7tzsYX(SUHUV5BFyZhKPPZ>T^3c!LCynbXSW)1r z{_TyHLH7W?(dC%TE@PBNoeXbSK7k2lSW0$C?|_(_L9wqZ2Ij#rqInltrDU{$Z6!}D zPMCjoj#vK2Eh4t{f9IKYlBhvCh9|XMkHgIF2BmZ*) z53Q7{1?rpYKIy&5^V=_-wv(TK+Ftv@({}#VH*No5Y>PqPmTh=PJN_cT1Cfwe)e!U* zlO%60M@h!Klc|tr;yUP^{gIVr^pe6hJfxkV(1zhGZMZqNBX=+D=sk10<(^jlzO?Pb zZSp(LU2i7{pa;1vOZK|8>-zvM9eWs6Hpv)6*2$>zJYN9`51hy_i$uxcT+CCr{DksH zP#mB-f@JQmm){4vym7`WkeY0Yf*)EJW}s5pi7_M|xK-FB2#3VDX3ub406YS|vaN9P zuoKwM;>5LfGu+<03K%kJp0LfYXP{~-4#?{{Dg0ILHZI=RxY?FvhW3^+M zgHixBm_|OI2e#Y*k-#F$ihpvOuJZh_yE2F2}~UYXU!xOM}c( zt;&$seCLuil}toX!yV^-BioJBRa^s0zyY62y%QOr)*J$Le_p?2#W1{o2v^57WEDw# zE$<^4cPzl6Rq{pwp~{)d$SUeaOPu7wpq;!RCenKq4)@iM%xv$hghV@(r)A80cKJ-t z&cD{TvoH1R%9(*p+l-QyG2d+E>`fkgl49p|iwR93tA7e5rYvNX7Zp1c+hRP44`y@g z9ZYRx3){JM*KU9OLA&q!pRf}jc*M4k?Amy5YzNo&Z82-rf-5KW5UT{a71?QeJMFcf z9gejTL8)U`asGF)Z<5JE;)b1xa&86crEEQXaUqWQ(thz97p&V1*T*@-(b06WEuY$dOvN<#oM z{*Wz#0w z;`{!IEf@c;2k7b*slCxbFQ+^)by-SRlc9^@AS*H`1}~J`SDwP$`j9SMvipDFaeLoi z|6#l1(fhniWqfrX!KMQX8D2T;49wgf)QlX#6^5vgHyMq@F2g8zSY~rH zq$vYYFyF{V_)r>VwxCmZL}XdhdBc(8y&~w3JrQ}r-ZJIr(ulm$X2?BZPSbHX%r;E>^po2q%JS$I$av8~z{|E>*oH78P=tiVr0Tv0Wv`BtQ zkR!lTm6caMQTN5Z0I=17rL42SQ2VHZ6Arix8DsWQ1d`vel@KbbV^CSzLSp^-nE+%3 zF$OSX;HY6eOf(zgICxP2w~unDuf7J z39y0lOCZ3YO59ts`wr1-;e$V8yHWdIt)$W(uDqw@J+f7bwH0K`%#zR&msKL=5=V3b zgCJHZTV9nFCMa!+?@?=IATfi1q-p;|HW1ebF4gsw<;);F``3|uM()tprTrI*L|cXD zh=9qLlgDIIH&i>3z@GA<9@+?Y*|Jvr4@@misesL4@2W_PAWorgdft#T>J8K}?GtPl zgPrJgZKu!34=O-`d^*+$f}#rs5O6@xol2*iwxg+N>a5?~$q@IO?Dy=-IrE_W+^c=N z@@C&Am)j{6UL$GC^_F61Kp;2mo2MOIVbE4tmxwL9l{Vp9+}MOuXF{j7TFtFDnOJ{3 zwe_{3-TIEZ?A{-EpWXYh$L;VvxBKy4(`yH|n9n%xTgRY+Kgi|_J!cYgZCUEEdmwPj zGX!~~v&_|+Qv*-v^v4T#I)lOo5DgSv+y7uxiXxD6$%eia02$)O7kl`jE2fTv|PI5`ZGMgs+sz z2kzxaV(m+m_0w(#7D#!QZ_76cIwD9vPqxtZgYahNyHx(E%1Xp8^f>Vbd{gl!+>1qxWxcM?7j@T*v0+I?0BqyC~dd-mcBlX`pZ?`>sx4rWxpR{-WYag)noejJC z_7$5qStGa;fX_w7HN&7#B1^+!bvU^*na@tp-~;{fZC@jgR=F z(m&~_fRk&W!Qj3aHwV;hALxKEiIiYT(1zZ{MHJRJ!ItwrcsH@HS_2*H=a{3x?Q)!l zCgAIQ%=VlP?AxUG(a;8KBhT1hJ9o*>JoB2p@yE~G>8D?`{d1Rm*xzC>uw^@vtyMC_ znQz4ahptqe;|~KQ$&d?abxGOc&boqEokA1*)~7yi1Lm5HENx?RXg9-IkvR*?RMOpr_M1nY}!iwG2t5tHv&k1ECs|$_b@0S@#h1_H0ZFrt7HqhT=Jr1 zy#41oX0c{9VF_1PdNaIX*<2UfwcjiI66At1xMXH<;zDLwYIY>F zGol{`I8w?qTF4lbzX!QQnGKRg0JKa%7ZB9f+xo&}Lip=&C4fiBOawTkHAKKaW9ic7 zLXg?|UNJpdSz_!Lbf;z<31R6A5V%*D%Zi$aL<9v>mLRUIj;P02F|eV9V0JX^plqpt zS+z1LXIaT4hDZ%moh(&6GRRw!TjbBH%9nB&@<7bx8-E&5R%*Gj4v5 z1uKaH=yp9Zf)mAyBuEpJlWfHERL`#06A@M{IK5;SCMgJt7`6gV2GaNj2e5?<(?%(V zqFj{lsMF;efrjLRb^*+kWFqY%z_;X5)H2sMWQco29grq~IG6mX8m9pHz&KrVTAxv- zIkJR)aSoR%9H}HiWRR>-N&4cu-2ZDegmbQFf%aWHSHoiENNgrxW(xt_LoI_bg5U>dWQ zP#91BDBbm8-*)f1&F*^t!*=h7AGKqT++*v9w`|^m^LB)+XU!!Efyg>GO6#WoO5TM7 zY7h+*3qK?u9~iO{!}^>8z0i$gjW*Y9=axhE-0weSU;pLL*x7Hsmu+qBr(CMqaciEj zW=&&pVktmr9{o?@=?TXD@3JVeFn@x0G^f$P`k70%xwUC0KKZzP=->a>?UwuRv@364 zwOKRp46FslB%caIn{iR;a+f_73hELK0&nE+OI|0R9kDf#gzm4G1wMfDic%mqoZUfH z2nu}0ZLSS%XKl>} zLzPoyCPc_h@2UQ50Eog?`@VLMxMGpKv)I1&(X>oIUBD!aH-dC;04P1FanxP=yasS- zEy76vPX9Xi^x?c0{Nefz?; zk1cHb@Z2`H%|;`fsqJTFx8ZUvOXF3)lwW~%cfN(`Ro`=&%@D3f<=_f}tJx56EE)08 z%K$}5QhRw&y$BqxQqp|wh#rl}?{_P|rNJBYJVp4bWNWVcpasMM_Z z1|6#w{(?Tj-?0GysIZX;(e@yp#0!Ql;6p0X53nBD5!h#Kr?UFGpMN_ZAPInu$VFh7 zsqprloaUU*@1~*zqDfXriSx?ZW7%i?Jp<|-ZkM5}+92Y)vFywQ#@|b+YAkNas+IEp zjz0@KUu~tpurhWT6ekI+b;SECTu_^n_8=cul?B?!Ds%FG85}5Nu5u#Ng5{1+AV`Wb zb-J$V8mnzDrnW1=JGL=hDdi5GMq!#x(E6E-SzhBEEP0P=oL zPA-utADQ)sEl}#&^q^AP9?T%0}Y^ zo?K7AE}ttZLpm-+6>m7}T$LtzHu+E)V!#7hvC@JPBy-phRI}DW!Pu{~iL3LNWzMzd z?HQcU=fi}32ve;}Jz-U>dx|s+fQvzU)_F@(^!@Df!KiQF_-CK7Z~p3M?aJ9pW;>f^ zo1-!uuGo>4J?VIYVz;55lFal8G_1)M=Hg~TwPny-W$beKAKMqd_`h~^^(OvH*EZk8 zFY>2;^vB=#gSN5uw{6(}ArH`77F|OhI%uVsL!q9|@A;PiP%D409=2i@1>aW=e5&WM zcO18m{*AwECqDA1_asgB#&r4-3I|rs^Kf7oT)t^w(l`}U!GIfn5`iiTHp`$08njT# ziXp>UWhpW24cvnp+E|+mz}o;3owk6ICS{IfaI*X~>Tl@K)xR^FEo^^+^Ux==IoL-& zTbHa$U|~R6Xb50n+K~Z1+yp0rE41=#dKyKa^b>30PSh6(y$bc-fccWms}r zVd2|@YK<5iG1f#6U~}3$enjQUnP?(?XI%Rx>W&}zrF&1Zeju1D6O^+$FFZmSwXK%9H+ zDwF3n$2-<)M46Qe3|*!Qvo3y+?Ia;`LAay{dcPS%J^vgB4=PTL?0BK^Vq03JN)Y8r zffsTzf``(3STZ$o{t9cl`v@KL-hWy)7Z0|J1fY!v<;N?T)o}_{fHIg&^06A_d?L3o zd`aQLnvG6yUV1bkyyfmyKh=ZGfHYqZZ%J^jZ_88w{H-D#R^({uMVGSL#g7Z?L`!_E zQbnMLL?$%f3^rAjQUuJg+5B9P0U|pgX+d(ZJQu*453;fi((@E&9P_67k-Co6$HDgV zVk;=7v+_~;4twB4qzh6$50{+lF9NFC53Ew&KRj)K`B+DKLeCuYL2@7`{dDJfGgBxz z55lob;f`g4K(16`@cHNnD+Z_{69}d&nzh&JI*oB&PU8mJ#puWrS7!teORCLeR$g{6 zA&>$C5yO;hwL$P58|H3ROD!;OQ`Q?1x_`N6SI-RW>Y1KhdJF#^T<+Vn9hcesvOZcBUY=7s*U90r%+{uSyWba871j{xpex8LiYI&S9-vMnczw_ zJeSy~nr*dJ;8}rh>y{NO9W7nynRK79+Z_cFDT4OT2;gI*GB5_oM~f%IAx=>0NJiK& zsi0tw>}ikWHGZr5h=UcKqkmgg_p?(T-Y z_pkr3J^XKe)P|dDHomfFGd}~IXPj3HQ3bqnUpZ_9S5Veg>XcJ`#fG+DB1RJgRNq^7 z5Mw7GYR^ytNU@aif9_=3Ej2Kr1kwU4$}|j`7gkw%kg@5o-Jmq%VN08}O!{Q%N3M-0 zGw)9iGtY)#l^M0dgch8)&yIknJI2mhZ7oJZcA9;6@;q1=-YrL@9n=Hs9)Xpp7e9i zziwy0^SYfo`If!iCcb+{y&3nkTbYx(Ia4mdZN4&XS4(72=vL(3RYANr^fF@12 z3-HJ140}-JrevVGD6w?fuA+P4Cc|hE)t2)9u6L}YP9-S{04~)J^e(wVD<}qPugo8% znWTghz6EHD6RdX%<~RS4E00AEDr2<^F6}f)>6m?>jAepeT~rxm`Phh;IBcs*0K~ia zJ?)o^GD&d_ebpvWMp#5#<2xp&L@t$ulp3wd9IL*Nr_NQA@At>xv~9_~Cto8uwn}et zJ-kB-ttq`hBX~hlw=DiU@<{9&gZwzhkT+5a(Y|`3{+IxEmI|sj2d5~Oo z9&p7^thhVuVT}yC!C~PlGaPQ1rv>M;g>A17Z0ok8cFQ|X*xes^#O`?PKHIwWu=NH# zn~!HUA5UW{y0V(>me&X9sM3n;u>4;vX7DAnkvziE3;9Hx=+qk$Zo)foiufLeP|##$ z4I>f`g$pV}=E9AHAs2zAY9_VmXlUSdoF#2<+QJxSN6g{~NT=Q9;}W0KTFbY}emdI* zEE8fN9KeT;whVrv>nGwuouC+BEdjdYQgK@ahp>XP(y4y?n%0gdBhqxYLNYZ0I{-)} zw2N(q4U+r99>W*wf4Q9z`@?EtE(S{cb?hS6IkAa^Dg24rUlwNT+nYAr7~0EUecrzP zzyG$q`L*xZY;)auM|W-Mgp<~<7^V(*ks(M4${?jEqVIR{3o9xc;@cj(4IgfXWB=eE z+2r7VvS*+D=IY09*1xZ~wwv`ezRTx+|A+ru8x8+!*M`XihU+>YU+xisLbdEwFjpk9 z7}U&qD{6&DYf7>>d%-qsVGsV$NA2A|`J^3t=(tbyoa{|dg6h{{e|6a3l|DThX4oVK zp#D7tlPKY*X()YX#nREB={PgQqX`NS1S_bh$P7y-1K5IAl_sk6DoS=(3hqPcJOGCQ z)RWa61vrLdpS7MXX4Bh*cW?oo3ntj;+hEYQwL#BDgMkO=t;D^XDNEAAzwKrC8O>Fv zDU*kDI`O?07<(q(gJ+fr>j zY;kpL=U#iuUi|XY_Tq1R$u6C~=;iJ{L@ovp5<_Tf0yLF0fqNZ(?gr`@lbdyV!k?tq z#b;ntFv)_JQE$Cf-ml)b-n{M2($+VYws~l28%LM6eavk4_MYwDwy^D67T&YofToi; zEwj$vbxZz)#?v311%k5IxD1!7b(+=s|197ufjkg(U(C%BA+2`nL^{JQjNiLtK4!vbIHO+ zO=kAFRt0d=;~&olivWh6z`=Pb#)11Q!;yR&se|-Ak@d&R38T7g)zOqSwA9wd+eRxG z<(Y#?m4)n>7J=v>jwH89)R8ypR>tvr8s4X`SCMEh?!GF-BwIAJj(XP!IMi4s5=uOm z?*)l$|8lbvB9&>UB&XV#s1(a;GQ>{L#R*E^a@g!IyrV-80=RKS35A527mL>1o zrBi*odd6(;?Yq(9SWZEJz5ejMFxjcr=62)u4$uiB!sp-Q_*vGv(Lq zI_<=r>CBHFz4t@!wEI5%ZoBhc57^F~w^(C#r{jq&CR1C?boxY@x~*8mhv({CcM?Iw zJ|GnF3{enYDy5WMP#ckE)waEE{s(T4vJh1}w5xGlyc2>rV!5X2ZaQ+H8_cJ|T7dz1 z9xkui@aS(vhI(MAIXp}*Fs9B*OzvZr@{^>9fUV0L<8in)F$i(RMwE97j9RudtGUX1 z(-x?#JoSa7u4KXO1ty>CpW=OJOjJ4!!<2Ig<^PJakT}!d_}=m!VVpFBgods|@QWmn z-f_U6?+^p@z-hu~ehc+y`fw%UOPum9>F+Vh|OoLxS3-j=)D)@zj^ zjV<$MF9!5F^imT8@=bd8f`LM;3efdSuY$ZbU}_Bsn11gE?2rEFv)A47CjLP|DmU?4 ze7BGO?)UyJ8x8+ETOVzpp_FCr>CyNnTCD&^EA*Xzs)L&7#ZqR&bJmqtkITg?HfUw; zkKS+Z`KzC@hd%ipo3&}~m-ca04%|QtUO+d^c8QvS`*mFgq0!@5&OnU5OPT#(;c)~> zVA&47YwRI`GaU-vtAYVI_O3c1ppA+1oEjW}su)ZMHf6c7w9MAF9<CFtq33_3E`a|d|<6v{x?{fAA}v(fP- z@+vl$tgj}l)87EpFenf~LIVp_&j8SGlzWA2o%})?y~vXDo#pQF^%9V{oFUkNI3xrH zAQdf}*OqHq^h79tscrX&Q;Yfo+di^whYs!7;$Uj0o_X26^_yR`SN`SK?CQm9w%lAd zYs2GOpwsbm43;y>%*frhO?9l*5UkYS3I*KAR@7@0{}ShDp=1Exj0x~P>owrhdh$K9 zZnk~MZ2Rcac5a{Bq2q?W^;QPI)mkl3y6ffdGn8w#a(HeXNkQ_01ie^=YA8w>`$_<> z%xl+~r`bZ$3yHAUHYr$U22@%plcIC9b6E&IO0TKT#*NPu=1HZ~9griy!GU*DiO%kE z%CAeGju_(j2$6D81r$|vWnP9RNry$&P)pcO1lwBPKtv=0XkW_%A^w0IbSegFysTlG z1hApt5zhQI_vZ_1>EtOo$Qn?XURC!oPf~PhGdbzE7dye zF{j$cQpKqef}gS=is%HC)8@6?X_knKML7v1ZLk7#rR(GfcptW6l^77xUqHElA25L-T+;NCs1stuT7$SML!nApvfE|tc~IfB$MVGtmOu_?xWg9< zKwilt9A`PCb@kMO6@4l@Vs;L=v@p7Y5RPB8kLGy}=}@!wQ8!hO_C~ zW#k-5MBzv|rDWSThW(|VTRv#BorXOp-w&=WZSU=#T|GCjYiEXb_1w~~oa_I;?7eBM zruTIpcHaGNGs7WgxQV1BilihiBDGNxEk#>x%axbJb-bY{j36KSp=i;-4Nx@S3iL}_ zGzq$*aDg@sV4w+VTc{h`lp;r#EsCT>$rLw};=XhCyS)2ToO6D^bI$YJOV^e3MN`ul zYv$hfeV+evmfzWB|3csT_}X|&Yx>qmqxI!Bb+u$Y0f)qC(?AbTXl3dnz&W6|Eo{WkQvu zXlz^iOYw^|*mZ1cbmn)%eLNnUfqv=i1$p3q{*pZRwMQ+RRgP^sZqp!!$=-4TT^4IW z8d7i7Ul3*qj1p2)0q|>v+jMl|NMycPO0)V&dE}9=c5na3`QKfg|Kq%uAAIdM+wQ*qQS(tshK;6022N8|zBA>AXWBZF9HOhuHU z&TXIE2Z2#fUEXGVdMagrfD(P8qDY=}fymC~OhjTcHeU}TXVudNaINb=4V)i+b~`nX zp8=P?b${o22*llJ^}0a)d(m0$(Zs#AuauFrOvCakc2K)c}W+Co%^BZ0*x@f_NS^qWFb8Tc8OZa{RjW{z|4D>Q)fsAU*RL-0RIo za_;Gm^n0FbtzQN$#!UM0P$nCjGMS8IesNb`d-PfP%P&7H&;99N$ZU5i>&aN>;CZ8u z&^j<)?BD2^9s2`d?rtjfQa!JS4Vd_t{i^b51)Bx@k*`T81ahmM$XuHOiS(A5{@+M{ zqmivsJvn(}BUj$Il9Si0W$UDlZR=T0yRx6ws4o{iGtxQBlxK{}g@7P6S{N3+6N5t& zV{9m3@GGM&VYr}Yfqu$qKe}_#g#Z8`07*naRN^qEh$ELV#F(Fb80buMgCSrN!Uc+F z_kd=*-gEEwfE{#vCe9}r*^JcV8aJe&jc8jsAuDhMDlsxagu+tzD&P899dcZC938$d zG7KZJXl@6`7Y+0p&2X7e`3;*5E6-nEXWN%*zhVq^d@|^W8#1yJL8!7n{Zs^FE~{9= zWU{N!48gnE@nzP#pA$MM+i@28j|gozf5C=+VsUWD>dDAmi&n!gLi)v_^T;&imR2W? zOaf0DFjOiG^+DcxQ!Ctcx$hWjSe-L?2FHrl^I;@18uYak1HM>fkKI304E%+SbK1(nyMbzlcKt35bp7{w zB^#R~dH)waDz|>-BXaev@ANXo+0^Hos|{hsI2}W1%n1NuvK9_GVkbAyy@bw!8)nJT z8022k8AA+3VQ0=rb#TI2*E$6@?bK1bkZsBf*?1P^d(81E7$vbX1PD!<)AMxohS;CiGT=rM&w}>eOf3cAvFc|fd2Bb>rdGZa{mtzS1s?ie(aw>c88yuB{S+i&}pH36~VVA}WgwKzibriGQp_w!e~t{U>DJ{DwUF=tD=p=*RP? z0e62qm;WPN^__SBJsA&w%TjD-QyANnEEM*5pZyb_qNpU+Q11BE&&kPmUL(u>sVoj=vQ`6Km0IIbTnZf;pWZDv4MgX2)OCg3fiz42 zFBRVAF*Pf*aINWKaw$<*f@!T=YI$m-zI*L8%1kT8k=g435NV`SpwnZ^^@fv@X^IfQ ze4mvAxEQrMbBoY4eK(llb*7MoJ24wQK~Pl#-J4;Qlrs}@t{EMO!l{7NWQ3KG8V@iV z;5XBecz(fT7=+ic=(JEG zx&m)3Y&61grr47tOql>^x#I!fGcb*`V5B^_agV#uAjfDVo5wa~G})B5o_|H2`|88; z{QVEfnI~V8nLcNG%SWzh9U&(ugdk>p6oqvWSuMk|pk*rTh`19+k_n33Xj^1$Lo@iZ zmb@^`2tFczvn*h)a{+tOU-WD{qm4!;$3?cUYvklR*K+y>ty^EoWJgDLYBRZ>Ea#0Z zW?HZAUE!6MUAZE~lu&9|!!K*Z!+yUni zP}uO0eKqAf8w^5Dz*r!FBK^7ys8Qn-4%E{Tu?e8z20;8*))F=3I0$E3U#Pp57{N=& z7SF-gPlJcikUB@#4Hbzdd5`FL!bo* zVo_SoL{}iqk{1AO_WOva7mX+yQfxGaW`Hi2U3RPNjIz>>lPXWVnCGbm;OU@4BGb_w z=%KM*5T|aH{2S>GnIv28&9BrJlU;Y)>w}Fp$~VzAQC~anQ(0o5PJYLZ<1f(8xX=9kfyA7r#JNbrL$jx*xJL6Yw6d1{Cwa$e<<{%*dI-riI;Cq2u8eAnkbBJcU^ z2W{5*{_a#}dwa5)%{}SPaEq^vvQ)cd$G;;m0zNPUy~v!%19HsQa+uM1>{R7}l*kt0 zely$1d<_`UYMB{G)uv(Q-Nc1nqecJQaAUuu;Op-J!i_c&_|o#k#e5-8|LJ$+@!$T6oPFb*tdDPbS)$Qyk;_$~g)y6hhV7PW7#lB*i$cxVAH?r!H)FZ>x;5j{ER&E$O9sx^LQ?s{|fTCZ1(hnZRD0) zJ}z5Z|CMZQe@13g*Dz$(NPDC41ww>EZN1PMZbZ%*v|sA7_$! zZ@*dI_e-CZci#IxW0vXeK2p5>St_WaGkSo6j2gCtdC+@CmK~G;sE3E1R$5IU3f7Hg zX6`LZa0?9|{K;c;Z!i7>$Z$_^O>J_aMJ2@<(U}&R!X?I^!9dq_s0Wd0L!L3~q9}AT zyn`lI9V3Uh3Z-UC%n@;>WS|)6N#r)FFf(D!BO@Ryjj*C|T67L3Aj<{P2kUo{pw#70 zI!z+I3<}T<5SleSKN=b?2)%h6L1*hw!udeMoo8kTr{IA`KR}zEosqpqsKTrR9jMV4 z>01CYsszT{o3e3YN1DY-Uiiin^4!09P+t4i6LRt8GcwoZ>39yUA+qpF5#R(z!GokD z?AsU97Uo3S1SkZysioVp!Q?%Gm@DJ>kCBzI=*sWYYmwinLFA>@tgEW%+l+PZ2H(i$ zb|YISwEMfr*6FnzyWVH5A3NE|WK%O)8d=Uo7E_VMtS3vYc~@+zZ?PG^M=L;2we|GR zT&|x}n5fYNlHlEWpP!FWMAeQWu#3wFsIs$ZoAz#W6e}JEq^+1%Aj&fc>*I=KcMgHbPwCZ17Rl>7$M38&`#vBy zfBs`~?FVi#C*R&%=Vg8{LpA|*o;&?a_7O87yCV8wfDT;r7Ka!x9L0rYtdX|>5WTdi z@+!}hM2w8MR#p{o11Uam4vxw}lIxflR{|Uok@=EY8Jv@;+Vp$)=vq3Li&KtgY{%q= zuR9mDtg&EA+@be*~p#}NEDA@o(*fz-Fz6b9w1cRKJ3(PL4B_#|*tQ#x0v`i6r zs%R7&R^ysNMM6+uyzOeeiq7?pOR@M=PC;>$6Z)&cz*-i2sV6XtJ1=-QWY{!r;UdR7 zAUor`E}|`)f#sp=#+v=AfqwCg^YWel^K0__A3rSn^O-biplcLc)7x8XE)3!dhrpu< zPUwSxv1z}=w=*paKPtgb%{~|o*Rr?&eQBD{$)k_H*k#Kf_kR~e`s2QpA9DTIT(d3L zU;ppPc;kPS<$Pdu=t^<5VO7g0qO>nkq@%nN?^A0hjU8I8-h`(2&S%m)zbnVDxk_&R znUBjIKXb2a9N(6Mi+f0e$$C*+S{>g+U`rD;mPm$mB}rkCfU5v+8YVFQ9295TpxaSM zW2#-$VF*{hM%9NQ{t75fOyOWSXP*+JJLkG`f$<427|lk^ZgG)gUR-qjbi<=Y$zc2< zqU7gKhebLjI9eiPMx^cJ8O6RJMZ2=%sB>#!KJ zLsEIUUBvo^4nH5|KqG(0dRqvBR$e|+i4-aDng-urxzk1U*=W0w?bBj&sv`b^{5Eo=20kW*u|ZnIYp5y6iQ8Gzn}cm9y_E%(4tj;O7zTjk7C}4$vnJ zKR>Q?K88Lf&gmR+93jq`4zUoECBT)62oGZbtmC(#ETD_1EE`}kuOUDw4L#;@7a-A= zQC$ZIBNdQGktW&p&&h zgHEZqV#pc|K#(^fI_*h4@3UcvP~%4W>T^XG_W4X?zT3$3oX;yi`^rGhzdDfJGd)@C zdDc)fYNQ!!L=0<)ODxzaL^ovwoeG7aL%4K=bkUoB1cxzEDvV+TFom67irONf z(HhlIn4|u+W+GxUMVqz0RN3>$r)g@Y&ORSqkaOq$H(9U$OL^+4x8CN(Kej(kT=ZkR zg&*OjgFHd(|){zu-QZ6l{R5|a^88^TLV?9yF z!lVLxE}}=i2sMyRXa=YbUmbn;0g@csz9Sc0QMj4hhl_eE2W}qq_w&nd z>t9*c?yty(an#e6hHef2yhFcwQT27+9Ll?{@;?SbGD3*85x7)lIb`syI@EeYNr#>mKa{|A5UIU{A*s zmS}XC2V{JP&3L4)s|IK}8+Um#`_k+%GEc(04La)v&~XL+W&oZ58NN2se{!q;)FVaN zQ9T?{1faY};Jb*z;-SHt05ai_!d3~q=*V+k%t;OQc{&YwM&PMnYd9-|%XtiTA26m! z9Qd6tJO5$Z?BW*sKp>kuL%w55OwcgXV9AV0|D#Ez3wJgUQ1P=+u%J0QJfr z%u2xBIwf@!9{9>WLek>7BSkr#nluV4zorwJMhgh#FstFdV+GZBN3FxivAzl;z`X3D zjHwFeHiP_dfVG^w73`K5RsF*KmhSkGX@v--p9?;S?*dBWj>^CIF*>Q^d+8vE5l(c_ z1m6{fatNcOo(@M51RXPB;%3Q=x^A6DfgS-ShP9r2(6jFAqhVud>>2@AhvNJ|o4XC< z{F_==zLwor`f_ltFSA|E2G_ae`hc|?|w+TTXK>%z(lfR~%J0{3z z#MGYJKi=FhT6yt-$K;XUzTeW@SBl}rL;pfx%|i@UWHv6MupF^%vUf*jb)iWvPow90 z5iiPx3%@MA-nZnj$8-eOW%b|NZU3^` zNUd}x7qSUR3!DmJ34vo{(NL=lK;Q-}8q`2Jx!si9?2PW;Q)7YvHX~*!5KSR4#Rvv& z6@c!=1E41`s6fBC7OTC3&Qzh@`om(o zIYpL8DDSfU+-wr(9)Z4%$!S*Jq;ImdDWlO?_Fq3IFMs1vdFK8H<)ufSmZiQ(8;Yo4 zS7b+Eqack<;P8GNjxWX*k&#=TTRNbM;18ZEhkgjBmQ+bvN0k?2)5Us%(Q(w{gBOqT zf>?ffVSHk|MNecV)?m)k*oPt;#~L|)Wh2K<>5O%eovTH*PpxHgVr4VdtvqC<;J5LJ z`pSWqmv&fJ0@RV#xEX;w600M6QYA-Ty4x}tF|kI0_*poZSh5jiGUOI_wD^&-xs_XK zheRR{(j5e(b!cwZ($(5rW6G?-Y$^7TgD$Hwwp1@3Bt#=N0BoWKMp;_;Auo)T~I_*;4!Su1Ur-X`B?}}eLhGj%tkV0xF7?0>mI|#^nw;?J{(|I$54#~|5eWI@bVNj-*H?s(#Jj{ zR#WTQL`Hk9v5v?{=#(2B-X#n%Ju*0r!cmEy4}oDD-S5fX z`JU{)*_Yk7da{3ZAbS_I0o+=qyDGmhuUx-le>4)tP&{6SG;JrbHmx&;=x<~le6=i! zq~S)0bMUCpjq&L2ux&JV)s*!Z-~q<~d6_budV!dbV%6wkC9*%WKaxeU>F*z)jYi4uDBM< ztX39uP`u_T=RF<D|#A!=X*;30#ZkcUrRqYzPq?_^SkJN|1(Uubw>Ht~m#g?hQw# zzp7+e07LlHBIqbO?fRO6p8Anafk2ngYt?~Gg}7Gw2{{d&Qk|}Po`~?*=@{w`q$r-r+)A2a!G@Q+8_?ooI?0Ag|&Lc z3KXN-$j=wuSg~;xS)@Uif=;9wJ=e=#tsWKWeM}yHc)uus%jU0L>37*|><8M&$(v8e zH5-3NPG0d(WidbQY3}rjLU=lbL%@{d3jhygQBO96I8w603r=7a+Sdtwy^{W=J-PC# z6LQ8Oe@IvOWc2ocdX2rg}eV&7n=^;(baQaqdx9vQ%@!!yb(+l~hn^^$O``nrm8 zk0&v`5?*5iXB>BAf{P&0&w>rbUGL;bHHY5*S#N{_5JeDBy~q$YR6(pU4BHUGo_7%` z=X4cBnpCG@92A9blP^xN5}6QTr+9sNB~`n70zW8ebCM7w5u`oe9>REa2PrfZr|G_up&8J?FwKftte#{%e=`+z>E>osC6FkC)*i)dYj66De zDe0JcKy7dzhDEoAsU`8e#yf&BB=mZoN&E=+7RMZE1?LvZCs0wfx$ct`kE#vLA8R#e9(a06=Sj+KibiTUCXtS}hD_yf0=hi$}@5{jtJ@FYChqBfz z8ne6*EhX6@9Z2QeOefP3LRQ#gQzt&XzOKQdrSN;A&ENF!LX zJd}IqFDp})8pKlG3C9^Xkxq{^-pSjZ+HR6IBEz_QWC?hqD)vqG&*qZ}KoMcG3I5ZBZ}9fblG4(!ceGt-RTBWAMbzcmX}>rhIf3q=^s(hwci*Krh@8sQZfnt=|hDQmHSCujuQeD)eC zbA=uwB>*~bxL!jP$DD%J?P3@#Tqh%adsw8{g{604h-ri)6+fD!gAOJ~3K~&SP2l?w~US(a%rMQQ1`ov{~6FsswVpJ6DTh!vG z^8orrn|}^GNrC=X=Y1^N+2@DW@a^D?$l{X7O28zEjf#Jn-d%B! ziCM~jyCbX@l?CR`u-<>*Up4Xr6aXJaup|RNrem;C<4ZdV->9FA|9{;Z_mWwqlovcG zrrhVTdqO1N$IKq54a@3;j3AqE$*j%i{lutSEkz+lGzT2+I4>3s6C9R4u&+UviDgH= z_}~-r$nShb&VTIkbczCMtR5;Ch<8;&45=25&ZmQTuwcV{ClhqJyrDIn!3{; zep$xDFUVKFszrmB<$p(^&dYM6f9*|u>|-~`YWph}S zs>T6cGS|Cz~N{i2Y@tUL-M4?i?D=8ks+CAh{G6+2my@~T_Ovt zBj?G#%%hCxFU~rEIq?}ik%=Eo6uPpi3=jPb@Ri0huh8qaO%z%kb&5MSI*G_#7~gOl z#@G?UtJLol-gVvfcho@Y5`F%)D-|av_e{HD1H?mPDjFR=4bN}ZeIS^fYU5Gpp$06e zS+OA5D3PG`&soutaz@4C?}_LT0HTf13)theYvak-I(+IHU;T?`<=KDpki7K3qjK?; zv$E8}!p(`uNJB0Vi8w=TEudETB>1fu(iNN;O+pJ300!UDa4ZOzzdKAm zMVAnyQQ5qWWZ{|%(DH-R?<3T0cTo6-2dh6*m7|8bc5+|2+e)3ro7+80g`Zrpw)FSo z*NB|BR^-@Kjf^(DUQ82zR`Z^voT|ajnW@>`HE+-zTX5`TAlh#V=gV}+YNY3tFq0(# zhdaKq&Xy5Qf?o$QJol2L5)Qo55x(9%0a_T50l#Ct-lx!cqxcuYU{8L83@wfq&H{E^ zN^qOD2%Q9}|EF+Z4cR#|K9+xIXBteQN-ui1=qzu*!z) zYHYH&@~0D8bkEoG^HF#j7(}_2(GAOJa{q3~_~C{_I?j+X9i#W?3k|*wN76;8Hsss0Rga+u>> zvqy*ecYV5#VO=fza0D3t-WW^~EFL>Y@7}Ab^YsS%DA6yErOMUsgJ^+gWJTvvvum!mH0H7HFsd z216*{SeuKUDXW$Aw0yCrBR8*;8$Wrs-29mj$*K2TFU!S3X8TiF&6f_NtlZGFeD=(N zOrm^sed62<$&`jNXglZ|hwa}5&A?f1QlNMQS`N-IOc8GZHnGR``-YupF#39HNuDn- zCoBM8!CE%FLde)OGM}%^IM+X`W>vC(TpT<7BU4NxyTgHOZ;oYab0R}q3mQ9P9qt^Z znVfI}HacW40vp6Z#Wr%Fx*b2O?o-e_d|3Xv06H*);iwQQYQ%FdM{o5w{)6OSq? zKWokUQVo7fhp#{@OwO>Eopz{4>F{y-q4UeHiLxbuw>u62ir85kx7(sQ81IB_zP=8Mq+exda+26Sw+Rbp*}(4k#QrMHcXgFJ3~CCfUrotI>he=8jPkKv7C|uU1Wmn0 ztqI=;{cUmf6<|6uP$YO(1`#t~9;lI&j%7oyb>VBZ7gMsm7^Q@~{T8Yf&GHe<-cFk3C<-^-0T}#jFXDjmb!M zwl-uk_Ut_N;o(*&%ZYc=$#sN-9lAu9#=Ncwh7mK7{sMn`WW(_onlV?Sm$I;6t`^OQ z!Rlw~u*_wUk76wHsQ#7xG=Rloza7>J;1RMk)8t*25t~6XAdqDS`f4qs&586T19|J2 zm*t7y{hGY+r{9zLa3sw{(`uL@SDmJm@keuJ+dwbar|O_8QiErqI|+XD@$>mt=>MURD9ZY3I8oA-#+vV^9!>gCT*3$%CRQXeA#6bbMtI#);GT&EIvZJa^MEtH_p;tA=wm~p;fro=EMw20K zD5%0yhx>Hld&XhUhL&rNsal zjg6KE8&wTl=%ENvQEEXww6DmKjJLRwA~PTgkP292T^+YT z!U3C9g-Xa}(JA&^sIDixJ59hOy6V&fmQD7DVPN1FG-kL35h*(J5)cEe#}l|RN}|GJ zErUCqIo-Q*1Kovv=peldbcS|Wr`^51_EB$1Bicqg;S^~x8D56lW^@>Pr5tXh@D_o{ z3@~aXr@Z7#2j&^IX4IJY*s~7sEuJro2?iH!`38*BX}~3LnVcKXIp`LHHo)!KEiRYS zz+hQK%ZF3wofI4p!p!%oEqspS?u>^p_w^KcX}v8{R594n_*T!ZTkcuaMPmz37niCYUK*Z zbTCv=6)hTM85Eh+epx;o2L?}9Tom6m5b0?Yj{0IIvf39}GZjGB8r}wcyXvCw-r+te zANW4M^Y|}}E%WS~k=|b}Wc!L8x$Z;nllOk%<8u1;cgtXFBFouK=GNg|%Nad#n0%g? z#&AVAjcT;id5>J~xUhNwnNICz?A+;}PCh7C=fB9)4VmN9bRzgsqVtv&WXFY3aYati zcfn=p{$}%)>>bQxYR(Cd3}cLY#N>_c5sc8sX#=^@U?4l26WQJv%W%;1NjBU`M;Ozm z?xa%m0@e+6L6)-rwO%N;7M2+~o#mt9gbf275&2N-3_#%!4>_CC(Va*DGz6M4Qnus7 zv-yk;IdWf>6Vh=)eyd#M4`{I%o@sQjYGiV3(`w^k4m3Irq$~vfR;f#p225 z!Epn)_b6wiOrVpZ-V2wLH3%hwP@IamGpmo#?(OUK{j#_BkL0n(9%#vh%j_RV9o1#F z#UEfhYNSj5+tTmffuhbxTRAMHs$Mt@&;0Gx!xWZJI?Su&pkh&ZFki^vU?C@Oyhc9! z>z|jK?tQ;C(U?uO{WHAzEGj32jqb#*`1m;E@#1->F=if62pslG(G?p2M+C(IVn)$Y zRM+}Z*kB!s$}~O~Wc)^^Jr%)Gov;8go_c7Bix`oE$TdMu;ASY90x-isk1SgB31w}Q z>FT4wmjB8h?q`(OO1&Ilfl0|jlpRcwVue}BXy0VT+tSd$7xB#5RyCBJf zY>zfZW}L5AYq{{^oAUAlPssCMeMHVY{gTWU z3!iPSP2sHOyqwFSs7KAI#zivv(u#1`Fc*{;aaLbzk+wtzn<70ec*NKbGsxAsrUv>H z(Gf<}Q;CNM*Qdi(> z+0ZojE$s;3lZ`7I*}ht5tgmF}xc0mB~OjYD=g2xJiO!JSS+SWG#fAC~DrF z0i;@ft7Q^}b_r*P`kYZ_(30x*sG^UI1|qy3jqrVBG%~&{Q0yt|+C)o#t~|e(i5cYD zd42y<&*qZvo$1N!LQm$qBC~xFn_<3CW2hK;<`vWwD*ErKXNog7XpE=Mi-E~4pXnDGyU zS!JKtCxu=_4?t`khb_0D%!0$++S!up?z%Fb3WtfqMp ze9SwgZe@VL{6NwD!0VwMbKpB1rREH9AwBVM`)QeAgv%qLUvT=M%_Re0Ar~dFEdHhS?kc0iHG+KWi zr`FM!sic$sLwQu0n@7Oic7IZCCKs+5FFKyLY5se8;DP_>@OLh+pVZU6ymt1(?B-qX z+K`r zA>5Ks0&E;&0)|4^r44J*eHkU{6c#oN?@$13qX5gto#e*#R?9-a#Z@!PQ{H4RbTjS>s-<7DOx5 zP`6@iO=Hx&OdV~bQT5_Dg8}MG()X3x=tEv_e&%h2OltfN(9}okK6neo;O^qqdX4d# zlBU5(9M`6_xDe^-w$x}>3_b42#!e&KCmPu~CbDr{=dG_~^W<7KcSI&zVg|c6?SYzH zdlsg5h)=q1^_YMo$Jqoa*nlj-gB%eRVx*H+6OK1OthO_V0;C>F0wd363R4EB!+-O; znG@r{0}-ZbY*%mwK!nwVU&+6kdVgB^i z2%#2e!#@Dfp$QUr@)!xe{J=93%ivlCuq8@M1CV=9$4sIBpc`MUPY7x(T06AV>5A7n zG79}v+6H<#VY|}Q8Q$E8j@32~y1`Is3eKwlq$yVdzlIl-E)?1?ya%3dI&+iSii4JC zmN*y2N#Wbp8Rtz!Ruyksqjumg`YKVchWhA|wN;NwBmA0us!kDPE`VKa+QVwrllflX zMxX7TX=MLw-%{B3FNo}45;@q@-W71nX!I5~t=YB|v8iS|0 zNdv?_4m<+sl<(uu?UhOYF4JqalP(!Qm0Q!D1m;o6%zw*1vZfHOgdEzoEdWy)ff$X*dm;yO8P6B; zu8-d?xBud&<<$FbvU=a??!NRjRZWqP$$b|l+3O2N7CN4j@x9Nx`eVJjq@uo<-%EXp z|E1oG6sSTi)-4y_cu%!rKq8^48`9owSpReHeLoF!3XllybeWgWBC@Ri*1xAPbO^wo zK^557d|^}()GArqN&t?h@jJFAbpA!76WAhtRbf!(Inx1&7>pbD5ZY1uTCbgTMo3$v z9I{>zBL2WvV=y)$Fy#JZASa%N&llw=QfUu zZ0u<5x+Xq2!)P>OrHu@=E3+maFmixqJ$x^$$Av zV>BG2orT{++Jtf024b0cQ#vj)!W7ve*bzYloE|NQoEbSe-!?N%>iy%g@LWc+jC|u# z%Q!PDT?)<3fr)jY8xpC%nrr1lVi^}_pT(djjW!7zklte~@ZKTNLpzGpY zrD#?IU43B4x>C9^&}#t?jiMv1I&?+$1YvqMby&gRt<>Bo$Kg7wp;DaCP9{#3Tz<&T z*iw2W=)m!>RHq&Lj8GK8$S|_@`N;8~(J^b(G3ml%iMbrRn!?zq7jKb&aXh)mO#ZNP zj^dm)qf4FMT0`E~h?h@QuxPnHd+ky3nMTQXJx$%3x@j%>TRqu5Co+RUZqB$~BWoLp zh8g7%Aunq-{m`iw=LU|FSs?)UOA-ueIiyO95?lW$y7uS~!76LXSwzY$N$L+2&sbH%&X;f#u0?s_dL(mY;6Hw1MF&IG-W_2iVoz6~PuTOoZKZ?FBDhn2C**bk( zrqh```?c@NQ(yXXIrHpmvOclpqoC~(#4wfdj#MnEaNaHuLmUtx{PG;?E~N#vcb2Oc zWj_0_<-x=|{JVdp`6f8IOL}G@YW4Ft`(XL3IZx?F?3iu~I=f z8LCK5B2p9D9fn&hrN4I|C$B#(xBs0_$*rINko1NF**|yDyR{D>1{6rcPwBNgFifL% z#d(BAENgkp5mtc%0ThK$oA*oRjyGIN+(%FsAu|}L?hF zaVE7PTRkJkMJ{L}BFvFG5b7@3Ife|1nb6q`22aECF4qiWwa00g@y#fEI9yWMb)6i< zB_?DsPuI`EpKG_wVWOsY6ZB9SB_U@7FMZn{9d-qy|KB^YQaL$hDE$KxvO=~a@`Db~ zwProYk^3BKDqVBkX)v@R4HVWb zH*|?M+1~VdY{|VLGTadvY)j8l6tg)L6;{@C_{?`#B=p|aj^S!eX!^U>98NvO(HhDT z5SO&ZF7OQ9(dFR;1Yyl~rIBmNcJ@|F3Mc(#REg{7^IJ$1YsOh0AUh%E#t z<@o_SvBW1Gtf>?9(N?n_Q5AnNL2zN5jHdC(a1~)#Yc$JLWFxDEKPR$#tYok!!;#mN zIuJ}}5BFtfYC4SI7#573AG;tY0B#%cMOYl#1K!uT$I*oM69y8X|P5;1NGaO)IvN1=R z&K_S(MW%ahkY9MSCl}vvgM5CeC+lh7=1Xg$%{n6F7==dpf#VPFf`bGWbXt2`A5cnruVfZ>tIyfv{4isH&B}d3~L}Zq-)$iV? z&v-_pmL59q5~CTdD=sxB5qk(x0D^oVe{4d)+Ed(j_hvTx++`*Qu(*TN3o$Lx-=4`- zc74B&S=-qf%jQHQ=tG*>gceq)0*10(OKL1FNZ0q9^6-QIO_3&-?O*@KK>w?*_RhP1 zM<(N6v4#jM2*<9skP5~W2-0xrQ4K{?LKb0^&~T{63xswhbX8pY+V!(1@BQhI$lbsE zY1zK!O4&cZE34(g7|A*=noM%y=j&akWi4SwWg{`&fTs(aB!%P^2-s?EKmdh7Nx6&W zUbYVP%wc4iN3zge*TNYtbSQArUa3Zh??=JAI~xcJkWLG!V$T4swr4V<8PLo1Fw%7O zy_hjifZ^}35gD94dffe<43BNd zXnR90y?Rbw`097$*+2Y-od5o-GGDD_y*c)Ja}u82aRDI}xYe|%7SO`KU%s8&}JOVhKb5o_CDt= z=bKFLbTNo=Xy783LizuVC215?+twOkspFtd7f3&hr=+7fCh-D*rl($#Z!>#_&OryJ z)u0Ll;kdYna{mo#JRt|%`Gyo>7&Rt$XnYp%?gn&CW#qkb-Z_4U2GDWLOwGhQvBm6= zjB|`v11@Q$+oY;E16!RI|h|A}Qn^FAeYYeWOiO;u`9CF#&4`6*Tre3Hb$T6kcd1FIIF;yMT)lNTg@7% zvc2nUtq!L!lsX1|rNg6e7#-R6xuToxa*!!y2d5j+k|$07(Q+r%5o(k}#@ii}OQ18X z$Qd`*Vk|>cd3oxz)tYo2@UDis)^4aiQp`Z_R<%{!T1%P$UP`BI2&9zZY@({`oy}!1 zpUdX2Hk(Vj_Q;+;#-V1QJFgCheM@oICUIldpac6@wo0gJI53L(C$st$A-F+24{pu~ zcI|HhVhzZsy3X}79dk8O?)s*fTG+OJmQC%3y#XeSqzt05--V_;50;F&U;bNp_0i{jT<%y)MGC&7lO9+)a1Egu ze;$U3V{WKU{4dTXj)=SpAxhaW9ASp+;vdL&zVqK6B{D9zpZ$%2{#V`TZMU706DR($ z^m@M$-Q2_5UA{;oQh!vUq7fXb;6BuN{eD#*_&Gt9b^KgP@6uFm`p~U%*ROqEuKmC* zvRW-=dPx=E&ZK83Qt>mmh- zGRcL99}&E&PzHucB4C;xT%QjNg93)I%TPv)sS)Y0LyZ-IJCC-2IQRx2Tkog_d23sJRN#i0H*#loa|9yl(i?0pbpf94lne zANxqnOrTmw0cfQO>;_6l0{$HlX_e~=Xa_xO64D=!M?*2r2!yRdc+i2`VFHDV`C~>g3qwrD% zjggL3qp}2JT%SI3F1_`>G;8H8E$XK8CY5qaWROp}*J@?Z&>;h~c)uJ%e3!hR(FP~E zF0d~v2wJS+&9c@?tLZLBb2&>paZsnYPg4dhvZ01RBNMG(zd~f|L?c^Q_GJ5%$hI2q zCswkty_T`|iqU>8`ixaimW!UuwKM#pXOUDN(*;g40l<_x;6RNmGc`Mm8CS~A6N~_) znqn3TGgfG9yMfI}MO&>A-@7s0F@6bN2-4WdtvdPX-w*2!Q`K%A`7KLN)D88}w>S@&Sy!czVP@=0bquY%& zh+8gnM3;X@M|Smx8X3Zj?T!(r&XADg;hc12N9Sj?bs&x%S4ShmTAfmKT`N(xwMr( zH$CeOv79xsw<~gRwkP}A)a|Xl9GufSa;+_IWHuFP zNf`8OQ%QH_4RHhx9qW!WYW*AE<*kw~(J;_|d=#;!<2q@O>nm%Gu&6aSKux)3ZmB`8 z|Ep>3wOF3D=rquswmi{+&Tu+vJ8LIk01mNiEA@D&p{|Zx8eMfvRX7t#C-vEQK5exc z41iPIjecz&x3IeOjm?o${Y<^CW)(~3}@g%)7#ZJ-y9FEA*DBQr(9|4Sm$xzq@(KiTYA=M zHPml7^nlI6ndv!DmKACTgZxlSeJ>6_!@dmWfb)s>ED#09Zhp(p3XX_yT~mjL^QtKL zF#N%*U4eGO2A?30-NS=BV^`rWC_1d1>m6O+d1-WJq#5W;pDw}^%xpk8fN4h6-8+b}EMR8;N^UUmTruYPtSZm( zE~cuR0Pj#2BlUC`_|7vmlpfFUY?q^LAG!a_<$ii`-N1As-gQVuIqh9UcJVNdxX8%7 zJ1wd~lvfpBEALHLGXwoF&@t}AqVtH*_;J8fU7RPiVV~;=oC%g<`zgYW>0Ke$a0ae^ z=s5@YjOF_|g-09iW2Q~@(G-nyO^2hAjJ7A1s&?VIH{{tbKPb=t$-{E-h1X@Fp3E)n zoX*Zq5V9>K+5uzKbm2)Z2m;1i#GlOK(@sa5B5Igx9=6pI5?~Q{b*&370Gkev2$eQ& zFbKpIYBp^{NkB7`W~C96ix}mGFOZ%IIKt@XAyd&5<;VTD-dVt4JhQB^gNwprUGK8u z$wP{m55O}!|4ipvQIz^uo3+#vS@g_cSL4mbvkkTTyBg{}Id*a_J6En{`%150A02CC zyeTr-Y^*7r8xx*ttH!rBrqXe4K7XBn#iK74iM6v#!#z(D^ctao%${T9!#+!S1yV5f zg&a;m3SdT|K|hg^Q-Vht$o05d>oGr&JH;@x&Lt%rpq9y0-r?&*=XQ%crvYiv^F9G6 z_fmf*JTkh+zYd>ApUqX;bG;0+qSB3_fbn` zG;3CcrBrBRIF0)19*d5{Uroy45!{n&o{W?d zUZ^3TX%n}LjqIM$NO?cTpDhox1jQZL+Sqfgqt94st$(+(iG%meg~vJrV$MvIu{Z-B zwtp!Prs&WP`5peJZyp=RrB`Jd&!v#8k0>(RYC>rKVS0y+*JK)d-DCY8Usm@<`UPF_ zBO#CJp)*gq6PyvZ8tE5B*4pVEPGrlps>f5$spIJbeI&-H%mxNj8e1%+w|`)r$xq*P zi`@KE_sWewafgg|Hf1@T%W|q2U!3H_ES98uW*FAjAwML-~&(#(+QlyktkCf*DKy~q&7H1pX~rqhKS%$Jt-?y@|4^YP4>nKBymEvRB?e%f8; z%-P1xrD0VhMR>Me)QDW#lTm*t@A&BLa`&%(POiP#|RyA0XM?ybj!%a6ttc*$$C8zzl?fo&n8mi4`cdXtRYF!lz7n;}##*b^8aR4OpO3|3)ov>!WbGG#$I9_DFlQ=M5P0)xMMm;SZxwAYY((Hqk z2>{HZNwCQSEXwdu3Kx`M$ON7RqcAi|xW$Sc|GM(b(k-@r=k(NA6dNy}mjq}Ng#-i$0zkXU|>-b70TWc9Aezqf11HCWnrKcsb zJG>ecn)TpK#oYX=^ujB2Y>W#F=T%!QM2B>mta1OOxk`6V7iO4s{cx>-7ipq{+-nzp zMnufV;A3eB)SV<13^L;EYw&=R@7e2_nKxgY1!1WAbNy)i3q|#D!1jsBd_6ywiKjz#S%z^_F2+KtwDfMf!-r_ z$H>saQp{mt4c*l7r495f8{2tfHSe22ey}UDciu;zsWHBaP~GqyB| zsjnaPEJALRH#9QzBN4?18qCZ=Xnkx561N>QA_28I}B*@}*E3%ts z8_!_`T#X(*EEO)=i$oo_s)zJHW?dEi5Y9K!Z4g&ms#YDU=U4w7`i$jHI-l;6$U-mU z0FDRLrMGkr>7y9>^{sKlUA*?@M^EH8xkO=nmJRg@>9 zPP*|(`oVNA2eXA}cXtmUkiWd2k77@C{7r@fGtfulVf53m;BH{TbP9Xm$PH)qxzOiO zqB@SE)6hT5X*MQ#83FI8gJ_Qvk#ERpJkQ<<^%W}CWNT)VrUNA;>7hVM3sx1|fLQ^= zm==Ix$s|hy=vaWBY7u|MLXZzbb$D!T$YX!-O?l!=epy36k=?0W`Oa(Po?riW()Uyr*VfPYXL9m&qe8*biPocgyAk(t zQg=oDDC^c~@c3J-%PlNh7lJN$B3%eT#Y+f0>Jtp+hvSC_SFNtq4Ro)^azMybU4kZj zh2JZr;W~gdv$WRvMn84v#-OiM5@D+QDs_~aXj8DBjCZy~Bk1Q}cwL_T@Dz4L7t%#1eK;V}&yP1bDbbSPB2tD~*znWzP5=cdJ~+ajamIX7=AUj~3(|JNEk zxYz+vdlNkE(cg{YhzL=w#e+9L8N|22(7jTpw#CdA01#;ZBIsFcG!bylP)QoRTy-!8bKiz>Mq` zxfB3bK&Zc`3glj0KOMSN%6Jrq&I3O`W@{yD6EagyQkE1sVr;^cNbpbiFw((F5d|*9 z`G;lHN@4dSNNMTV5b`SR5*Ya4Q~RHkbLo6>S*+sH4Dg|*`g7IT_Nk5X$-S-de^5 z_$p)!oiTY@uB$4Mb*&Tp4)Yw8x7CA>DKAU@T zvBWNRoz=1A+!4+pt}E`aMvg%XxN74Odmkg|I*RS0dQ4o{m~+n3hj3`+;OK}8Jyp)t z_Ez`Gdj$TP&7`-#CzHuguD$yU=fqL-3o_%G#PHka9AVUcwI zE*zcGShRdJ8p>Fk*A53>%Z`SZrOgQ(j4uB|d!PhSpJy>_>gz~3K&rWY4ssgJ@N~WI zP-e`9e}`^>(sARPJqn84tU8Ao4N-;(x@_qs(ko>j&WxfjAZ5$5iuefkkwX`f6(}D- z&XE6#TQzz<*c!|1U?$)B7hjQQ?*En?>`kpXoO=?%7v%XM^DgcQ#g%x5_$P=mM^;fn8((AcXC&pr9?rG}Fwn26~g- zKu5%gP4U9{;ZnxqMD=cqK*DvaLN!k=@jlkW9yA2(mNv}BE~ss9fn5WAsQ`U#hm}Kg z9}U5Zvo=qBPlj7#nQU&z#h1^>Gk^S`JbV8)<-!ZE%SsE5HFB=&BvuMTuP+Vj=V%#u zcfYo=i4jadNhPww=88k_(r(7N7C7rOR?=e)TCgy|WgHsbl?)krt{U&Q9&ViAyOl!+ zV`bop6Pm`jJS);1z^l|6=G+0VcsDJda2Xdy52Hf2WrN23C%T4pz)l74)w2W^ki~;Eyu2E z+ndWFpoJ5db*(OCA%`J<32V7V$C7kEJ70v6VfsOhtIT=|O<-qD zzK&$7(&^pCA>^1dWRmHG1aJ23U9Me6X_<%C=&xm|P1_FoGS%7R8YO?LCl_?=+1Z{< zFZ4uH)~$gfqv1BfyC;pMt~(!^Q69|*VHDbWQ3Klo!H@-2cC@fDWHqyJC^|Z{7ETeK zOQg*wRkvh5RUe$%>8-Agjp9rQr~x@m2T6F_v=N*d=f}M~rsqP!ODNFjucKTdYFosi z(TnM^QWsO1$7o-F2TvuA*X4!@Y^O_W9;Zh7u1^5*W(#evMi?B3BGLiNGpS;_iei>V z>fW^(@WE6z#$&nuW4Ft#U;MaSd(W*hn2cq%yDuxtqC|w>#{Z#{x$*{M40Nz@FU9ZW zYRLtWPr~s#Ax5G+q~Xr%PoB+9*jLvc;IZ$k;f!Xt+C1f*a2O{>C9R;Jk%5anVz&h5X z&qM;o^V(Sx0TyO5n&31a$7p`$_^e$;I{y6povetV{ShSq6rWGb=W;L01iZW{oy5$} z(zJZV?YfPPoeddmj^(AtUy$$p_Wkn8!+$9Y-TSevqod%3H%fz(HuxY9R0F+=4Cv>C zckL+!w)w$uA$$A(o$M|CnLPKzb6s?Ex&Av5?d7_|AH}{t_~HLh2L1oh?FB{&t270G z3h-M%e=Tg(2T*>ulwUXMPN|yjFvhyLFOzj6*L~<#dH*kcQf~U_du6silY{enK4+E& zdKjz@#$47%_!%mU%|x^gM(Zl!sWRD21!)Q032v+_GgG2q&O=(;yAgFTy-kTynq06( zoCaymwZ$c+6bb=FhqMDKDq-JOcxmY*uqGinYAn2c0KOjd=NOU_k%Bi>Kd%W;u0!)( z_AfMZiquO+ylFJI&>*w$0SaLdd07GMI(ikTAX=a(yE{9uhR}@~)dbD{^?YtCHIyl4 z&E zacJZ;3Rr5<>cA7Pzyh!hXmS`Aart;IwRRymelNgeS-VEdX`n-Lq|t&e*t{lohS!O8 zYf}dyY9kHd!5RD9vYu)-|CJ@=NdEGwR5j!m8?CguJhLokXY#{ zfu0-jQBw)ujx+6{&_aol!uL`}pT#(y%9n6*IgrWj-iBZ4q^tct0B9X#rL|4q$Fnjp z3*c2nfBVQYhsh0r%mm2bAnr4RyDn2I;IBys;VNwVlR_nQvXN|^SQH%-Azu)U4<{eq zOP!Da&2@^U$+v(e!D{XyP+$1VSUZWx8H`3}9ZmyC{`a5jnu`pi7XWt_Mm*0c)D6Ca zXGA7c4On4TIXS}hq{}$VdQyj!(znhY*UB6P=UNe>qGR5Zg+|CVI8Y+TLsTbi zU_2ZZEAR-I%>xtm`mTZ0wxin$it-e)+?hM&vVjqlJguf~q-)x{P6Dx-j#|c8bQOg{ zF~-6|)Q{DEMSLe|dAXAQY-Zivum9-na?8JapIrCBTa5;%7x!ejSQ_1MLXIH@J90#F zQy>8g7N0iolea2@(>RPwKMNXmjHWw2!taQMC=Y<2X!N`NmFG{K%AecP*ij$%NNlIr zL=ALrIO?=*%_n0-WQWcTgpxm)Mg^x89OM>pr=yQGJ~xTw?bq z1qkDrl81d0NYj}BWcVEP5Z^~13Un_i4hN1oMR$JlP|#`Y20e9@IgU$D6Y3!r7X`cG zOe_nx-;`{=N)H|BGnXYMm`)OhJJG zWkUr~bX=x~(U?K*k4b?dxGDTwvW7+kKBtO%e=hy~x$K;}Lf-fDpO6py(x;?1?92YS zOCeZ&d`$*_h7190HkBc{8y903ZNK zL_t(Wvgurp>sk~Dvo$07QiOJ1kDrx4tJZA#++M_mvhE$x69Z`jAJ3L)W~_;Hq2S}x z^6*3NMtzZcOg#mj&DM$lbg}MBEnPI(QPeXFX!w&vyx!2i=IakA8G*4jFu`f!UJ$7d zSy##o0QfVSRhm#ysaD0v2p{pWm5lrI1{-4=#S_2~437%oHHQOKoir=Wj%&z)P_g>di;TV4Ul^SOCrQ?|4&XbPhm=~|0!uPWnvXcUI$z3@r}goV}3x}4ADs$)BH=PkF$aypY| zzW;qWcmAxU^Q{IGX(l6)$;i6r>$$Hvip#>w#RzT5v=WMCWQz_6I^0qqbu=gF+C&-- z%Z>!Vy3#!zB_snxUOecek#wZO+qf+~LqA7*Y`?J%)e}v|*wWN@k;%?VCdV}`US#u1 zk*$*=8^^Rm{9493r=30#HQY4#1AkAjWRbac+&pte*<8?s>>!CdwN{#~<9%T0 zu&y-ZVOBY~3Bod<1xPv?b;NVs;RiKiP2FqX`~EW!aBV*oc= zC57C`ND*g}`_Z6;2Y1b*s?jKqGG!(YBT)WzIAO>QG&n2@<|*nnb6lUnzYo@84c*{D zS*?4r)X4?YzRdReGQHH3gNq_Fwb}N1Hb#4~+mqRz$n-#)5Nisrc4YUIbsAD`klVaN zn~dRxXVuGITaUwS%Q5nIm4QgbJrvPy$z(ViXn0$cu;XClT^kE=jAOk!PF!#uV8#Xq z-BWIKoJZl{qmv;7M8Qe%3Ux^6d&eT9E6hmOXmMk`AfP`IP_%JX;ja+Uq4W!HRfcTI zZOC)V&9D*mFEGSS?xDl`Qaij)VfmJlsNiSns*+t9ch<&czWs_bHEU@u{pr+D==qD{f;%dXAca;gubux=v;hsSdwI1pX$!N(CSNxwzF zS3ZmURCR=sTx5#*IfOwR!3*a(rk^LzI=@q zEw_9^Ha7o@-qzL^HO)Pv6=|$dp1MM01iVO`0LLZODTthahaRdz+$3I`#lEsS^wDB1 z@BZXna?juUf?RRKDOnuMWVWx00naHt)a*yh)S@s9hqikn-9TrTNu<%hoJ>&bj7M;& zhBxb{1JeVLdeqCkhV6+8IAxqM$+)6Gcc7F^gv)s2QnO{LB-$#GEQvWH-SeIWwuf3CCor*Bt z>k7?+&X_V?Bd&aRD5}t!sifBmY*p}M&uW~Hwl-zCe;}_s_=J4#Uwuu^JoSP#A!@2| zPA|4OI`AJcOlU~}i}V__!!dU5s5jT|Xf$MeLOYJRaULVq2o?bNIC?JtRCRjL_mSW- z(|f555_~w1cG8Bcl86wZhPE}uP#XeW@SJOlq6cyLJsIF&H+V){%E9xf^tH=In!SCw z>AF+$^S|&#x%R5l^3u~!%k$4XBd@;thP-}uSI+M4$-G%eZ!{2@45b;5q|q?60caQ& z5$))n10z-C=Y}UCTS^+WKMXtrFmedcJ0toX1`WcRG?p)UYQ$t+U?@H-wr5PSQS(#BTFvfLhE57Og+CdkF?@({1HxuP^c6n-iA3KGUg@^3DOe zrTbb`-_yi<3fxy3|A)gP3^0n0LaW7D(%M4Za?mx#0_ckdTKc30I?AlBMb`*fc7em^c3olShCr}yDOwgoU8adC+MV*FD&v9=!C4EQ$XqD80S1P#m@ zy3+64&nx8}gI$Tu5%>w&g{%fs0W5DU0U~=JZY}r;dqo+nH!yX4rA_xnI}_;-2Xf|# zm*jze`n&Sxv#-i(b1bqoj_ll)EDc@Az3Sm1vxKnWP*9-gprV6Aw?f77YbI+3gK4vS z>5pXH{KxY6Gr)@BP)!%DX>xr)+F*$i+7=xSlP*E$VH|W5|?2 zcpqEqPcL2T^~SrXBaCPij5G6Ur$C_eZF^+t2~0)gSi^xOf)HWEyWy^#LAA!K7z7le z083FXSQ{#_c8XGo@B|o^n8bp;;UGxlt)R;zE$F(Ab>;|+;?)fAWOdjB5aEs^6)b9g znC6rbbViJvWU@qo-}SEhaA^4DLZl^dbiLU%p8Rs{nL(aV1c-9D(h$*(ofKmMdvCv|BqHgA_ZvoN>xnfUxfGDnS9z`Fhc*eT-&stYPm8bQ9P( zTiaBT;MLeX3XO*XPa89uI+0JvTP3q3fujN)?H;-Z;H6P?^&pk;a+Q#I7qQN^(6Nja zt+hUXL9X83kT3r1Ps$g+@Kf@xYp<7!=g!IFfBBd4@OPh(?>+XEy!G0vvbT3p_U2RB zYu2(FPoy`Q*nRXY?Of~rdpZ8yuxe=zz>DV@5MbGvl}r-P|14m>MChGaVWAd~7IG_4 zMv16aI%(SoVNe?X!$D&6*R^AO&&q2pyH~qgk9tvG^2Nf&%yABNrdQVY*i^5;VB-KqX5i-UwQ>Xv(U zd6Ewb(B3JdG3i$OdH_ILHk8RDcMSUVBdW)B7_It2WpYEFrL!#MjIA^X%>IUBQU@gI zmH?X|pU?MlVUD`=-nG`uM-5s@`L39!ItW?2LwymImaP|{375gI&u3&ME?cj1vb>i`Bu}rM%ne-))1{mZ>w&uu_VeJuw&%9@iXQ6YkcjGR z0dR|GaE$JR%Q2tS-<0-~9JC2Krz3s_(x0v(l6MWjyX%yZn{1=uYX#uy5)Mg_}Y0{ zFX)D3?7`Qj4X6U3uwD-{7tPCwuI&_14)5q;M6>~b%2LH?yrQPL1>OR5`99jIm=UB- z%Qh4V1q}shf-eV;eoi^o!;MsXcN{fAb~un-d;%mgbvHK zW3Vx@acYa*sl4{Bzm)I)(S!2x!%xa=w)8Y>O>5$&!;22hc8G5Z@{HesH!ASdziXsi zXPaw7I31&Ak3?uKzFYXBW%O4_5eTP9_Mpa!-?0xUmn0a}zQyr{f#6SOExLAe*U>r` zMVe`L^Q{po-vky^c)zAh+SsX~G<&-;nNHli?U#Q^e(4wgwp@Gaw46VGUS53V zHIJmf@tQpQ!i)0QlTXPr&ps!Y_Abd{xsZd!Ql^WwMbvv66B~bG4dxjAVY+XmbQgJ| z%d+n4TxQAiAs-UCw5}PzhI{O4jcN<>+4U^y*E5Xbiks`vrdaw%vA2PI8E${=fqCCY}bp8tQ?d(&Xs&hk9)+4Da0 zxs&ds=}Nki5RyPhL}mtKn-B=Iu?@kA?Q~W0BUPPrSO4fA=}uQycmL_?N>z7U)k&Ph zjxb&?s|vkUGG}w2omF8T;#guoPE|_>s#OV z4$nKMjGl^f#RX)=+f}x|OVHiO({7HWL;A0Je;60ouXBn zq1$X=ad82MFF%6Cr6oN4=#w~eVI4DJ*p}7wnl~mz(3p&|d|(wd;9I!d+kw7XA=y!`#ZS0Kzd<*&dTcE{6j>c&3N*k8P*zS>c#;XP4kem8)q|4)sjZ6Dj^%lEHC5S5pz% zU}A%dvSNj~k)`det&egdd;WayRpb?AgS?t-Y}Fd6lrtQXd`CJHE4c(Ib)P}A?0m4b zQ9g+?WRkM3EW1GWC9TcKxu{I%Q8GhH+1P15QuXPqr3^I>vX_lmPb@j3xy3nj<~w-d zhtJ^tPkaq8efuE{B*RCV!-+GF>FqzR1cYbndm0YK2m*wnNdhRHL;h50Q={i%^Sp@B z=w|%zhZlB!@n`#!s%fU+pMQH`TJN?$|6xTMq;?Y%f_i1zqw9{;ISmQeNhU8GfauE^u{d;@u5nC8Lz`mke}MV4esi8mC@EW3GeNdhU+EzYUrVbRyG8t7>sRLeQ2k`zTrXBPuqT6rsYO8_$P z5(y-Mb{fQSo=$<4Ef2dnKq2WZyY!QGS2E{K@>v_OQWwXhkJ(7Zu5B22)JP7&Rt9-h zk(x6>EH$(yxw2bZXm4)fO|N?`KK8MX;O%dI6ArAdU@#cyNo@^=c>eTRJo@-kc=oBM zasJ#HoH~69Pe1n}o;!I4o4uYk&k=XBm3vD%d>b{%11EopS3V-?eshy z9v0KiMo!$f9XPjoC=S#^1_$a&vcR9C0Kx-hG}eWD^dD(n##T*HZ%@@Amqv4Qi$GT# z{_|6`=4a~rX-e=-`VR_8&jBrI1TCa3wZ+=~nMN^g2|TB`x=XBZNEwbb zDG^{h4DNDLHw>*%on5Y;!LQ{T#ufsyv@#rEVF&D$UkhhQ*@I3$>@*#OZ*fT5M|^p zGA+N4(ynJ$Nt(Mjb*01mWZ;;=8)^{88KZ>}T%^0XaEW)xvY0wpjPwDTqcN5b?Zf47 zxYdmG<407-47d8242MQ3I#t2-Y24Ev&Tit7U{PF<-!{l1cF}8@E9YrOwKpJ+_cN(N z@>Ti3qqcT`Dw!lT-zBokC7!8WADwSlvYAGn(fDN*p8HxegM0gU$`JXQ!rTJd42gh>io7)>MzaciK});gelw z<9$u`1t~lBvyHF}4K?T;bIG-hRugke^Oz1sc;d_7$9@0t%he z4`Mc5^v*?pdyeeW z<_=PiPKRv)!W=A?l(;(v=v<(%@_IR2o*A6>qr)%1N0?9iz0yIFgre6a@SZ`~4hB}a zW+Gb0hLk+I4jeoUo}S$>tYm#YxU*;y#CNpSP*@uH_5(>Cb=IqA&t_QnRRcZbjK3V4 z#_9gK=f9L5=JHB~uB2^QLl4^56oR%ckMwzJP~r4s<37gAY=h`kEsRWC9Jf8pEBETQ z7P@G3ZI0@5-~1t-{?fN`?xAPV-yUH$*Tt+Ut%<#xIF*gwBu9BFx=)^#`?wk6XO}+X z6S0=0OM7#{4P37;&%{#Y3#xX8^5~`D{ey^j4!f)?>jVO#&=I?2tb{{`_ms5qDP{t; zw8n7Dqv+lU=;e5MR}E!jSZ3o9W*63RaA_Xz`jubAZ++||c+D+0V>TLT=W}sT4M$UK z_lM{Y2H4u(!ikfo@W^9N;)$o8#rcD2^?!$FzVLq#(O5G{*LqZ!X^C^LN7fFWkrj`7~G z(Ao|gxYOp>Qb!InBUj zZgdO?Ts9gUvxZ$qFZ#0I ziTAP`43^7`oX%GHi|F3y(XMn%p-m{Q$BvdFNL{%Y=i>>w?G_I1UB!_D2e5zdUK~Ao z7{{->1~(kP4u=mO!r8U6_)lN{3jX-BU&J$KF93^@9c2w@i~aDmMDU{WZn}5$j>(?O zAbD}-N@{!8!G1Q-omq&r_%1uJR>c7u`X*V4{H_9)gbk_&Mz%Oe-(*_--5X=dJ4#); z=nBqD*Y8Hx%Oqm6(~9qudD0m(X9MW{ttP!O8e#e19vpf7D{>HaaY+-45V(sl$l7Wn=_M$u?j;m?JsE~q9eql>@{Qb;ip5GY&?`9yKang zS1EDGUZx;1bKa`@NZ8tfJ?0d&y)W<_vxw@V@7*C1S^X@FEZjbhLTttQEM0&HIu5i)^FX?DC z+0zr)*!&k5Y=0cjJmZbFvMl`B{<*SCKie<+Q@`Eqw_l6N)r;;S(34bi)}9i7OF1nP*NmIQV7 ziWVY=0>}lOcQvPR#*`Zyb72C+l7zvR3})V6>jMk;kc14Y3+%6j zPo!+1Yc!d{Aq7xlnbgfxP_Aj{kk}a=w?k#xRoT~3%rP%EBNu%q5)F+^w$$Gf=z_Q+i^YNU{>iZwfJv=-+uSl`AA_dblLzW7a?{^64t z3@5=B4*#fSbE{5)%L{Fsl6>=OPc(+ft5SMWct~0NZd=V zhd?iB{Zhop88Gxjjtu1`JIE=zC>DP#9f9Ym3g8+`d*<^b`l73Qm9430lsVFEbzZK6 zw0<9ri|e@U`fKr9|KMYI*E`>VJqz=gO@})BT@BAh3(Zbf&t$7Nz=gGoSiiW5?d={; zpM43BJn@z2@xv`G*%}rd~?qOSI$TpgKp0!p}X-)6w)|t^1f&LB@S`cik zKl69mcgnbGXa5M1?4pP>u+?tNl}+Myl^h2NOzXH7KjVzo<#VRV>&QO?elnJaa#B9G68Jr0t;Bm@0VpsK4)_j*oPCsdAG| zqq){tcG(GMIMdcBw<5T<4-Ap=I86sI3Y6&HQL^lWnA+k<(f3T`_m13uWYsTG7Vjp zr9acz=$oUN7EW(*wn>3xz0U(I$*^5uR=TC_W#*|wKqc19gylb%QcnFw${$Pv_r>u( ze$L_4m5r8~WhsvvO0;~4R(*!WZX3&UUCej7=*%r(-=RZz#SPctmK(3f)khCw|DHYA zyJr>4OUu~m_3_2O_!55aKiq{MJb41!!YJbC)sC#rpw;={rd+7ZV|#6;qSu($yQsDI zV%C`3nQ2wpGaf+R=e&pEZm9_4#HXYKbygHnU}MRW$82Y|SjhUc*UYd|BHjjAm#&#) zl1b%Wo~r1Lb4u^zL5mO$`Q1g%_4;UxhgjIZjH}*y2adh{4(vUCRL52hHhP%oXyC$x zrZ@?)5=X(&TqfHZGDFY}xun2NwL%eXusSJ?^dr4slGAH9N@MLmC znpJH0N0*$c0E&}O{VgQ-#>eq81E$c$?s25xkp`h|*sEUDnsM$>dHo~@lY1%ET}!1H zY4%y@%s>q&ZwE{nZ_Z^e1*slP)aUPpuT9pAQ6DMpI*rJ)mz<6a#}>G?F!N2v$nT2> zRxs!d@c5U%k0(C=O`Lo98O-*tTJ${Qzu1pm9O_jWNO@V+?c^sz@5v=oJrBo7lj+y+ z{qO!__;Pma(a-h=yJ(J|?HB&3-tO9KFGHvEFR-*lyNOl+03ZNKL_t*aQA{UGs`;~S z$N~%9pEFbL}?t>tTCjf3|qH0 zt0$zyQo&^@ie|uOagsclDYCCZ)c#*6`9dI>VHdSO-l(HE6B7yw9QpMm^yP+{>J;yp zE9zZI&=ApABapS5vD>=c$4Uy+Bg$x$o{z6F3**28e74ufdvhgCF3=QqPsEC>0*KYeZrtY;Npc8Q40Seu?;CXWd zj(oS?(g;Ycxr~{lw8uXAM!Pq?KxobxRU=)U1_VpoAfnCP#5Yk#;8~;aNq~to0Xm1;q-SR=ASU#90)?dMOq&+QwjgM|p|mwUe*ybiExh%uZ^UnY z+4##KAP1qsW&ibwrzY{M^nelNMxkIez7+Ry-C?6A26>lT|*hC-{F_i zei!b4&w5Mw%;eX~mX+o6F87Rmr8l29Ad{vVJI-Hb4Xp5t8m_h+jZAz04dH+3hbRr_ z#Br|?bxDVp-}z4(*NNdSk@l{9?&K}kNg927rYZDl)XO~tAY;AD~Z;ds5j7O z(Q&dxPK8X(lU%P*b{OH2V>q@j=9=oTNC7~Xy9l5P#LWs22wB$0A4 z!W$TmWZa%Lag!SIiF__2_gJ$@Uk7!iuhG)di!@S8YREKRrBA1&k~fx{Qc?UFNtLXb zbbtNvzP1it#0 zU&lp}_lweBBrRNjtgJQu9E9vL!t)n&!2GgxZWpE@A-Tb0ERoMH>!+lT=mdz!ci#W> zvui@Js=|s@}_cmG)dd+ zJTGNkR>H~B7+Y@SI_c5s6LdXkv~FpvuRVkCgcW*)UFpwFB@|ULQN+e8`qAaH?v}4B zQqlwS79(@@zV2w?d)uCS&3(dXMV))GFNH76c9_Q}^x5pR(Oq4{`KMpR19yD|&)xH& zVg{@(ner+HXmX$=Y3eMacExiv=qckW-wnlJ+d+QJI&_n-2(HXLg5PsHw zD~bP~^_Tq{c)uE6^{ON2cK-^q=`l0VT~UW{r!e)W?Et-u<|UyU0M~0hb}TgAGb@tq z0h$-LaOl=+@XC+914mwUjViJ}$889MNouaQxp28u1bBk+IY-x0ujOOy;HfrI63VhJ zt;LfXTm$Sm9XujG(Gi)Epd>63=wlaO)3XjFDLq&l#ceFrigLXKou+wI+MMV}TH$wxe#tT8gJS zLZTMQki2}P<2TexAMRM+DR(${3caS&*MatY*Bm$(xA4qY@557H{0`1N@+<}tJ(-hG zA#2WklV~*r9%Y(yPTx%6O0N@wVeznBCsvE3I*PFGruxB3L}E9_)aU0C1$s67eK|Tx z_qud~yQJb*fS4}3@||+n(*R{j*?7*gfT8gwYQwXbNp7r;U1L}}5w{&o+4$#Uowqba zZEJw$);6v?dJw<<;rHVsAN~OL?^(4u@RN~1B*TqNr}llR3lOf$v;+5|qmJ$25YL}F zgQuT9ffrtQ0VhwN#M956z~fIogJ(~?h^?({15|R>ngZX#tSe*gbbeVGjR=odvq|He zvOIF5AscqSf9G6Wc^(aZmuuNCqNKs-uY8XNDzkDZ!#rBgT1DLkB_umbyUe{98gX`g z;6Pi9Vrk|lDd7^K7E+ywp{(P_%>Gb=T2sd@ja;r7k1Um1ewLJTF~r5V)+o31)>4Dp z|4DZ6Xr|w{NnmF5vrbxMV^j_3$5MCc1eW%IPCadu#c~SrVR$*@g?;vTiN;G7jS=w< zC0h7~cd|#4nOVM2Csm+AI3V3AY|nDSjhmC!S+rRO;?_CcyVEmGR@>2!bqITHFhE@z z&C1l0dL8o%^EiCjeq49u<+$pK%duy94^}0G{i@4x?bTP}@cw<6>vYUfsHOH|6phVM zSa0L`lV|bqPyGr0@YA2cb7wDLJTIvzLf|@nz&3}@_>!D=929%%hMh(rrA|dMu2um^ z#+6(vSc^{GB)(0-mk&W@QSyX4-BTnNTbT@UW5?o*W$lqUkrtkHQYq7o>)^9#-FbS3 z+*_K*4KG?BlQ7a#_gT+KDXjmr9$g|!=S(I*rx|zhlwuB9@6)(X zI;UXU+@FcTpu&-@>Gm!%=m=qNBZha(!H@+(kvD4H+3mk5&!lrBGVXm3JzFdcbiFM% zuy8ce*&;Z(*=nM@yom95f)n5PAs+g~S8?|77ckqmWX)Pi|M^M?tdk?A@cdK-n%^Kk zPUa>LCulzLkNi!ZKdXHjr%!(DQcP{naHnz*KmYZ|?!cXQE@LpbAFb9gRTw+c+*A5T za90MPE?QpBHIn%?z~(M1l5o#xh}zjTEbd*wRloALaO;QOjD@{R*t)QRk$6DG68JOkuo&n;Dq%Exhkbg1xjs*?vOV*rf3+E! zohCX<3t9s4?APzd6Myy%y!7BxkQOpCsWTFTO_eDD3&9O(C+U!4F=fR<15JU4yptH` zUO%YK;N;~zbuqT*WehW=+2p>q15Qy3I&`wqsMy?;_wg)#f0t+GC<3n!^qCQgtd#XDP z6K_%_r4IV)wl)DQjfORdlN#O8Xo}Hziu0Qrc;dMec;E*=!XrO=1m{kl#K!tMF05a~ z+4W7VZS^pe8@0rPBSyPqJ4pSyMCiStj6cSh$|HBlV;_eSKqG-(*6M~#OXo$e1Mgqe zNaTe8@F@x*&thtM3E#ME<=z-)65`nZk}mYpd_eXGX5uP8iy_MUYuckU_%mj=abfnE z7PG>GXF4%lRzB)jCZ=2}z0ITM)93s19`bf&2o&2FfRkt`AK*;qQ6i*ap6 zxEkkjof_=`hh_T$h}lq{-;bP}TjeFfzd< z^HfrKb;^u-UBsCvQF2LF7^6NJW1-W+fjz4@c;Eo`?A?$32M^-du`6-Y_1EC~YmZ@d zVFj&b6YX{rolXnQrqt$3w0(%_M4H7(gtCD~yNiwOA-?gg@8IA6!CkoL-utlGnZr~@ zK}OWx^-y@be1EFWQ1(d>qR^iuO+}*TOW}}F$8X4;%+py1xX~49^=|Yz?VE#z#(X8K zQI}TL4O#XleUxQglEa3hi0`;Y*Q>6NZ5+V5HIEZd6}^1CPsqJ=?tJesOI`nk-Xh(} z2(|(0y}m}$kG}C1T=%Zmad=A{!;x zikX?JuL~y<4RU2Qg%!-Yv|bYW2BA9a9BfW^_%b76E|GmR$SE^8)k5S*VT_s&pzI7V zIGj6R6xl;jr(We*`q@3(lJ83SV%U(`slGM_lss!wGg9>(nfmU*tGG#V-o)B8&{;MW znM#iLEbwES#(q=gtL#oh=)FN51#wlec0OU0hjHw#n1sn zwxyg5EXHgJKc$zmSAt!ufT%*_v{hIFIG%hQ-~Zl6s}k^1`u)f3*rl`${}u0g`|T}E zhi^e^?*9UCv%3A6{}PN%Nt0NaN_|&vUWi6#4F7&fVI%+{SLqzmF|f9Y=6H(zH(ZH3 z|M7cq;FVWlu+_(4v#*jcJa2ADYFbkQy=FWzRoWiU2#Q8yg8Ausr5-cn%KMuR^qR!* zvbhjq4I>pZB}OIP&(iO0Rxa^UI0n?X^}0oEq#NSOz4ZS4Qks$ret)iY3uRRfW7Xb` zls2i32Jt-#1x1u@f=Ex5=~XNlkl#bm?7~(Ao4QAqTB?d7d1m#zsHsx$kXS76Ty*4T zc7u=U$g?*6-Zo0Di|Js3)8Bs_5B=enapp%)VK|;*wkVx;wGl@e17kE`dd{Cn(BWR{ zBJYgvsmPn5E;r6sJaXQ0@9l0@ZY#NJ%n`Vpv{siwEv`)JqL zD9!M94ltRT>d-StYd0KCUdR~lS9QXqv&ym~k!z4h(5RycI*dvNzTYp9U}iEWdSgKQ z7Yyf55o27JOh<(;B=ZN~U&uzU_p%nbADwtgrc4tha0_>#rM>HnZUeFQuK=1Ru~^&d zMuC#NMdT&&Cq}$D}@k>?qH@HiGlOUCO2ji{U4veP_cE%1*CWM&8???}Qu zky#l=wa}Vm7RabvNq3i7>6^twkZ_J?m66s&ofqV_Gx*;6BZVecZYc+;(T zFdHq4TfMF8QSK}E+3hkd4`L_rG*&FgG{3tfoO^ah z_L&xG>Zz8S&QGVGKpCFtqY-qEY}>XOW>g8KeGgI>xfFdiT+38dsEkW)i_QV$A9_z{;k)38MXS` z)j$_dH9_BQ0IvdmiihN=UQ!rYcZ6V0iXh~GcuYsAUEIRLVi&Laoxg*t-*y{X-3|sD z+Zam}y;1i%Lu00rf$jp=Jd%Y`tRReDRedk_XqI#rn+};r&;*Vx+-llc-|ODR>^bEI zsIwp&Ng`~lGo=Pd!aG<9Ax%H$9N_S}O75rKRIZHLsuX21+3V|b6D@vIXDn+$3o#fl zK#z&$s(_Vjpwl7kHA4nL3#{uNU8{@oeI%InnaUyfX;cU>PxekIJhkoZ4@DvrJ;LH3 zkaTDo{t^tWYt8w1HdEvLi9fvuFMj6{opX)_X>ZL=?Nkh&ZpSkZFc8*jVcce=qU-hn z)-o2SCC2%(jZxEkXxNblR55%K*b1wF;2<*sQG5d8A^*9)lmba-f@$T#4Nvbc_c|Wo z>xf%9U1sB7Y1Qir1)vSjSzVzT4qi`~C2Hy3H9OvZzvG+g;r0JD`XC=IwzLTFx_2s+=^rN&(%;kB05iZ&We{e7c1z{#`c zb>8}^7f#{A>C-s%(n&n=+;e#7$rE_)xfif`aox^S(#%>Nty`C$YpoV)OpgGTKxw~M z8^UsubyQmit?yZ285$+TMlV>n{!fDoiXBv4j;DaAYHy-8WyX5oN&r*h3 zi8m8}#c@=e+WGS;-}3dk;`%H@+)!p&><}B-G>8* zF2k{_uE4P)2eCRoXDREGv1OjkCKykKn2bgmH8&+zL!%}LLHb|V8P{9$IJ?!um;UM= z{D6{&L6z`K9$+}ej&L$Dm9U@*gfuTgww|t+yT&?QN zRC3JvHx^rRsOcUtV^Yp;yN_CLh@}IoT91DGeQ&_xp*0Tx9bb9zBgL$XuGpQx zvKiYYBg+Foc6`OzFyb5Vfrv%FYT21aS{})cMs$TUJn{yWg^PFA>M+kpv{J+}KUvkE zcnj^E3`-X0U8;Q#Oj2N`@a2;viRFAR=A z)1%fiC>$ef^c-fozlz+?az)*l>CN`UqQiln-fUj3(f*IMn>ul~xc)q0x}D3w`6(EQ%&si)R3Pn~OzGm<=k(#E6)MX6+K*|c-dn9EX~uv z%OdnB96epz4OkVX-kgq|Fyoo@X8QK9!G|qL7?_|YMgFr+P9Ta3A!^_wD#n^zAKj6J zGt9i(OS*?o$rb0K8o2>m%>FS?;`b%S;; z1acCw2rn^}HUX+PWr>Kpc+LYi(9uvwcX3|p)K5S593K1JJ$UXb-_y}u3Z%q1r-BL( zd4%iyZ<)?qfG3YspI6XEEIa5S zZLFUk6{KBD-pU}Gghg+=-z<(IX+pkpplmM&7UNtZA+teYxD(Xyx%pf(?{b}rUnQzC zMr*KztM=`|2jBNz{QCRfkL#{FtTS{cld+wU16p$?xx&lD<*#I*L7Z_$vtpn(r5k*^ ztIg$fl$2+QjK?FKSv!x1pL!PG|Iwp(;?XB?_J!xLe*P@ZUD&`&Ynxaf^vvrn=%;O+ z;U)7zqcDxS&0vpC_y%e%YgIaMvw4!I=AZFv*o8S0M+`KU0x>e{PFL;l z%}i+-bv8w9I?*}of-`0#Nn4kCa!FkuD~~O<+t|CZi2eKaVDG+tSUhkL`w#BLRaYFv z4Od@_8?Lzqmml1ZMnfi;yS=YtmPVSoZumw1;F%dp(nTt+or;y!)Eiw)>mA(x_~ZEG zpMDm1-~B~AcWxcir6mts(jk=`Hd!W8cLZPf9%_(7%4-%)ht%hET{Vf~)6k_OjPwxq z@^huLiv;5AR@N8QbM_kf_%7+T;@qJQ*3GE$D4hgV-NoN4UF3CEx}2koV3V<(+YSq> z^p*5hIGjn;bbM4~ldMfu+7#Fxp*|R4@!$$x`O&xI%D224?d1iGw)+~qk!cE6o#l9k zs-63$x3;=+22<5Ij>IF|2Q?Jk;3j5at#y_*u^SRdP{Y~ETjW@+8J)|yaqrTO{!jS{G*mPucVcp2>tlVMR)MQe-An3sSS!^=Ljlq=Dx+>)RBh!j{bAa<2wQ z7TG-uZ0q9K1*!ej_FLDbVAV#I$tBFdV=t^i9Gc)aB~sJIbK}Vr6Hkwlu}zZNCCY&5 zOQn8+JW>w^#wugvQt@6I?GHbWH=_zAVA%kHH(UuSR?vEUR|K*j4j{DIm5x*EpuISc z^%H0C#NGGesV{v8n`h1glGYw|f@$;k7*AP?hw^+g$clZXaqg+gGUL3n*HYZoi|kG* z)ubHzQ$@f)pF;CmAZH<(o}OeQjehtz)w{#QNqIHaE9$@!~q3KlLJh_}CM; z?+4Zqe*5e>jJ7s07!A-LPcaZ9UyOBe_H-nj-ZFLcsC5gBD<#@*QDf&+ts7(=G(V&B zf#=Q37x9RvXTpGAkUOM{U3i7-Db?J18a0`LJd;>B4E3PDOz0_kPC5$%hB`u;Hf#Yy z(IG6AN-{(48@!vGV8Qbt^a@3;O>%Wcnx!cB251h4IB@GVxc+@_!qGclp);?C8{6tU z)pT)}+gXg*mb&IhqasVM?}lihU(Cs5nS7Q>NqR0ojNMo0-3u$-36L@zeVt!3p=(RW$K zig7LtO~%vz5f6O-|JX&FT~Z%q1aV2d_}|FO-u~Kujb`H?S~C`D_>qY-3t9(*CN7fa zDJZi5S)uqT3SHWS?9U3uy}V)_Zuij`PH_Akuf;2V_03qh@-hrJdl>fmF^-GrG9iL; zic;DT0oBnI%?)(wMQbMH0#=N?Mi`j9b*SlUAYQ& zM(Byb!f{}G6HWs6a=N7-!lOtbvL|>Vl)V@0_QiKUooa{6(P)Cvc;XYep%&%TB8PrQI>*J_Jndp!V+oL_?;5dJ97-u`VKhKvZ5_uC9>9k__DMq zOU*3L+0QJTFv;f3h7M&EK?lz>3-h2c|F9J8$^d#74UmC;rhl&2&(CUpcRVzlfdTw- zjdFm-ieX$OEk^1JOKGRRP-7tho-pP!@Ja6)d%$RI)j&`5&id?Xbdu~vRtkfq44LCd z!g)d=y^B*I8$J9YQ<7tQvt#+?z@KXho_*Dric$%8(w6R>XwA|-b`r)8x#fGC&#tr| zMAk`;g?KWf!fJrM5tH(Q%^{x+2ioMVKAWOGo1m^ez3OOnI#^y=!qLkP;OZj>arE#( zZSuCVXCE#*bP!iwaTHe`J&c2^D`+$%b7i8V=pt((WXX2t%Xs24&Q$85q#oPpT=K&@ymE|eFOE?73F&~y%N@mpa9di6TcJ4$BaOU zo_k}sTIySpvl1z{gUoj@&(5>ch%$9V<@$&?Qdao?lF#*+Q$|3EOoO#Ny@&mil!m3?F^|Wvx?bx&h9V9ix0C>l z|1IX9R|8S*j8G%pw<`Ooh*gbT3QVjSnT}3PEfwoEQm}p>hQ*8iB<_lcEZdR~TW?rH zquoM#c@Aq&y@31w-CyAO?>vIBWcfc0BspKrk{7klLhhXt%YGk5RXQvoms=dTdu+J555^!{K6~HYB#Zc{-RAD zcLAUc$|#Jz3#LV53y@>HStJ*gZ8fh)no6f&t6^qcOI}Z4*-*qq^u4I%E6G4=U2zhfl5cpN2{^=z>t3Z`tsp*OV zS&8hoyB&Ug}zeLYz)w6*}0PezxqA$XFM}i6(3_*V0C0On! z5s%Iu)SC0&5nqh+Y9x!^gp8hfGd3YBz(LUvirnIz(h0Wd#ty7faeS4G*rcfF2Q ztBYo94)tc+%SnxQ#u(%L#dSRX)CoNB&=Yv*u_y83b0=`|%xP?{UBJc7ZES20ur(ZF zhzX{xhSsgun=RCvQV(B;C9GQduX53NrrYRlyFx0{09HmzMrB;#MnHhY3W$Oq z#IZb&Y?P3O!a$e(OW6*Qt-_E=2In+rQp#zT+W|r-bo?cfJSILZEb#<}1EdB*vL6D> zI=!+~iu|h2P46E+W|hwm^FI9qNDzOn8a+v=>a*DZFs&~;z;usxc~&^(d`&8!;-D*M z$~9Ezgps9PUnPA=15zBTro8MWcsB7$sl0~gkt4Y!GIOw;l%_R5W!8whgKIVkKn(Ml zIQK^r)cPZxNj}$VVP$Cn`<555w6K8A!V(tt?8BkUkK*|8W4P(~Fx~u&9KsDf4UEx#XRvcnK_)<7~rnYd>)_t z<3GV8Pd$xMyA8~BgNIE9B|Rp;sw3Z-Ebp^^=p`@>nfS3{HRyVN6YndN&#S^a5ojc> zq$qRnNQIC6y}U(Q0u^@f%=8QA1RYj6ysWQC$0~JJazLqo-wk9W9*L;BcCjg7)c z*U1JIofvX}!X;;YB|cD`;(Cis%O(@lFK%J+z%s7>OH$pXJS*wH zr2e$b(MRNkVd`#}2r77RguQP}J=-jD(g9bj%?1^(CSx_C0)|o543&ux+GmAPb~|5d zLg_y|L^PtJH;o+bcR$@gr$I^PL}ewK6OYKk2N5i9_DXVx_UI(C>Ks zJNW*0e=l>(rTX(v(8ibQw)_{q_YF7vHsRP){Xmxw0^)fv%h=+s&p8B=jU) z$;=gn9}(axuaKL>`z0Rum)0@2IFBpe_G;YtzSm*jHHWZ$R-#R( zNaM5at;~uqqJCyWnkA~v0siMjN;V&rGcZ|yS}3vjPKCEEVqb{#!q_Oh`DX9<*dj*J z(+D&*U9=M@&jf>Jq|vZC^eYy-uEUVEi$u`zTRpl1bG3g(3pvg_5B(VC^H8bPhOjz;!R z{pcAy`kBANsqZ|7{`SzvsYSbF-)ILC;Vn&c9|laZcM%oPk`9T)h_ST*wD+LaUh;G_ zPi^O|LQ%V<4kPGgQl~;gBv2kvnM$N5D~gu`MA-|Iy}!QQQ9ePSz_Sa!4UJVq;+Zlh z9gAfTq?7ybyrnDVx#)$qE5fGXV8}+aqF4iUqO3PA;@F;L{Q3vpgJ1pN2XOrAW2jGi z7!Uhic4EAuwCG@1c|*ZUp&<=NGAbwl#=A`z5u0w5NFF<8d(#~+?!eT6OsmmCy)BXT z2KvJ>wt9W^dOh@e+gQ7J0Vhtrh#x)qG#+~BaXk6>GkEFDY4o?ZFwxOW0=8-xH5-^n zl&#%Dz1!BNb@BoesbTkXiLwnAJjxkqFe%AMI%dKUNavHlo^4K|A(nTB45cCA-zN{0 znXO<5mpvw2b`iwR#|6U4>E0A<>6w(HL?|Ug-0#oK4;qps8Ij+cyybhv^Cb_LmP;el zX^sX`Af@D3bD3P=sq`M1J(JB~&OI7v6+O!9$QPj#GcRPrrlKTxI~w2_EXMxP(9VV( zL2_D8&4EH;tQBQA?w#luI*It1-P;RDEE438Rr_BqlgSxk5cPVPNw&;njK*w+ zW<$p8wb5Q!!pi;wxboQ5c;$`9@#-6{!?B}>v3F$^-Oij&X6SUgnD2Jb?bcDBjg`m7 z-sH`c0Y@(h=oh_Z@>{pemujq#fHn^}np^RptYNFLV?%1sYi&IE=%e^I|MuVG3t#>^ zPD`_~)g?@u?hI4D&5$z5_^3T4ZM)+|OLruCz7J?Dx?$@x&vVvPiQg+cOPLTlAn}IE zd4C@jc}egGmdQqx(I2w}BXUeVM!MmBLtZe_PD3j>b#ytIma?jsbMSsJ!wY7lPlmo` zW*!vyso35mBZAL;{|lw&;;5#j63yWNd#}C>*Z%Eaz_GXAj`=-{=v~~xM6v^uL(<9$ z*%*!)hPh6L#$cF#zQ7{t%5AX>!IUMbhOcF4vd<35M#~1}uWWYeSsv;{_Hr$Aq1f8Q z(QIRAJwhJy&>2yd^-05GI-2MllRiRT@#u!Xjl54I*>oK=`h6SIR3t)q)4~=c)0KHf zsW|}Hz^y#`*Hnq`Rp90vjIuq~$q96Qd98j>5i`)k%IDa)z!xnCE8D9d*LzBHum z4~14giiht1ctv|$lD}qYdP#1;PxaE*T(g3urGJi2_n#>!84eS@Cgr5G$*oQXdX6Y$ zycOQnT~?RD78#R@Nye*e4{-2?%W>m}-iXWJ@Cr;v6HK;;(YQjtt|>7lKveKem?l$1 z2z9j%+zqD{o@f(Jo|^4Sj&pSD0{F#CuQt4;(%CYpP)z9;(Qbcny}j*GU_Z+Hge5}v z#C-4~aw-C?n1k;3a*(cqN*iXGJh28K4yxQUtEocunx?e(dL#5Ca-N(Qw$0`(Wx1NX z?_9TurNuc-dsq3x>;q;OxKSOlP1i1aWS(SIjudlL6fX2_u|@Yyb3PP6!|;MN9BR*Z z(VXkz;)&CE;_h$i%=4{to0y7cRK25>NHP&*b<>0FQuHC{PUu$*bQ+hd!t4=qjLVW9jTgpcmCZCY@yTMw$`HGa^1D~jSqhqAAIk-aoNfO zM!gM8WEQccj5{A2KPRO~(CKGgz(Vf>%WI8LeGHeS`77P3cw)mt<6ATGS-&os12r@y zHMZW+-u)N*1DrX(hBK$n;p|K2u(oyqYwK$`b>3951y zN_uDpZ*iZ}A*3gz&tuP1mVqfCyFTx6>{lfM&wG@N6aO%b!}Ja&IJ2cxD4y7A%1gVB zjhwg-s#83DTC!SdK7(94tdGW+4Q2ND#3szuW@u=1$Q&5mg?Su2cp0v_;wY}V;s}mN z%KDytSX$YG)xCRh*=751c>iAPU6?~h99uH}Y&^zD2G46y+M31{HLE^}M9JR_JK^0t z4ar!ei1D$sjK+fLX!eHYzDwl2gIQw^&z(7kKlsCs<8z<88;?JK3jOXJYV%#snyTQP z9C^+e5OJ*bEal0%G=`HAZQfXvBj)5DYXF(YX%Mc8>>a%NNM#(&Wx=|iVSM$v zGg#r@(OU50JIttHLpQ^a#YkYjnZ2Kn^JNx<<6!!BDSG681r75*){ckJbGc=i0fvv6 z;Xw>roIXQ5Uhc+O=?Pnj)1W=qLA~9?Q(wIwKm4PwW9|8uFk9#V^Bo`6SY(P8_pY3p zZe-%QjH_siC}yfS4oZSN(XD((9QGm*M&o~q-qu}s(t>OGSnr)QUvV+W{7qOU6NP1}~z|5OZ}+raYjJg)xb+i>l> z{uY)GtzvXh(%n4mhzdG{mnk#@;vpIg;xe+9nXP0@(Wsu8Au9&3q_4^~RC4YG*X6qR z%)Ha4#EM$l!W*lyk{MnplZ%**0*;tF1i#vbg;KVk?4?-GWR7C^YxIgEb3bt2J`FR|Q^? z9ww=SmU%EktJ6{gy?=2VPk-e;JazZCu=e~}OeDG?#<^{H`sZ|MX$ghqWO_D*aN0w= z&Z8R|Id|inU1`-^bE%xjyZ|eHJ{00c6y=~x>3NBFGH>X4`MVI1n0PM;Sl1C6qNqbm zBvRtc0+EzxDE2H2#mWuz-6c)2Z$^5aZA(m*4VMh^bOHJOePrQyjN0Y~mTPtV?YF-b z|M0he6R*AHmFPBS==V3!m^Ccz&eP(8w+J$m;SnjDG;BjIdUjFTk{zTC=)9aJJ4-TdpfO3g80Vi)*#%rilstn> zudzqFe3#e9pOVllU0#KvnQpiM5=i>u4r38Yk2b`Fjax58FIa(7mzy0x)BsT5fS0R<%=GChs)Wko zj}Rl&KuON>KF;fs^`%=Y`n-*1dmiVvM)=S7ei#4G@BS{n_uxa=mhztYdF4}P)sbF$ZA_*8^INtWddGdeW+ z-gVT(anu`NZlR5%cie#E?|nTEzv@~o9$C8v;o;(tp**CWLCEpO4Av8L-M(r;0MN%-JlAKy>IhFQ**pBzzV-%bXgOw`$j zIoR>qV($!COAz$S3je$-y7F=^mTzYaAw@Eu;Nb9>R={cqe5GpBtX+ zh|u@Ztj-*Fvg&55h1Ogf8)q-#(LebsJoOjfMPKf{JZ}dbjwv4_5xU6Fsgwm$af*eg zO|mx2n9MUf^h_OSwFKN;1ZHo={rBHrz2s8;eFs#zR5#+U{oaQT9l+tE{|KGV|Dtv1 zZZH{lGh&lcL#XIWnv&^JKV}tGB}BpQ29`3WG-z7iLTfa|Wj9@k>)-PWxbk(cz_>rg zXgIQ_Y${tgX3cI|^wad_aP&xq6Ra#q4e!}!p%Vqb`QtmpUD^<~_ZG z8-DsaQ%O;*V{xI2xo+DUuK3>A%*;?z9$jbP#uOJD^jICgt-FK^N|?pYi(^fAVZGJR znU<5m5HEcDVLbV{Z{o~@&tfDulE!e_(UrD13i0I%epdK6fe&JG!mQ^+-2^ESAc~AMOSLNcHkyDC44{PzFa~9$V>Hr zJAj>h(Nh#-)@S0=o2CyMjs5KUB|R8Ka4au=34?s#wiSsKnY>S)UR z^?C!-S`+>87+d`TdVQI_JHmK0LBHR}*$e0J+{sfo@%%|V`}|3~bovao)-Pzv{C2O0 z^{pN*_6FEy>SeQG^Vh{#Z`RFl4|*aoRd`-M4lB&rFrRh0p0riHRTw$DsmW{&q)2zL ze5SuDP38MJk5QV&pHieS3x#mB-ZXJa!l_FVAZ6mmC=>Bz5utbc3WGlPUnGet}47ui`J=HMv4(ciV!)%cp!*|VCc`w85(i2FZquG*4c;-YA zHL87WF`wO?-OPIQ{VBDlay@FS;EnT~))*~UhxrcLrgNa!P)=Jg{73+4*`n5j+14&) zoNbx7f*GFu_M>?0Prre)kDkC}Q6?~Si>W}ACuv^`zgiZ!85^c8Eb&E>O<|yif-Jry z`n=uR!p6qG#Ax(?>6ArZrSZ|A@X( z@RzMHtEs6ta;q!SuO`5yUUEjzz2l{%SPw?1ZT7LaynthGdlhbc|C_Wa#IPsxl%?5A zabtO;dEq$@g9dtGzzTm`uMq+ub2?ZwEekHD;TThzOfxT=2oZML%m#WXbn3#0^+n+{ zP@Po35V`(r))twJy*ku=JCJ^9*P2$|LCm<Y%mD-n;S!Z_E9e2#9(cr6R< z$OOnh|7E$ZB9<6+;F*;?7*1zY*tYlr;KjAcn24-_GDxuHlu*BuMFK_v6y!6e)Oq)I zNpIJ=w(Hg;i(L;3eY)fJrDu{11sn(x-|S<4GQ?|Nbt8V~xBfnU>8)?VYPXH?a9g`E zYwra8jssiIe$bByBJ9o>ySRz-YZq}r8qBRQrt~h!ahxcEG)#YWhyKQvm=drN3 zh~?!4tgI|yRU_yfv}NLfj_#ajGfx55wpCL#{AE75Is;Tk)YWh|p4LQq0l;};Uc`6_^Ox-Rz$%`n>;p-k&;>G+8A!$n+m4#D8&xdqfbt&IA78pFU~cz+3}dq z+y(Lux=)!Xx@PjvE+kmeL5VLzNBO$qofFMcPbO@mXQ4pL4RMK{4>#7zW$DjWDl zOh!AQ7QD+j=_$6&KF9{U(Yfgno9>ZtRgzMwQ`~4R`C0uPblQ%~KTD=_L)UAsiKZMW zSr97w6N7$yjX9T-XYabs0$VmmJV=J3P>b1(zze)rIs05G={pw(KGJeHCZ#H8Bj1gMOz{x@) z{+4BCMYWJ;f@LaluLwmm001BWNkl3~^Z4J;Gk8$u7 zSK`JGzYT|Oxf+v^MbS+#nlSK683*7dcr8uU(xy$r z!YJ?`3Zt!X4*O#ZflG-PIIx(39(6=6>_XpB)+J$R&J4>Qu(*4OBLB$@5i!uWdP9w% zOI?<%F-CH@LC!`X8o`*=&}uZWu-HbYCF82tD1^YlH_H{O>1Nv#>Qy4g_%w8_57%I% z#3Ld!&gJ=?rLNW#oqOU%oo9LCtM{RIu~&@D2<^tvEydXu9(mfcyNLr?u%xvMu;ZLs zsX15oavs#`9+K>0&YPSaN*S!s5U2=xI-_Js*?qqQm?XeZ^4{)JOBKM#jkny4Y==Tg z=T`w^N?tTx;yk@mv81|76dk=p)VXdl0mXsfY8c8%===YdEmb#yj5mi}=+K zydQ75;|?@xV~w=2Nv{#JfP6M4BKFSFL~E`{IAS=9QN;pa=#spLf&l@O0Woh@z*|gx z@U@cW70}3Nr>SOnu(Pf<^AV#){>jXD{U%T&ETk#G81>2?7d?ViCqJ8o2L50|jxlFGea zZmHo!csYL0k0P4o!zyP(X;^ibWS%6iWKVWg$5i!aY;n1HV%#*B!bBKGasgXNWFHOxD6^XM)tV|CwN96odqM+64!S;10A9JLmG zD@CM@xwK43#-7P!5H`!wh@DvClo~T>u4wDh#&aGul#zyXgxQwZBm{m>opx-B#k6F- zj863=Z=DWJC3*>$*WOA=NxQp@wao#(`i*bmlb`-$eCaD+L%-8SZE?XyD$+?1B|Kz` ze9nAl$~_;=S?}0bHR;~2wB$}+@5vu1?>+8R)v!Le6IvF(N1yXR6=&iWG$9 za=$l3V>H6*l?QPBhu(rK-~4KHmgh0r=wl>}46UN5@W0Ve4fm7<1fu!`}F= zXJt_fr3?^LqaG@8Cy^Q5tgVi)gvAY*@I~hVCnaceH(!VIjM@5zP2b2aKO_CFffIiK*6+&aUN9wZ~p6i`{QW+c3>&b;g_tI|(aUx{~i zIAE!_Qbt8)C!sJAl=a2{PuH;^VYMLg{j-ofzm;?GPurp^jYUF(+Y_1K*0qh)4DTeD&ZxnAeT}mD>>J)5U7+> zDwtgvm>ppNgH5E=(U8t3`T$XYB_+yqC^HJucsAEsn#!dqO*T$ryFbL%c3)H6)obc= zoHd3mQ4F8CsVVBHX;fulp@VkI3=jEx)C^I!r7QyOkybW}aicYhNeD6m?<7D+fPBx& zglt}WXK5bIP7_M9$ojSfsJ6R0>ZR6u`jOFdVMr|TR41R1@C_6 zJMr6p@9*K-D~_O58(}&b=+(lbY{;nmQ$14_f|QBO(HB9r_jdM(I>Cd<3hyi7jxeRy z95^Kqir26egi+x=f9%YxcGrYZ9Ss@5)@Y(8&Gu9t)Kq+m!7h<=ncqGbjd1Sb1|EC* z1pf0k?#10-_zRp`JA+ZHg<5w`Q{GixrOv};ddnL^rb-}#BsG;fO=l4$N6BsWvnDPM zY@BwPAWgrMXwBtIkZcApCE!lp--U+D&65jyBRC9~H5dfUL#GG^_TOMZ9o zQLZ!cR-(1M=jNPHkAie;molk(yXb4e_YAq8c#rok(Q0OnEcMccRp~109r94VXVy8? z0WLB^e(CSK7|A7l>tCXH)#yNlN8`CgHlKZDvQe3jV?2lJ7D>y@AexB$i$Wvs9o(*f^i#=5mVCkz&b!ayr2Kv_NH9Y=>@8X%S+^5m=smwiR z?RoGX>BY+#tGZzqSrmANjt|G#WheA*LQLdc<^BwwY z?7+=8zXJ8zXD~N^EoQTZM$wtd#q_cryPX7cjto%nW&s`wHR1ab5+~QY6zC1nnoe=( zrYmsMufG-hufGDb@f5@Uz=Fy2OjZmv3K=$Xqkv?p5QT;aPj*ZXW17aJ3+=#(Ayf-* zF{4E$lZsIs>L}2ZKi?aF9XbHi3(7k0D#&$1p==1UUWuvdZtQ#C8B;DU+}wB?jmFs8 zmfG2&3SNC=z2POTrX(yoX{M=;-F6cT^Bpv$+ivO>%2XrUA0LTEqt@rq8)}KK1r3P|?gK#h zA^93~M;urxh?0hIt!3|8PUE~%G;f4eHvC9me2ywaDgpmcf92fj3Q;EywS6xL!hsB* zm+oteFH&?%Mt7#c99gRxEV~&nzFrzXk;0y?l|7IYRf(ccHa*qdz0~GmN_ld5%{jf& zQ|Be}EDE@{jm}^jx7>I=KKQF2!Ux~=cX0H;3MQjXOvfX0qM0u~oLbxhW{VVj7Q|&l zuYDrC5sfcLfP&Gu&wzC=e^5xsDx*vJ&p-ubknx(O@KudApBbC{D|V)KjvDFkI(C`a zTC1@MT@4qv`uP5j9>QIp`eXd%*Z&ePU0B0pe$kp$>9!W5feb7Af-*=ajT(xv1#6A* zOv>BQ6bIa(hS6}Q5l&@#j($)iSGlL$LVX+V=#jt2^OB_^UAL=pUDn4@Qk3;o10hCV z`32r#Ikq*Bb7n9KsC3iaKvT#8f2XQGp`jixM5~z2zKRi$4V0?Bl6#ARPDHQ2@8XOL z=bK;8aT)q5)_jUlp_-KMG^F_{&xFpe${AHj(9c0B&i7wUhpi!IYa2MUx`cPW<8AoZ zM}7^54_t;$M@CmR&}kV!7dbDD+xq=2Y;13$HykJrc3N$8nk~(!l4}Ui^DA*HH7mvG zv!r7)6S>pTC7fr!70z`t`Q7NC9(6qt^PCCvb8}HIuQHv=SewX>nby8bW4Kmp8Bad< zBL4L5yYcBi`cwSq$!CDoRW;6aWHd>OLP3|2N+LpTr!!XLT==5{v{tNCN+pP76l7hH zF;2=(2_rq7Z%Mu+0i=AyMqgC$RBkzfnzM}ZOYLS*WSLSOL&YoyvU$>RRlXwV2>D1o z!1tm&bUu@GcbO0}xKK0(qhT8OEenq1tco&(d~bgbX=*qaY6-{TH{6Wt-urqSea&%| z-CJkZwfw@$EG$@(xr_Ql&o6J4(_uN5To~H+%0)wBBczlI>DV+dAdkcYFZLE*9$0nI zD?3E&xF90e|HTgZU1IO-_wi_q{$Q-lfrlfTkiaOrez#WBaz-g-lz$eGky+$!oR?%C zo!V1#P(%--Ok>mt&d0&~Hh7nNU`}^BIf}4LeP*Sj$Om zc=XfXz-g&HmjI67MC!>3`IuO#ewg?&gi_KmaW7_?WPT(M=29C;(~wavqwiyR_4WAL z*ZMnm=hFUU7b$dUZ^&Q!?XSD8gT?Oa(3<}g8ubGhSsj_B0yAYKc~OJ-3B0K35`d1d za8eA}6Pp;?~#+DjOAUa8+NO-u!ArHiSc7J5%?$U8kHpe4iWd-PVJ+$g) zlMOpAO=&3;z5hI&q1~Ec<+2)<56mzbOtEpghW>h8gH|%jU0RFGCNd{h00oT^U!xlX znrf{7>?I_>#*nSNfR`bKH;~sdqMX1_Rzh@!Fp{66lrD!%xRk+=wasL2ljI1de9B#u zLpUX|;j~gX#pHHA|2r6;QN+Y&?6|FuuYfYyyRjfgF|>;W9AjCYi#ezCGm&*F4lE*V zkDaN%u)a{otSi|TGi`jW+r(P^ENFtgT##hpulJJ_OXsl*7qC>X?+T5FYK&nsATc7KA;-2El|>wotL zc<_nD!Fz!cf&u;S5V9kX0wgXo6a=k9MbpV{g9=*T3%#*nh*7m<&ePTHC}# z0u;oGDLIb#PE*5O_LMMLY)y8s_?0Q59`aaqicK0aLo*3M9u4XRdx&jms64SUE>3R9;z{l*4!F5)2lL&wPFj%rYdXKnFvEdG zQ(Gj~e6N|y#w7VQJIC>)s{~n}G!VXcZVgX; z`FnWg3*W)!Mh~;4Ig@)uN&*pl0Ub*`p7cu&eo*z4&MW?P`F;hxWK?3y53mJQ5 z98*;SrSE#9nEnv0$rMLkeGE7K>YK58?GYQ-(jS`dUFtt+RC^cB@ISiOl&S9?pmP!A zkso%64MW{hg}CJKA7qcI8>}{uH8ZkBR5U$Yr`wd9V_0L6BJxkU5?kU*&H_%H^X`#u z2e}cc;K+_7%yYuLC>p6hl1RFAbQb_7zk5lQu1y4AOVXX%O|;uB?exwx+iV0_MnVD3 zEZAApRjCs}v9B9t1l!@=_1*NQDAIhZB_rLI7jWX92k^va@4?A$KZZen3@puCr)vW4 zs&F)fTc&nCFQPGwP|IxfhBt&;L9Nj>%H^1~(#HEO{oPCf=Esnx=Epa!X z9sH0Z!8r<2{Sx;+eXh$hU}JQZjhnn~0W6UWEjMAIHN&94sq`ncbBrdY-DVKL z9aaTch%A+8I^`YN-ImGD1RLpQ&2r?m1w0t&ku*r#hN81W>Pb~n`xVrs#=aZq{?05% zF$;I%k$HQTj-6`FVRHcd*J;Mg4#>^mxBhicfoP{*(*%a~!@uVd7!V?3CuK`4)zjB6OnR3r&-4S?~mhUuuL zqJJV0crofD-G-xgD#|AFxi%K$x)V)l6rbO#fS&-u&XDR1@|RKrARC8e9w@R_$W(5W z1YHIpB<~vcS1w{>v4XY3y4Gm9uZi-A5h-1x0e34woT1*Tq283SUQ%vkwp&YlgYvIA zLrebFo4UUGMjvJ6OBP1 zx88IEKJebZi}$?amvH>@Lzs+Y5u@?|fv?Q#LUNurinmD15v0lFjHtrA;P@viD1kBA#j!0v61 zU^eF}GRx$85jA3r&3Bh@u|LK)zIPw)y6aQ;@>l)}>vH5POPGmnVPcZfSdxDcgvj*k zQiz7AFhg@5XmYHYtS2`ZrPRufv$%{r*(j~Fvu6WT!yNuj2^;F?KFZCe<=BNhT_P+xgXNy)D08}x5=zr$#b{j_ zX~^#N)@z3MC<0M6?Kd<(*Rj#M>^Bjykc9VK92*3sV@^}j3I_q5u&lv%T^J=UEQrzV za?B#7s{Vhi5oc!U_c=$8-;PeAeVj^pn2>K2PQ^AIrgfd1_ zvF?AY25MCJROmQZj`(M40$u`2$F;7@f{P zMIA>V^<0tWUI7f$!UW^-XaAvkc@>`}-B?;PL799g-qEc-Ru3%Uy7#^gSG?s`ty>;$ z_H^cDO%$%idAyURrxBS4(7~0Vs6!bxp^2_a3r6%i#<=GNNEl(PVu@oldiGFP|Lru~w7w6FEwz2-)Sv>rQ zU&M2N`2czwL+jWsBh@PSW9NZYgs|>Y+C$TPrfQlCUUxq4`p?5&VSp3KyA~}O3%f+_ zb!{}JxhVuZa*vcc8!qPxz#zTl6y%q2n{Lh293Yz6?SPbZp_GgI zcaf{gwlpj}6790mj#sS6cfa#*JS)=`~SsS9Pbl_cUe9AKljrK1Gp+@u%De5Z@KP8;2JN2BR=9nj{$+?`mvxSm7E zWh%8MTSXZOYsO7I*_Ey-Tmlw`K`4-DyyZ?c*R8>#uD65_>-7#A&3QcZ_*3}3yY9lD zec_8ZEve4SiQ3eYOF-dtMuS9R}FMxKrTUf#Eee!+!bX{LFmLC$xi+tNNNmH<+Od7`Gi z>U`t9Ies_{_hL_!oKm(zDJfGQV>DVcp|dOjE?U)wjDVDE7@6R-*~imgz7LPyeJ?J) zv~GbMk(Ys+67M9bQpS!YYrTw7GG3`duoB&Q@JOAhO;MoR7z}!=KkGsZI-JYIKK+_0NLWm@SXoQ5IB~VUR2}vm2c+!_YdxdAcYwvq5-7vI& z-K)B~=X_!Bcfaon&&oLB%o8x)7-6(Nv`({}#hn6)D*qT9abw2BCgDIzD>G+cK!vH+ z!J1dK$maqKZRvg`Pvx~pUah%Wjx4!AvX5CPN#i&U{Jx3W%*Tbb zdm`mxvh&B?pwvf*MARBfBkN(Jii;$`2}F9m%N&MHr_dd8fu6{l#B)w*vh}Hd28Y$ zM!N2~gP!mt1S&}MT|4J|hIND6qd^AnoPGjeY$D}zHb9*>0&o?8P_f@D7H@v;1W=sL zjRpM%?r{%Sb2jRoj_qm*;E^XK>LHevG>nr}_u0_9@TLOJiabcyDFkC@Pr8$z*EY~N zuosuV^%8vgy6bfG+Oa#fV6bt(8rsNbl|}60bc{v53c(GVE=II183LqJf?qcjOk^48 zsqmh!&#^|-80zlERytir_KMxF80hI-_@g`L7)6u_pBOF8MjM^^ZFuOZXK};LU&YNg z--<_{eh%Y>MaxI+EE(M@j_yFmuR=7 z>`Qi{U@Y1&@^4ETq)7z4ZPDRcm8rSlEGl|xzN-9|c+@Jg`84EOkJqL8G z;F0H@ir;1%9{>O#07*naR5P!68_sz5MVO4I*w`#98~(0Y_)U6US*k!sgM z_A!<<(U5gH6{Tcp^qPDj(ytSZ@qQIvC}ozMMqp1{&YgP5NQMoNErUzS7+2SZ=nt)w z#dI5Sq@go90yHC11aG5(xw$Tu7kcP)+Rj78K#xK_pNPU>lioW5RDR{4H(xXTJ<7&u zuL3HSax-fb$F&yPlO@XB^X}ptUViu)Ja+S)c>b&$SXlTV znvJfe50Ub-UJK!oc_LAGjrPmh68NHm3MubQ=3q=;9*)pl8(`~k+i}jdZ^zEJy$Q3^1mvzS2}0(46!vd6CTyuX}Hn#iOL{#Tjf z21YbUQ}i44e38<_edOA8g`P?^*dfj#lT0!OsdS3c%7xnuAIK_i|>vC5d88@zPHo!+n2rBlbT15+;In7X`U` z2XTT@UrV@Rso0`cyH4$j{Jn32pyBP-$VVd`T6F7cBuLpL1u#G{AEyqC((eUX`n9vN zsDyDn+I=Wxkccc1Vi@R3aCxoiKJ<=Ps4-iWeC(Pc<6Z<%rSpQC)vY5){%fOF~!)&PHym+w+<34j6*(4fdyQyX>dH@oYYFFd}{_8^+V~2#72v z#v_BCR%nre;uM>T6K^UFr6%Zf7qKyE;m1FH2w(W(4fxh~zK36|tYWk%YO!NHrkTtu=beb zY+$Evn_VsMOS2$5PwSOshPxQ^(y?BQZZYoFh}VBPqRWhNt@~$SkkR+CMCI)S%y4J& zizS_!2z7u*5a>9*)I|GP>6kAAuTrcdb(2Oa^00OWYNXSl0rzJ0=6zJV7@nJWlyxz+;PS5_Lm76m2$i;^`nQ>4$48$9WpE7!>0>JW=5b4?gj%7Zrgz{(oBy%tWmYOhkLxu&6Vh=Np=e~AD_kt8?euk<7$Q}c5;N<)Agn2Y58)d+Hwv*cI3n1y zXsYCJh?1+!Acg<4-`#@r_AC;BSy|oC265U#K_9}M-QJr>m+g4L%Cex{+?N(5&AsFP zFlG{!n1k`LV_DkI6ivC`O2$t9KKoIq?4_H4^z8vCBYpNf$=QERErXQ%KkKZ>&esIkd!pgWP>(u&ni5-2d-JW@+2c!QP58U_PZc6Wm zU(7pycsG87JJ7_br(S_0kNnqYwcn&65*cX`JP^LM;=T-dl02@NA^3hJowTNXvHXn{Zl0Z)Qe6~I_cy8*>C9*w|8ow5apQm?aF z3Bx-g%(Zon8la5c^P1+RRAJ3}THg?j@o8kAsaO6TC6-bjXo5fTc#V`eYR#jIhH2cG zQP6HFT`k=JSsgD?#^f1EgCqbhSUo= z2n{cAqVBYJm9D#bf2li{Xq1e=*u7(t5*U(#N52BU>yo^vyTHZkf6 z_PoZK-MoE^Q?6Oy2(~xMnKdQKEYaB|ys~!#-~Pc}_|i=`;;x_k7<(nkEM46@ zzPK2Q>#4XwG9^=mno#L_9cYeb*mlAU=e%=@o#)%y2dh?Z&ha(;jv13CLz~SBIXp)2 zsJl>%-quWc-NlUc4OGL|Q^pm4yOGNXsO(i3&U9XsD7Zv44NX-K+0U#R&EWd%70ORATgByLPJ+k|~=a z^d%kKbcRyfbb{t=jCOa1&SDeeQ5(O8= z*R)}()SWNSEnw^XqDIqIk16eYHkQj7v)fD;WC>RIssMVc=m`K|-_ggh*TPWYK5piV zq_*<=o5-TGOtK#4Fl)}^nU`O}pZw{ceAdK(A};tZB(oa*~1ox&TJ- zTu_CfA$JiY+{db^!*>fB&5k+Hl^EnZ+N8ll(n&tkapro_KI?}-eL@2`8@w3#OdF5Fm7JKLW>auCp-#}w!6V^XekK%cqc}3=@R{#r;D>7GR3d!#1pfq%ANcx2Kp3X>K$<#5rfALe z&{>$r%8R@4&|iNK&))Gf3?(f~jCRF~rKw%TUlg#;f2b@e{lW(e<(cyGb&Vw4LgAW0 zq0XS5jQD#Ts~i6do_Od#R7m#lF9&h(;Vt>i??4l;fBk3C?R`@DifQhlY^iWPGF>5d z3h9vUwz`;Yl2m#a2gx|k&!Rjnk%A#wYeVcf^*Ee);DTUQzPII&J`qNRdbo>uRDt$VHn! zrve!DCR#%_>OBG;S)k5@rbwjW;Rv=E+Ma6Vg4*n{TIWy~@P^Suuvi349RhB^wcK4y zeVpw$Iyz{`8?Z6}z?5A*9&Ij1kjleLXFQ#vGv7sb%M#XKUB#2P+=)m2>YM1Vk1&%| zrMb3&bopzD-y_ChJ^5xk_|R6<{wM0WHCNWow=LH^0*&UPD+G^pWQC<5t$;?m0mp|? zIr1hU@tuyd#OF0?hI@8(Q_vR+uRKpyXyl zl{IcfcDR!!z>nq)n=+IL`e=8_P>9iJuE@w+bPjm5)x#BT06S&3I+*R=i^a(pZ+QLd z@Tu!Qj!%B%16b@x#Idil!@ZM(2hZFXa5^`KnDIPIM)W@MemXm*nOo6b%2_8)DADpn zSn0F2;hgbW$D+hi++^Egcj|dfHGN9j99_EGHfI=(rHrnJMtcs=y}SpvefxX(!VNdz z{s$h$T5ryHLz!2s#NtdW$u$nV;!&B}*Z?+WXitD0CpU2VrBj^zx}id&HHoB8#2F!- zjUB@&y|IqljJc^h0Sif%YpW9=0cKMPiC29_wi-}gdLwn+#ldSemCDT$Y4<(Rh<2`q^fDAeR?UB zIbZF0)Ie9?$yA+Dz1{>1%S{XiO+5EV6Hk1viM=nhFqRL^&w#EUpg08bS(1-bWzl)+ zdU7xV4y<9R)xw)Ez7T)#d%ugzFMcDI7n+!iHY{4K84glT!ITKEt!D&Tx}HxaSReHD zukc*EB{k?h%y)V^j!8SeyCG5%Wo^gp#BE)+pLSNHf2%0+Gi3r>G#vHp1{dk}J?hH1 za%Iwqv94!(5Qk{pxs(sg^R8=Ivo!w^DwKtC>8V5rc9-p4BbqcNREH~QKs04&L0CZ z8(liPOO}?_oM@_w(^c4jsl0<_AjASGAS5r*a9iI%YcRyt6OY2{|KKAy@$Kg;#r6-Z zU@RG-%%}_>C+R`XQ?d;$(^4}tD~7Z=g)|}@S(#?YhmQ5kAIXxk*oF5zaXw~EIq8GE zLu}ZRfR2+$_##pRHKv-=8K(2kXEUs=4Y0P>*Iq-?h}SY%tmlT^!=BNwu?3ELy)KrQ z=g{r8)R<=DR5rLX7B>g4t=HsjcvPJawHaJEb$q0qS2mjHw%5!qr$g5=k+eyq8s*$m z+vEA|OIi~3^xr&$CvNyYc0c}e8?7e2ibC8ZFk}bj{v0+MO*oY64lKk#W2M%^uATHy z+>EypN0MeRP5(K5{G=8L zx|(;_sk~wc)I8OPTx!kekrS3?ajOILS}mM<#p`kQwQs@l&Lc56(8pxmYviNbq$R{! zsT#SBRbshWYr^i?|K)hkM%tNvI<<+6}SUeoZ@AKdsj zbZwDDv0H}K9K;Z)@Li_jhEeE2P6FAa%T@hUfPf2M3MV~66P_hv<$G&V*V2|$soFCV zrxow9MBW-$JaP+$t3y2deG|4X-}fk{TbDJu;YDB-0UsBl6`^Y)pds4xht~JJ;8lUt zcA&e}q%2e3{aGk|y~6<2pv&M|gEvpXs%?By#EF3A!F5>)u<0SXcw*ihjb$p6PzKed z*vpLa2ljQv==W7}Q%l9~n+||l<{;@9sy`vJgp!#`9|nOU4EwA!_0i@&(lAcW-5dH9 zWKsx#P8Pkiw`1iQ%C)4M`CzP(jw2W5@$PqBhJXBzeh;rd^Hj{Yq+h}yy!laY>Hxz? zp3yU(S6&c!#Yhhjl#K`98%8gJc9RWchDDeRuK4MgBG6#Q0ka8+58R0GsJnRFjW5)K zGxMm~u(a@oOj4MacmW>U^(=1q>eun58*j!F&pnUP!h&_Gb-zoYLmpjSo~BHSaRZHw zhT48dpEkv5mrii(nG>|;8d%@gz-Vm1&3u<0K~LvX>JQ1)G| zD`;A&yB+x)7Q}WC=|Iv9+Z>h6#xx^A?%&e1czfo^Qb?>4q_0aaGFZDByTj8&T>{t6 z3ZB$&>}=>XO|IaFjEQpwm7TLWI0T4yx)b!4q@KTp7anNi$saVa=ea3H^1(UD^eNLs ztd%l(I?FclyE`!ZLty_3=9^7i_=fZF`=7oJ@4M_BIAZHOW)o?iI-pO?9I`EQIGg%% zy`lH9pT&S3jmHMg#lP8XYXd29-l~DlhFIS8Dk5NNh^Pru_5X!<@-h=GZLxdH^{te_ zWC9zWhWcXPl+5D^_}fX^TxOfJEYCNG)o~N|KKKa!=#TzAzIWH%*e86pu!LE=9gR<2 z$h#g%vRn1aCJ{%g-+<1DjdDlI4?~T$BvxXADr+m-O+2ZjD2S)`*>36D* z#4z^jPUV9FBVmVauBSpT5C|k}l67o&A(H|Lqs6laG-^@HcogTkrEMf76`PP=6RMFO zCqvUI!vofYPmFW|sdcx7c>XP~RoiX|<4Mt7ufnvXOJUYze@X?aeY1xw`JAZ#^1 zsnDWhJUVX~wQ|s>&Q!{oM87$+DGYRf4%-0kfy-GbHR`mmxP2K1p5Kk1e)hZg`41kz zpg#bX=Kv}H(hDUJ6}l^9BN9**e-}Bx&Cg{gRcBI22?HJWt91SB_jh45{O5S+p_{TK zIsEg%JCG#E;qCbi@4x~seDnW`PV1j(Zlo*KB#nwNHE~tF{bqcTDZYd;YRj&D(dDzG z^feBwo#a5EbSp!P@yn65$pkl{a zkD!|evM5W9)~R5!6#8UiI|wH@_q4)9ohJL-JF2OXt{l9^+oICh8=KOBl7V6OOeu$X z5fzzKQhF`YR3cEJ6rw{erKA~!OyAX0P0=R~|FxCV0YQ-MqR)>{?q50-sk6Opb8+64o+LlKo{dtJ^ccvoHhxl z>ZBTB!U9@N+ma6Ry*A-6USGe%RDBxUzF_xeSJ)(;jarJ@jT=bC?->P~G52PQsj^p8 zJ~iG{2UY?NGOR%l5SWuuR|;Q(iy zd?K#C>PlR9<%e*>Q9Cf54z#I{vvJur8e@vf3jf#<6r^KEZTqQdd-1lXOJ|_xJnnsS zYS9qe^t!RGejf*5G|~#|Q3jL)vzk|S`4zsf8bviRboTTd)(2zU_t2yG;*Gc9wr|{y z=l34KP-^YwyC!no0cZ=V5kroe@eD@|G}aoJ@62$_nG>9H$rMMOWfL9->ocoKckpQ& zY!_8q#ld08m?;iV-Z{W!YJ{h9BYhwm=mntVso6u=ks1BRobW(-{-ADP=jcr?NATpx zIPXFS?u_-3kWA>v^^^rzr~Om|GNWdTqAP4o*)3+|`(AmfyIe<9JFb26_w7F?TOM z+Qc(=xA4j%4U8KT%;qF=E{!ayHdQNSgkC#i=S3mX{cD&XP4T*O&&D+$yAmJ!z;EIB zqmD4+T)VbQj{{r3mRoTgQs!+}cpA-g@NZcF-Z|gP!t}LVLc=U7clc`5t0Fd?h5~tW z;z=>k4WzT-U27GV=C~Fw#(!%m?%BCnF5>hT=_CG5gh9g?v$dydyVI@cPhSZ2FC7^|{PLPO zeg`riebw(tokFLHA50j+{N0!2j!zfV#o<4Y-bL%$l=k%ZzgfGwFCM!c!}S41eJP_V z(|@Yil>rHNw#D(4=(&yRG=6bpTGuKB}xRXu+DP%-3PP6`h) zan+pyx{Z?=R@VAh-xwC2H7RS5H4JpayE0yFaj}Pm`K|_P#BjGnt){YwN#>Lp;y6j) za_3(0I~9Uu%*O(H#Jj~W7BI{)c4Nv61D`+CX`;70uj_sBM~~xYfA$URdHN;H7JI;g z@E~b0(N*Z2gqb#_>m=v>3GJ1{{Ct2qWKx;dGzYt+^pG3iG*&%n z)j^a42a{GsW;ivvsa4&t#Q3_JH2JEM0z{8~7CI^@tHB;iouY7Y09UMpqBFhAdw@wj z3jb!-b&8ov6ppFGmVRW)%-zbaldIRr@{ZKd>bA8p-2UfY#?xQF2hV=%C)oeeK48mI z@`TpBmI|V{gPRzZnPBwbWX)onF9PkY*1cW#i>Z392D8VP^p*B2yfobRa)_z6$`wFm zSt-pfjEfXeIh4Q;O-4ef8@qoON~<8s!u6T|YPzS&f(iHpP~|mA$QgJ^!#J6ZF16?a zrX;%Lk&r_vyD$W-$yRjI7p2^4Yh7q_qmQkv1}=WxIryjl$?xHkH@y){3q4FG1I(oJ zuJ03pfgVd32sEAvtK z+Q0U`ivmSJW}s^=qDOO^XrbBaVr659pFHpg{`$+e;M?E%K3-Tkfbo)Kg|w^>2zl@z zP~q~G_pt?|F_1{Q1mdSS_M9exMTG}Sc0$FW>W&gdj|zD84i`+XbmvOoe0RWvQ_&qKmWpZ-d1VPtdAF#T zfMkv@Vs&J4jz*u4LKF5}9yyEWva>Z(u$)f$uR9McEHyD1wD7_s4Lo@#@amIN8xCMz zhSmc!sXJF=F-L>kXmKZS@p*|ebcUIXDcl(0^b=0RHCKKJzx|1;aN2Q4V>a$%Cd2I^ zDf9FZ<$(S}r6Ej$h=1iYvMdB!76J(ajv!dR3 z4P(9v|7BJTtsp$q>Y&w`$L_r=_~y62hd=rA&){c|KY_JQ50gcA{xTK4VxT+SlEC6D zeMNd6UUx2KQZiCa+V7huqo&izcPR@a_M)b{Lf-p#^zEFslZAB!I2{6a`FgWKUf46? z6n;G$FEu?@Q8gJ$)FR}*WV=mTd%kbIL@R_}_T>2U(ZM@hvCi(3b-NM+A=IZPNQ={e z>&WMk;UynoFhXN(4M)A^B%E>OTXDi$UyIJtJO=y4nI*N_C1u{|EIV*1%I#v&UqK(k z9IVU)F>K{IBC(fN4(ZmhZ&``LQ+M@?9l}r)aGsCDB5DMQiV;ka#^9B?B{s?Ou z(#?ISJt*Xeyu!2eCz8*%nwXpGXav38Y3X&XXOfjzM%LOUWL+UK>S50~D-`U9k%DG^ zu;z@=F^8T~uLim~3a7IPTJs&u?^wdVXJ5hNU-=Q9x$Pco^oM9{UBs*-<#y!5ypjy$ zNM{+tB%@wmuJc#jJSpndsQ3Ho}>NmCnr<`&M zwr>3|(VP3vtQL|DQ7B*!vHicyn@l*Uj7HE|6^0c*K=6{)qGPp>BThaBuetW^IQ88Z zXlKs;T3^$bBC@PDPr7#2iBVHtg$tDiH(Iw-YA7kNY$+-76Dj4a&v8TA)5pyx=n%MK z54po23EZ%&Qlx{mO&SaLdzt)q;26eBIft+jLbx*3umCapx_hX78%)2KVFUANwaeY<{vv5cr#l)2;%P6KthiXCJOk#Xuy1=eS|lyF0{$P69;6_dXsP7t}I zG>VgY^r>_slNTfmxS1UAO$zUQ+JHzMY)T<4TKx?iH`m37uXrauaqTrY@3rS(z9UV| zWLB;{hZzl=XprVIC)9LD0hqBY%wy*5H(zT~BR^(2`gsI#h90qI>M#C~YfXMTq z-2L>_mbLm@b9i|(G-+hqY@yX%z`penzIDeB@&EkspW-KvJdD*|%TnFhEH0MM^x8wv zCgp{9c3+$uj9Ht6QhxV7xO>l^hq-|nTB4{fSsV=nvdp54Oc8P^mukt(^KR(0TL1tc z07*naR7ID~o{g2|N6>fjw)3^1lNx{8!qS!`0T!}7Ku=XqZYpPuHmP-r?NRgSS9IDY z2729rP;;tP^iW)@wuhlaYWg5QPUS5hmmt_u(%c79LN#zNEA>j!liYhUf6xn~?P*^< z#k;Y(hHj^YV=p)ZXMFUnIQsQxU^bp%v_9~*Gn_b4*R)RC;p{C@9|`U-ja|!ODmsNc zYYl}>AX3%4OmqF8U84~sV(NW*HlrAKoXMrUt|Zr?i;*r-^!{*!^}#^16xpqvR=qrm zWYtK``CPA~QFPILs#?5bJ)O;z>ju$HN9vRLx+=1u=4h&HM+HW>H1-}XTJohADw(OB zr7oJi4xYZ_emwkz?_=Mt7cuR2(9oVNc2-%QRIqFX1Cb^uv?>a{e%J )zmn8KDJj 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

1D^rzZr^!R-5Q+5-r9&IYBzt1fannuu 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%0AE|*|DQBaN+h^c-+ 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

|OPgHix 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%0DI%Ev+z7^@t9rk>aN7sUa#O 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⋙ zzdz1D`y=?k5r?C55bE`+-iFg;Gx0{{C;iii79vhkBJ7#ZePMX~tnA?PO`P7#{%hYB*Q` zLEL%+$bi1Nu(Y@$(LX3U!{hBr03iZ&yW7;r)4-5IJHb)Lrn0P~PL4k`(c0F9OrZm7 z)~>@>zWQ}Mvicd+sZkt_Q?@|GSm2u<O% zi9N<>lm{5m`gRWpPJ%HM^H}c*_osWIrRQ_VP;J(hE!bt&44i%L**N`!Ct>EKUIpku z_X$8Zp70DAj>e^@hI25XVvb@HV3xXS%u7w;3TSQX#yh{;gzIlyg6~}RWBe|clO}Ov z0d(7AFiKp=*Y7oPb-Dot=y`g=BCLGsPE6XX6Vvh^MK1q?|5vvXyIgrdmC*j~p(Yf( z(&06kGfU~fBJ*CVR;nnLN|-gi2Om7)i0ruHzPjs~A(X5qqK01-1COWaO^NX^- zsd1v|+)+iE-*gP-<#p@*1gPhE*r`~qRh7R7F4R=W@OSrns~V3_NUd9IC&e@G){xR~ z;Ybr(j(bV4fI5R@jmc+v9Be7?xqK0&8nEuw*KzxOKgT_H--B1)dJE-z0ZsDe5`eG` zC!9cze^Phh4#)AnZfeZvdJ3SsJ@76{6=X+-Fl~GfjyU8%EIj#Sy#L_CFut<|%?5#V zD$-FS*a?Zq5_(n%-nY9*$~0@rBO)>hX4yChV|Q)DlAW=Vkpht@rRAlPrboN+DS_%l zF(bx#+M`29jgpWdqR~0eXF7t6xq#~&-MTd*9`3@H9}N(N=AysA!$_ybtK_K~qv)}PhS2%u*Ppi_#w z0`zb%QI;msR?-_t$bjT|NRzl>WHxWY_?{jdvv2{v{IQQ=Ujpdme&!zP;vO1jL?i>x(Yan$_1(O#fP8>Q_Rc&4(*F?Bjblp7QdKibHQx9EA@IVimf3!+!% zpws;8d}}+NTDg)V=u7VWIhwO)t3%Dkta-Y10>QmMC2=b!8O$Y<>UosDZ!HaKGy{F|8;G6GDCn84OdSRP0a zgAs8pRGOJZGn>ceZG(97=@q!`uDkK@Z=S^FkqT<0-&0tBTm?>oQ})1EHsOfE8mR)h?T`+P}AFg_RDx3;x<(J4eEhuQRrI6#AZ;WMx@0K ztb6WxT>6!-^VF;w0d$&{!yD5{IsO1gdF1TH{zLApsLvTk(3^ju5%j(GDx%Qx7z1=x zMy6jKv8KnZ1ece)H3tF$l;8+@gKN;KiN@ah?1g{%yT8GS?>{^O^x%k$Mxe+)HJD5= zrty0)6r6CfOtc_CMX+--l!m0Z6Ii1rao_s>75K&DG-hoAK(jGD_zSc!hNnCTAQME+ zXfeYiZKM#@`gx1q;PMjG3;u+ba)5L!4{t(3*k|n`g_vpna<)-JzHb|Lm@yq^p7jx& zdCG^d!<6x8Qi{8+*%*&)mSk2sSyHo=iBh%|&AZPeLMxCepFeNz ze-L-xdk=jr*;i$hA%K@DY6Pav zMh}4tN!e3AFvoxzRT043JCf(`(}S6t0#7ABM}Mo;>L^f?IArm}iWT_DPkx45?|wic z=mp>8$0Cb{E|kd4DM3tKDg#@$p{=KrYtaAkl1ngWI*nNyaJ+8hlaQ>Tq$SD%QsP_`I7aMux{O-e*}HE-6kT}x(bEd47TWfDv#Ga4r~M`tz$cr zaY( zBQZy%2wYhp*Pz!V($&^E0k6Hg3Af#G2d-bT3~M&L9=f;-4tG-ug3z`LcX*5dNx6*9 zkqYJ>us=R~(I;^9{CzlrPXD76Wa&W@U9}>7d{&0&wjdjH&z>v86(rKUjVQ&&C>Gn1 zYi(12emQPtfW8BoIdiC)6EFxk=NucY^-V&`;psW1O%9dCsFaZ_l`*Be3x^$XI2N69 z3XVB=J|=XvqFybbP9U9}ie^`j%FqyD7$s}c=Oqq0>A>%;W`Aa~D>JUs5lAmr#@MT; zYnEMdKXE;YIy$YdR~eJaOp-Mu{zaeZOcs z$E3VuJyWB;BYl|B*@aV2UyQTPI1Tgm-UH40FqiozV%`YjUbFqRDx?fOW+^jOdYQq96G7TN&<=<8p=rC$ipX2mPEH47 zQyGw&#BsVZHHjM-#NK=Efp7l9*Kxv8N1#y|LRC9l%1q^iI8vTAPl>Y;0v3yPD|We_ zw-8o&I>({hXkhs-9>n*q_!%Bu@eD9=yj*Y)l4A%j5B_}T!2q<=-|-4Z z$=)kDkx=RkNu^8&{_*UhUVGbMns5`0<^j4YKkf&RLAG8)ZrgUum@)-toN)%uTf6`} zPoJoB(ABba0@kP47!VAv@^Z*+C#;&UE-G4TeIx+A&Hz2%+JTL4{0`UOumnH)=~dWT zD56?yiDi|eWM4{x`#ndE9ZZ#ASdwv{DUVF_&CVvHr`FW@}D19P21%A(K!Yfm0 z)d>L^?S!P@Hyu?fp=Edkd+szF3s3nV7JTR=?7s6($TjO|R!baVptH`BXV8F>0`YkL zkvByF#%3?nP==2qAXYTg~QTr!f2twSUEiAakF(sGLY zPG|26r6x3`jHmJNQAt#kx7Pjf(~JPb5G3G625zCyf?6|&m)>{>KY#dFxZ|#Sux9;p z7@~R6963)$dK0uAk!f&-q}fbRkK2f8sI<*v*2Y+Nk;wv^puti2~Cxz$C z1LN;-l*7m#5_GPPYN2tA*&K5D0_u$n28T*0l}l)AE24`sZJH$0rO`~V|G3^c(u3Fx z^58^TC(EMb>XUX^6mBHLsszwmI#A7Ixt{K)KfMyS-n|_4=>*Vo((EzK_u;&({6}|&0cd$Jq3g>P2%v9A zt#JyTfA%+N_V}~=`@Z{*L#^?16bkczCKax}mp3uF^eBdm`BGaGfx!U1G{OMAyQ3XP zAAcgg_UTVy?(RFGTJGnP2_CWo0|8YfQhFs(&+hh!o-)UrjYe_esgzW+lky?Z$t zvu1H)usF6Y4GMxGF%mxpy3nIP6e-WYGc~K7TGIbagOD zm+a9d@;nK{IhXm_q{V}wDLPP{+`@KNeq=VVNm%LRAM~rS=vacV{SpVd#Q7%6%%D(gL$=tBb?aZmm%jKFj-c0jyMXQv(Ip{hsrI+& zkW}?_JRG+`()A|TIKYZ;V%5sOz#4Q9&^dyh7LIA}Thg1CxYHoGHF8JI87QJQJdEb{ z0qnEeuK4CZ{vA#@`bgBP!>HCue47T)mH%9-q!SdWyYa?>86Od-Yb~UHotmK#Q@3}H zN8iv8?zwL{etgw+c>K8+fC=Lwu_TO8Cxu0?$}1C~+!fD=t2r9%qr%PaagJu>INcEJ zo)p7`zp7viqBtcJ)OvGAWB{FNUHdV4+&C;=yci!p^EB+f!&IPNQSX=3;ie70ATxrT zN?Yrx@&>t(kom}ff{rRnHRv^DDb+34iuJF)h8u2Jf*Y1BMPFMhsx&9n*90jD8P!eH zA4KAuos=?lLh0?4!ra7Sta@4^=;L?k#>B#@Xlwm3GAM?w@j(rZfkymYB)r7wOH#p+ zz7zVGjyr+C&}Myms;BAioh{xba{dn>jC^ z5SS$x#nh%L#8Fy0$+~Rccp_Ah9>99^=<4I84$UeGUEd$C@8pTGp^Wg6Qq(B+R`8*< zD{ef@3R|LCuA=g)tR)oa#bfTBk2ZD=xG z1aF`4twlQRWX3Q6ePl}b-6`*A3CFWlUI;vypd$}(wBC)B`A7+cN*Oc9_u`o2j>5?& zo`?hY*@un0OtZ#LE;irPF%xOP`WVRhno^cK&?vgf=tMk(_h614TA(?s-kT3(tBziR z|Hq^B_G#2 z0+pz!-VE2N=OWg0G;)dmD^)bN_oJB4Vd2Rq;h(?sCG0wD3d$n{%p^5XK!m9qHO@x) zaZ??;&Bd+#uFN^gDl6O#IjftfRLIfMg;FDrN1s}OtFOBjzkKjl=%bFpGzNzp4%Q^j z(r_?vBrW@{{<`;Rm6&mFT&~*^3QzZi}8W_(hA-RBsiqJ`cxi zaap=%)>u$S<(U~9w4XZl+Mzkj$l$k6Jb@qo@MpN|frrtUITLltOrTU}uTy>Rnz15z z{(gh(O4%9#pewV{nU%}P4VN%|d@l|^{4kuh;1nEs!2X!f+sRpr^~wmlpjkwyVha&x zbB>2{InlqKwIWzb2(DnPhR-qyC>_|ytyECLN8fpTCgWPo=L^|7`W(|~-XWyNk#rcF zoL93rn7|6*M%l>TIjQQ|>hHC^4?AI+8P3MY=L*<9FoM<3K8HK+y$=sO`YXJ;X$vYX zMSx~*rw!@owboz7GYL-qw8~50x6)vu-_a=kSErVW3jQ_eh=D;&%w}=s8K>f+Pkao! z?X&~(sG&wp1a0z_vzKHkrlH~)TIPj8HFMY+NJ#|NMmZPMhV=A5Rz{Wq`(R(0CFe~W zawEwmrOb=;s02tz=@eSpkt=lJ*>%t3i(mXI9$B#xjoxl#D1uH$&;0<*UN(7R*XHGx zv(uDc62TG5kmU&aUot??X6D)W0Z~BC_(~J$Sl~l>F{BoAPZLT#XrNgt0e#!B@BfPw z{_lVKA2{)tqmgNrP%V!z7$k3Tkh9#VKn?ZKHOo0P)$5k@2&oCG20}w4-lC+MsMYJJ z)thMV8jsiBeh0VRaTjh_b{p1ge4Qf(%xpwde$<9pAe?e-uH=x{8G(2(SX>m=m?9k_ zObCBx*axNO+>|CLjDSrr@Hu;H%>#eCH~O+`c%^_oL(#YG{pe|J$D)M`aPj%)VBg(# z0O}>~uFi9sIZR`H@O_ZP(j}E4jZf2tqnp?2U9OzXmCd1EtAa*d4cD@G>e=-S(C_>C za`bm}pvGfZ^c+K2ELgqK0b+M!o`Xa>vj05gK@s!vnj=7`@9(n@xzle!AwL)OM!|J? z(w*74rX)5$N?&XSsnNiw`*xDsfj>?M8X87xwSql%n2E)wd{(*Do6a zP-P-y8fnrpFMQI0Nfr;}eK1Z)+)7;HeafHo|J6tkAumrNB}cqpXzfB1MZCP>HQc@Y z0o=3vemwiqi|D7cXle*Yvv4iDgL%n_*f#6$*Xw!P*I4d%vy0Li-XSDUFJUjNsmvOQ z3Tvc`#+H{BQ~VlindRIN#q zII2N^a`h@)edV>d?VjbROr3;gJ})Vkjt&#$HbIS2hxQCI1d6r~px9{OGJAF1zU(^soo#g)@E+#N?zykljid*=z&l>PFNXXW@l)PdKUg z=lRE(GuzP8_EB_p{4FxrL3;Bzg=fMlO>Du4NpDLJP<23-#tc=cSzsSpk;UOh9*KXt z^oy9k-|hm?wV4=aMCb$tDIGE=X%gV@GPnR*MWNljGvS2CVt|3@njC!uc8YC1c;L5B z;JPI@;nCkbhApKsGQHzCRh(tH8PdGJG3-J!n(5xlWfX=-u+t7Z;B%k)Bo-h0eoX8j zA2{hWsuhkA>~vE{aWJU-(e!VQEgM7Hc*+nwOWFpKJtecysY%?X!C^e`=r3{owb$d< zPdtt0^ckpgBRMN=3yNEvE18mq@vFyEy**sa7+qvu9davUx%$={2XeHnO5U{uX8kfV)G zSdk+!N*fw6E6@u1!OEdxGF~_V5d&6sBm0nL`84~ats2y!&)RhAmSq|*v&q@%tTrez zn=K%hD`NZLFjhRX7I)oyA0B+3yz}1e%*oCrK=||&>=rVN35~O9E-7Ll|<0(pMCb3f?V-YG#k5fl*H3A zUy1*4*oY&Rl)?I5YgGD_|45`XL;Ku5fYwTd)7?-0&A^FSV&5*(T?%7%XJa>(51bsB5FV8}VFAgw^3*3us~#y`V^XfsFK4 zoVV^=Tz}oQxOn|~OzmhxtXe|VGoE*nb5fHmwb#z?ZX?}h88#Zn&(Iy%1K{MOdPKJJ zw^jFKrK8pP2I=&H2sBT2a8hKg9VruMAss`lYD$sFiI+_0XwVe)A3lPoo_P*W(HZXC zg~cnE;?6s7$E6ougvLw~mGT%z(y5e+91rZ+wS?+;A|fZvKLg5ib#!57cZ^Sl5si(Z zl-Z&m$7^qG#n->~4g7!%^v({{IK`d7hP|)T74`?G15Af@I@j9h7}EIy-hb8Q_}jnu zb1Yvl8>Rdx*M`&4P-;Je9Q%i(Yc4TI0VFZZ`E&C;7s=qUnL>QQbd8!{Mb#^#uC56~ z`5GR4d?UW_m9Jp`?tLgw=>RqHA$iFWbgdU<-y#I_+ zQ)PZjq#E$RqZ{$B_kRnUw{1f)kwC18#;=-;B!~6%tBax#eiB2hR7QL(kExv<_`T2k z20nh{wdihXU}qXd&tnutw{n|!HLh`k(7VVitD8io@%FI{GyAT~RQMV$p)+!g#v<-L zehLq5cnsfv@FDEpe+cOA0U<2STTU5;_ANrhq0dBLD9VkVw_L)`jT&ba&=eP%%CUCk z3S4*f)wt@ii!pEZOq9z7R4WD3L{Ca@#Ahs7G{Warma*n_C0NoMNIAt_UR%_-3;>}{ zUDmQ(vfZ4Rw&*?tC6$}TWocPi6UbfJSu49N$d>FW-M%t#G7AByy`^$Ag2v1blo^*r zDw)OEfg!x~+8cOm<0d@&lb3L$_bke(G*Fi@#<1vcCGSH)fJuWX`k>`!>x_@Ey`3)> z!H8=8(u~gXJeSdW6~qUJ(UMHys>|Pp-~FB6!kXpFknk(0l#9&8+t)I(0?FcbUd1fTocbUOgYV#Op-<9W!)2_Lnp)R{ zaus;#l9S2zc9Q$Isy2Z{CNWy!sl3 z2#7SdyuE=g)XG3*G7%M}9u;-vby8#}07*7%XF`7DCa+e{*nymcF2@j$wILCo%G)aA zO`I#za)mt70Z&0ucCm5>q10QeF(`sQK90Il8SlURQvBiXeHQE1tOWcLO65E|O30Jz z92VNn7ACbISbNa|duB3pW|S%^Vxv51?0g*#pE`^0KKcZ{@$K*6@Uf$)w3#`TCjCr# z{U+IBhf|`)j}u;E4fbvfwuYNEpd@fzdJ0&WHK4CMq}wsl&ed2fz$YH|>$V7=qIHcBauw{spj{bf^% z#cWgKv0S*s)(YCh>(H?YxG;Qg4E0zn$rBn%ehho}9l`^TKFS9A;Uh;;q0))E25vxT zj2+uFChAaeN?U}V-Nn#R+R8qNc?D|;E z+mu#)`e9{naY97LD%~$36mxdcx!8^GHtREwr*nz3$V+5$+&5tF!GqYaX%jX)@g#O_ z+l5Nr!+95;hdb`P4Od@sFzd_Y+Qrx zdDcLW;q|S?K!13{lPGsgL5=Hb#XwiWDvI@tGA8XW{C3Q9s(jVE9uxetgL(wETN zKZr_W13;rLx!bWlSdqmcFLo5Iio6bhUm!PWf=IH0a`_chE1$)lJzGP}{OkIUTW(2U z@4n{%To^RZweRh)kuq(xArO5hx!y1#_ZOi?hqci>Ffxj@OBUhp{^qZ6(FN;)D$zln zK{_>dHBrfEK*Sp8R+gJp*tLYzOi&u+DBSV_)xC1dhGgd78X#xzrLWzOuiSS(_8dP7 zG&CTV%bBb?r~4wtp2#cBW3&v9x|rwDS>J%)`Se}5^J5>u^p19TrBPI?Wll>b8Eh)q zOqUU>@EzZpG8FMSMRbgXGAujnyUK_v(R;){$#er=*}4;7|MqvW;fW{EJ2cEAbxpFQ z0=F90x#QG(se!P)I0Sw)?otOY^g#Pf3oLnvj}N0E9>cOli}0ZvZ@`T=T#s2ZrX%Ki zsFjO|*-0HPFzU=HtC^j?vIaU8W{dMqBI1_!ouM6qtwsV0Ugiuew|s5rn{S86R^bWx z(Hx;h8cx)QECYMgK};vA&24J52_zVdXyC7Py09ZBflMaLI{r-G5MFrsRs3+n2K?mZ zS8!@z7+zfiVwrRhRCbG03=tArmcS$eqSS_c3l*V`p0Q@K$eHW?*3jS50ZnU3jSOSS ztm(M(uG?|rwbx-rPbd6pk+b61NyFxbcDh>bjhQS9c2G)8eCM(7bUa&Q-+JP+* zL9XDn(FdM;NNJRDBoaAP<2iiw+YjJh?!6Z~_U}iPzzBg7HxE+)jq3PeqfJH!Y5=0a zwN)~X+HLE9%RIcNR0LnE?E>%}q%u#UR*rM=N${tPT5K6o@w<>rU1y|}n$xX4XA)hB zfclV!kdMexvM37zz-14ad>)ssI}e}z>~Hf(r%bGZa%qf#gBa+1^dcl9#~qS$9OyTq zoMoJ=iwztK^hqKXcPX5dF1mBy5!`$KcX9uN523G^2dFNKojLYl%y{-^xBf|hp@ey~ zfOYOhI)|i>ir0^de+PDN-xv`uKN( z8$Wgp!Dt>?y;+Zoz}NtU?1Pc>rgmAUp$BCqR#Cbyn3I<6maPu9OF3A?NoK7!Cs)lA z4NFVv4Rq60SO81tWtFqjG>Ky#E)|jJ@5cozm*bEA^grR!i!MZC zDgm!NifW~TIK7h--?2bF3C)FDCkD$F;AW4&Ioz!5qS{=qT0=UOMtwsYPMqq+KYjU2 z_+MZAB8u@e{H7-Olp^Y!r1sWwqzcZ5JUebbgQ*LKl7S!bY&K4ns}d=Y{`l6S2l2O1+eU1rl)={D5SpT;lEo{7Kto4>{tmtBHH z%|p33YMgFlpvyg+ab_MGH4zvS*%W4dK@cbm^b#BAHPcm{dUcGJs`y|3_<4NoTi?df z!9m1YTj3`OL<@Kpg0c+`OzM)!#TElcENXH96$@xjByjf~AHyf_xDE5C&p@>}hKiR* zGMO~mkNb;QN1|okfJ^1A1JJJ}kuxjpp2+v;o#?uBCWCmg9-E%|3BK@^d-2puFCtIQ z|Hh_3rwg8PJf&zo1f=YHx&>&tCdx{_tCVO6N0U$3bR&vqiS z=|MVPL#;xkhGh%E1IL?7eRobfBfn*rO!~1ZNs{jFQMDq@3G3K1m|L1oTAV<)RoOcM zb2^Q09LJoo6i^~Z!FBV>NG220A^o*y6l`%2Ej7Do7R|F@xWs~)L;+6B&HtuK36w{iu3^Ed9nHCJ7ZhPoum`BBcK;1qVXX2xPFqAdoxi~R{Z3M6%< zAo312J>H%{pcf>C*G%0B*RBgTQ%)GW2y@obS4iZZIV;Z6@xcw^YKa_PeDf{bd;fjd z^w^W=^(ycw#ho0`+~8Fk-8OAR$eN!Om9t77kx?l;R;v}^*ZvAScmCJ+QkjIr|1a&q z+$1jb65{bSY%B!St!M0L=@roq(PgUWC5J>PiWvt+hLJ0luwv~ReEP1t@X@O;LoQWC zl{|+wwa1m5%Q^7x164FZfZOw9b`VT$y>Z0o6xm>J4vqE7He#$?<&j=r`PzLr(${C| z&$Ah2pv!A2^*5Ok4rJpb$3g&^$9nCCkN?VHV{W?RQwOj<6vuYp*s+subDn7|S^hgn zrv9GmkZhM?ky}pjI>7W!RG}{tZ*vTZY7NQJQ7oG?3%A{IJFdU_Dokr@gkQ-sARurk zUQCskY6YhSvw?FjluY5^gn$v}0jBLpaOYA=Z?DBOc>S&Ixc3|P;|Gsz#4x3(*3%4h z{XWV#a_CzL-q595AWC;gqP+we=rt6J`{7rA3%hquK7)7ps_!F_xQU-ndoEyXQqXNB zrS2OLIv^2fN}@(T*BG9aRu#w>5HFO_(b9mG%a-7Zi!a5sS6_uC3+Ey3S5YQ_L(N1e z`Il1{RSK(O44T&E$kQotmjG#fHf8}v&>H4(b!U##123%uVb-hb^s*JOF3HItFXwr8 zM-n}JTm#trip3W(NUxDYDw0CMW$Pqa5xa%w) z2S_Zyb3n}kZ^l}5Hy!Rn=paN8$7it8@91XCJw3}}-CyeaxF z1}$gl1WqDOp_fKOyly4Dgi&0xL#KG0tj-aO+P^RP z=-f2$QZ#J7;-s+UBhkmEHrK1wxPyB-+km|X4&opG=?nPM*X~25sRgm7M)(Y#B3;WR z;^^o(0Dhr@L@krucWA%kC6tN}pi=&895}FFU-oPJGa2Y-hn_`@BIwouBf?0rzdLt1 zE=PO%A|(%OJ-3OXSKtp0U|vfLKKloM#P!LP4qo%dXqFT^%tLm$W=41PO1Mg&67?%C z7t(Tu@=Un)+($B*0pfMocjPGk>7TxUhaYy0C24RrCSaU92zs3Bj`MG*|9vAmNvVMJ)P8rPqf zD!`+UK87!S^=o)($4+?7P4KDqUv4Y7QtzoFM(HskksDd0-HYhnYZ-48tGSa{Ro00S zPsb4>BV~9L$&!cJQ@e5P`>()NS6+$LD_5Yijrxm_gNDl6s%G*IXWck(Yd0(CM`0cl z$N?e4Kyqja5l9q6B5pI3*obDqM4dr~qN3Zzzu`!?XaP~&fnGP6S)|Y8q=MCoPN5tq zawJkFQIhJIlSckmd|=Q1gLv%mr?KJjjo7+(FGi{Pb1nyD$T+tRshvrz9PyK$vCwr$ zXoba*)0Ytg-ReOHRHFCSc*h-$&_o=uGL@Q+p)DE5)mL1B+dh6PE?U0^_1Pr6B8}TL zSya5!c5JQSG~ID15dA?g%bbJ3P3ELzF?OnzBTcg~ISHo<<#T&;Cx4>bWgRkFw2-|; z{k~%H6zUtAQS@SX;Nc(Qe|-M)EMv+PEUBwAUm=~Tb)2JN(a*B(D0r0me!H=h@mr~$ zMYa0Z*t7F<@1;HoVVqyugULXTC!Rqfc|kB2S`UHHtMci_{ve-y1vIX7m2ag?K_zamTH<;M`@4kc@ez zdpI9NAiT|)C}A7XQ6if(rMUDPAtT;GikMZAOxNMm*-gwQA{g7i) z(Z-^H?L!@bC`WimaL79C_jvv}M{oW!s^x#do;{O0MiwpoATsH{L^8QL=))j;8Iis^ zE!feCB8D(#4ik?HQ|r_Z>y4zxcooF*25{n~rzV30E@@O>-@pjA?%IW)y!aBHd-i#3-m(p&6%RFX_)twPIe!98 zW<`bFEulAl`G}FOJp~exmFuF*cc4|%sg+A^W9|FOwQnmJWNow_8Q(<)G=V!xA00=! zT;^tRD_1SYwU=IoRV!9t`mE{boH7NubOM!9f$NM({*g@Q1UYMrvuw0HF7XpHvQ082 zVRY#1EXWuv;P3LZr_e) zo_hf=zVIr}3=N~!KsC{n;p8JXp68kHw}0YRy#M0&p{*f{TD6FjafaH&8{3z_%6)cF zur4q)jQnJ2yk*~5jzK$k-O+F=ZVi<(rMNd>yyD}fH{QT~-?$HtJ@qWSu5MIGeQ@TP zY>)kcw?jE&gbr*Y&e+f(S`!JZKW`m=|F?e|mtVM^8>g0v<491QvhAd-b(@@#Szj1n zY1I@sNG#a4jyPHpIjnQ_Ef^dx;Mo^n#Jykr8lHIiIaE73OnSQ*W|}{RfhN;=?sxVD zqp3KQei(}tQON%T{OaehfB*5HSttG~zCZ?g|KPKT$1XH;z=K-Nkkf5~nwaFwoh*?I zo)}^&D(kDk9~?rP4_tHI^|rS zb^;GR_&q%M@DH)Kw-2>eGd6Bg1AQ{bYeYT-|BT=-r#r+s7BSGx!I-~sGyXGHslgx3 zBT+1(ySWh;UveR?xb$+YKW{B&&zOpAG7hg)h*aJ74qs~F&u+XW? zS&A>#(u+uJ-e%{(6hCrMMxd{Yn(PiO+PU0pz$=`}5?G@364VYgxs!&lHBR0kU6&xI zY>KK5V>o)|G!7ithi9L80grBY3j2h^qHZE1AoXF5!8rrY!p*l+wuM@ufVMz`7q8~vl7`9;FZVu zeK?OwM(`=zY3M+YQk5PfauPP1!4+@m{uOqwRJofL?;(R+^NZR-4bv^e1if17jXFa0@dZH9kfEvV-wdz(x7feu z!S_;COr{Qh@y{m%-H(4CiR3ki`P8K=kp3Ew>L*8)gPf{6X{*ef5l`s|HLksDuK^#q z;X3^0r|-hz`SXy7S5fl{Mk3gQF#>nutMctbU?GT(@K^cpEC98jjM6FM)Kp@mh_B!O z9X#~Chp_9=K@@X2#2T9zI7-dageOL+HDpt$e}ufTF%}v~#h=BiuaSWsbo=>fPH*AD zi~p^F>c1nKJrCt#xDY6$FqI&fAXK896-Z|m4wO=z&tu*4W%$%xci{S~E=Nm!2A-EU zvd!hrsApK?SZsBH@$yQcs%Pm6={_{=DUyjaDoEnx&0F#HZ$E%1o_-o<3k6gg8cf=Y zL^idtq|;G##K;*w5wOCVzBuJZ=t_t5wi5r5)#=zYf=3a}CZr=Nxo(v>}s@p;nfX0j}w2lx_9QyttDI8X@VQ{ZbRHC=8X`qd8TZgiFjCrX5<4lI;RWw?3o~j{ z3{E`A%6MXJ9(bIcQ^*0WsFJY%7G*83$Lo$Bx``r${y2nbc`~Hk-bo->1Kp~0u3skp zpfO$fJmTdNTGL5P@9M)(68^??(9r#aw`1`o^BR8SBJ`1lj#^o%O$z=4M zAd|HmUgd;~{N_rdS#)LY@2s(e zwuO?StWUf^4v84XkT3og2K`6SzlZX-fBpZkfj;mY5{V1Um@z3gvs^Qoqg(@&5O$KN zkTuZBa7dc6KI%b|8XL!gS+nt(Pu+uCZ~6e*8Zu1V+`ET>FJ=Fz291--7i(}i9Aq!j z9k~r98RI;WB-oe6!IP))-~Rsd*!0wo(K|AVT0=dM%^Erg$+}4ZnfsLxza`5`74h)` zH>3UV4cFs0?z$6emM>%nRN2cTfjB#%jO>xesJZV-rf_zba{ckup$K~LIcfbwEQMkP zc;eaTasPL|ix*#i14G0^&CMqBDw1_#SV_x2*yb}!J_%|kV~i7f#X#QBw%c2fz7C}5mF}y)Fb$eUCEo( zbK0m;&|3V5`i(8o{tltq&qfo5i z(9z>~>ctoE(hDImH6s83AOJ~3K~yhb=hhuKa%KRfObW54dc;y`J3cfhX$?7*SSL(^ z(Hsqkog&OK8Ftb7z{*{Bnf)v(`(;a_!5q;#|Q~9sy$Dcx!Zx@iQ*ms=eEI?_Uwc#ReJ}y z5gX{qXYuN*Kf8fGYt|gpH~ucNb$^6%A)%Sjys~cIBM4jGdouE{(%J3}3t&od8ydl^ z))svDgEz4EZu$H(nA+8j6d3}{lr>WW$sO-2L8ByjcS|~k?ZPR2uCGCeWDPhFc+B(XMfpn;8g6VD zH%+l9k_s|9&;OXa|<7ne^ue^b3&s5aNIY1+Fh-_@vZN(np$gA~5F>WJ(K0JbkY6Z94d?W6< z?Grd>*)r5+5-68Oc@(9gN#R00_D*O*93R5aCgN{ouuY9M8)BW%)CIX7)b-_&jZfkW zU;Hv&dhJcr>KcHSCNly{^uLo4YSHG-0nut)V8LhT61tY#5@QH4tj3lthyPs}{OfW7 z8R&fjKSna~J`({IBS0-M#OhHXZ_mzwbbGP%z#u$CbWo`vHa3n{zlK{rdNV$C_nlZW zXBN_AmRHCLOD44oJB9#?@u%7RDe;ho#7mGaZpuC=lZ2YjQA5of`bWp{?5nTh@BimN zVEgWUD5o;qAdZ{|?34(V>V%Ize9n=;3B6;{Lu_OO>&{t;J8rubH(Yf&dfFRNDvUCl zxL!AGL|J;a4L?nquHEO*9tX-ZB!*oyk@_8_aqLtdzVYn`@ZgU&;K1oKsMXgamdTn% zse0ideJSS^?VS;JE<21F72`Txm)EZDid;O7#dGK4k_*qr z``&i}mMvY1XhQay%s$qxhSH)H7$x`-}0S( z`4CAt@#vtV4mOINV38L6hnfTzix4#W`7V?D&nwV9GO z!^FI%SugLnEwzx}1ci-a$LQ=HIXpwBMqij3@=&mCLKH&bB5J-(a*B0d0_ju+wO9%V zj-JAgp4@~7zyCe#*tZ{L%3$W`IVA;JCz54IGgvAQY{AH{zbN5t~nj=XQaIOI%K}0-;L^=b{Phj7n zqj>m-kKlpteh-Jv4#1<-7-~wy9#xS&IxH9nr~o7>5brobzN>*bMbHUc#h=5QuV4N% zN6_isYu29+)Sg47O!Kzvy9y|?iX_tLC`{LSJt}oq-j&XWqO_F?mM>a>k9_!p_~12H zVQO0o66}1j9Tu&T9Bj3XQpxs+5^!~?K^&BUg>}(#dz5$*qva|`pdNha`*`7{*U*;tCFs(1D^tp_~MK3 zforb9;zbM5)zOY@lEyJrNG+Ptc-#=tu7QnxYd(<@vpnf+FAMx#O|B?bEp@E1Bi>b^ zF}cJDbiG4j;s-UztR(D6FPDO86}L&x7Zpz!SW=NG#n+_uv4NgQp%zbJtXRRxQ@wa= z+g5CP=4t%og_m*ibe|co($s`lHe-^ycrR3XxHL1O?l$}~+L>pSoB-SjIbIQ}3GGir z2u+YlDnul8ib}tQ$wSFn?lMn}C57jeGBw)No~;i*Uj*{wh?UD6m1=8m$Fil1aq+q} zSiX1>Iy!nVrE3bNv^SxF>ba>7oYLRPJ5Qj9jb{N`#vpZR&X!&^7!Kfok$r5U+jo-F zCuqh-g-;m|6cI_HT=Q{uXbin)`p|#27jJCdjAveW5!-j{#?a^pk61)~z4@C;8}Q2B zA0M%D2@N!P;^GT&&nNG~`qitEp(q2-K~I}hV2(1{D6=X_kTMVFoN>m00%#&)G^<;X zN%u7ddLvHu58|;+PvP6&{tjN-x)Yc-%|s8lIiJvx$RTZ9+h;jaGW+i53rLQQV&1e) zeB?tP#K&*`C>G3_#VL;DD5Y&B*d!uOB3{m)q-_A@&rhaqV6Ukg!|Bj)q^qWVcM-6XJ?Qqw;u_uHmHZbZ>%B5EL&I3T zav5&<*e$sJipw#5N(;afJi>U4C4z0lYUHUk!Y80b#ndk1WJ_I=8Ey>s=Js9q_V>Ss zr#5ZEnUOrIb&ZG_z-!Dax<8MvoXkiSnwIPUQ3Uqcn87yLK1|(y`cnTxqB|P`SOSu1m@8X3m+b~eA zAx0&1HXF?3@+lrwd`peoTsEc1X^{!ak!h_Z6`fTh2KDuPp^6wL?1$>5IW9rj3i&a_ z#tWFz)QHuqSKx}vF2i}N*I~}A8EC7|B1Kbh{HisMO$0XD@56{TvvB7)SG>fgmrB_- z+QmwAYb^8Sc9M^qqNJRb#wZl$Y;bdlr?_$|7v&G=gU{LeD0pZ1(YD@SM@N*gX+@;ReFv~eH-{}C4I%cPHqnWu%UMbmZ zA&L2o^n%m6!Djr0KeW19_9vuEA~uGtwO})b4r*)+v9U3B$lUUgn{o4vH)8&rS*W9) z1t8sGdTDWE$54<&WN-+C1--1L44;p{l$eRU;BV?R+NR8Gpi3=?b=LDJM4qZ+p2yeN z@;hVJQ}8VduNudJqbKm_#!YzWkso5;!M!Mu{BLSy{K=S10Hbp#Mg^B+AiMt-a~r}F zue&Wvj?qXc+Qd)c%{RaLUaO4>BKMcGfXk9taO#hd$$b{_*sQ=nw~x0?O+xj-BD_Ta zg`z~Fz?64SH8jBkuj`w{UczAEjIxv22bzLx$?g*eMa&@{pTW z40KCCj_K|9WS=BeyHfcvc5J=s=Q7Y&ox2WkyntFIWt<3#Xqm88x}5+4kt!~Vr;Nx* zIt;%jHzv!YJ)Oq-b*pjHhd+cX)}4>;)+QeBRV#a_+OZ!F5YjDaMz3WQJ`*cxjhLl> z7(pUYbHX-=B{Ale@y4#5c<2WYW7Cgcz_EcL)N*w|iXv-7E4m}Bq`rx_8oRb`|Ec(A!Ga}7W&Rv>b+^JRCtXH~eAxkf1uIk^s@32>dRWbZ4aNOkF@GEx-}ZJ9LY&Yp?&7oCsG-ghCEEnJND)>dR`u5Q(g zYN0dZ<&c4HgU5z6tWtGp-*#rQ+k2xbo$o*zx)2Xqp~{g}>$&GSz1HwHz1MVVm2nP8 z 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 mi_4&267(wN-9{i4T%>MxdRt**a diff --git a/frogpilot/system/the_pond/the_pond.py b/frogpilot/system/the_pond/the_pond.py index a0eff1cb6..dff6c1519 100644 --- a/frogpilot/system/the_pond/the_pond.py +++ b/frogpilot/system/the_pond/the_pond.py @@ -31,15 +31,11 @@ from openpilot.system.version import get_build_metadata from panda import Panda from openpilot.frogpilot.assets.theme_manager import HOLIDAY_THEME_PATH, THEME_COMPONENT_PARAMS -from openpilot.frogpilot.common.frogpilot_utilities import delete_file, get_lock_status, run_cmd, extract_tar -from openpilot.frogpilot.common.frogpilot_variables import ACTIVE_THEME_PATH, DISCORD_WEBHOOK_URL_THEME, ERROR_LOGS_PATH, EXCLUDED_KEYS, RESOURCES_REPO, SCREEN_RECORDINGS_PATH, THEME_SAVE_PATH,\ +from openpilot.frogpilot.common.frogpilot_utilities import delete_file, get_frogpilot_api_info, get_lock_status, is_url_pingable, run_cmd, extract_tar +from openpilot.frogpilot.common.frogpilot_variables import ACTIVE_THEME_PATH, ERROR_LOGS_PATH, EXCLUDED_KEYS, FROGPILOT_API, RESOURCES_REPO, SCREEN_RECORDINGS_PATH, THEME_SAVE_PATH,\ frogpilot_default_params, params, params_memory, update_frogpilot_toggles from openpilot.frogpilot.system.the_pond import utilities -GITLAB_API = "https://gitlab.com/api/v4" -GITLAB_SUBMISSIONS_PROJECT_ID = "71992109" -GITLAB_TOKEN = os.environ.get("GITLAB_TOKEN", "") - FOOTAGE_PATHS = [ Paths.log_root(HD=True, raw=True), Paths.log_root(konik=True, raw=True), @@ -1249,8 +1245,8 @@ def setup(app): @app.route("/api/themes/submit", methods=["POST"]) def submit_theme(): - if not GITLAB_TOKEN: - return jsonify({"error": "Missing GitLab token"}), 500 + if not is_url_pingable(FROGPILOT_API): + return jsonify({"error": "FrogPilot API is not reachable"}), 503 try: theme_name = request.form.get("themeName") @@ -1267,11 +1263,18 @@ def setup(app): combined_name = f"{safe_theme_name}~{discord_username}" timestamp = int(time.time()) - def gitlab_post(project_id, endpoint, payload): - url = f"{GITLAB_API}/projects/{project_id}/{endpoint}" - resp = requests.post(url, headers={"PRIVATE-TOKEN": GITLAB_TOKEN}, json=payload) + def gitlab_post(commit_payload): + api_token, build_metadata, device_type, dongle_id = get_frogpilot_api_info() + payload = { + "api_token": api_token, + "build_metadata": build_metadata, + "device": device_type, + "frogpilot_dongle_id": dongle_id, + **commit_payload, + } + resp = requests.post(f"{FROGPILOT_API}/gitlab/commit", json=payload, headers={"Content-Type": "application/json", "User-Agent": "frogpilot-api/1.0"}, timeout=60) if resp.status_code not in (200, 201): - raise RuntimeError(f"GitLab API error {resp.status_code}: {resp.text}") + raise RuntimeError(f"GitLab commit error {resp.status_code}: {resp.text}") return resp.json() def encode_file_base64(path): @@ -1279,24 +1282,27 @@ def setup(app): return base64.b64encode(f.read()).decode("utf-8") def send_discord_notification(username, theme_name, asset_types): - if not DISCORD_WEBHOOK_URL_THEME: + if not is_url_pingable(FROGPILOT_API): return - message = ( - f"🎨 **New Theme Submission**\n" - f"User: `{username}`\n" - f"Theme: `{theme_name}`\n" - f"Assets: {', '.join(asset_types)}\n" - f"[View Submissions Repo](https://gitlab.com/{RESOURCES_REPO}-Submissions)\n" - f"<@263565721336807424>" - ) - payload = {"content": message} + api_token, build_metadata, device_type, dongle_id = get_frogpilot_api_info() + + payload = { + "api_token": api_token, + "asset_types": asset_types, + "build_metadata": build_metadata, + "device": device_type, + "frogpilot_dongle_id": dongle_id, + "theme_name": theme_name, + "username": username, + } + try: - resp = requests.post(DISCORD_WEBHOOK_URL_THEME, json=payload) - if resp.status_code not in (200, 204): - print(f"Discord notification failed: {resp.status_code} {resp.text}") - except Exception as exception: - print(f"Error sending Discord message: {exception}") + resp = requests.post(f"{FROGPILOT_API}/discord/theme", json=payload, headers={"Content-Type": "application/json", "User-Agent": "frogpilot-api/1.0"}, timeout=30) + resp.raise_for_status() + print("Successfully sent theme submission notification!") + except requests.exceptions.RequestException as exception: + print(f"Error sending theme notification: {exception}") asset_types = [] submission_urls = {} @@ -1319,7 +1325,7 @@ def setup(app): "commit_message": f"Added Distance Icons: {combined_name}", "actions": actions } - gitlab_post(GITLAB_SUBMISSIONS_PROJECT_ID, "repository/commits", commit_payload) + gitlab_post(commit_payload) asset_types.append("Distance Icons") submission_urls["distance_icons"] = f"https://gitlab.com/{RESOURCES_REPO}-Submissions/-/tree/Distance-Icons" @@ -1343,7 +1349,7 @@ def setup(app): "commit_message": f"Added Theme: {combined_name}", "actions": theme_actions } - gitlab_post(GITLAB_SUBMISSIONS_PROJECT_ID, "repository/commits", commit_payload) + gitlab_post(commit_payload) asset_types.append("Theme") submission_urls["theme"] = f"https://gitlab.com/{RESOURCES_REPO}-Submissions/-/tree/Themes" @@ -1366,7 +1372,7 @@ def setup(app): "commit_message": f"Added Steering Wheel: {combined_name}", "actions": actions } - gitlab_post(GITLAB_SUBMISSIONS_PROJECT_ID, "repository/commits", commit_payload) + gitlab_post(commit_payload) asset_types.append("Steering Wheel") submission_urls["steering_wheel"] = f"https://gitlab.com/{RESOURCES_REPO}-Submissions/-/tree/Steering-Wheels" diff --git a/frogpilot/third_party/influxdb_client/__init__.py b/frogpilot/third_party/influxdb_client/__init__.py deleted file mode 100644 index a10095111..000000000 --- a/frogpilot/third_party/influxdb_client/__init__.py +++ /dev/null @@ -1,396 +0,0 @@ -# coding: utf-8 - -# flake8: noqa - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -# import apis into sdk package -from influxdb_client.service.authorizations_service import AuthorizationsService -from influxdb_client.service.backup_service import BackupService -from influxdb_client.service.bucket_schemas_service import BucketSchemasService -from influxdb_client.service.buckets_service import BucketsService -from influxdb_client.service.cells_service import CellsService -from influxdb_client.service.checks_service import ChecksService -from influxdb_client.service.config_service import ConfigService -from influxdb_client.service.dbr_ps_service import DBRPsService -from influxdb_client.service.dashboards_service import DashboardsService -from influxdb_client.service.delete_service import DeleteService -from influxdb_client.service.health_service import HealthService -from influxdb_client.service.invokable_scripts_service import InvokableScriptsService -from influxdb_client.service.labels_service import LabelsService -from influxdb_client.service.legacy_authorizations_service import LegacyAuthorizationsService -from influxdb_client.service.metrics_service import MetricsService -from influxdb_client.service.notification_endpoints_service import NotificationEndpointsService -from influxdb_client.service.notification_rules_service import NotificationRulesService -from influxdb_client.service.organizations_service import OrganizationsService -from influxdb_client.service.ping_service import PingService -from influxdb_client.service.query_service import QueryService -from influxdb_client.service.ready_service import ReadyService -from influxdb_client.service.remote_connections_service import RemoteConnectionsService -from influxdb_client.service.replications_service import ReplicationsService -from influxdb_client.service.resources_service import ResourcesService -from influxdb_client.service.restore_service import RestoreService -from influxdb_client.service.routes_service import RoutesService -from influxdb_client.service.rules_service import RulesService -from influxdb_client.service.scraper_targets_service import ScraperTargetsService -from influxdb_client.service.secrets_service import SecretsService -from influxdb_client.service.setup_service import SetupService -from influxdb_client.service.signin_service import SigninService -from influxdb_client.service.signout_service import SignoutService -from influxdb_client.service.sources_service import SourcesService -from influxdb_client.service.tasks_service import TasksService -from influxdb_client.service.telegraf_plugins_service import TelegrafPluginsService -from influxdb_client.service.telegrafs_service import TelegrafsService -from influxdb_client.service.templates_service import TemplatesService -from influxdb_client.service.users_service import UsersService -from influxdb_client.service.variables_service import VariablesService -from influxdb_client.service.views_service import ViewsService -from influxdb_client.service.write_service import WriteService - -from influxdb_client.configuration import Configuration -# import models into sdk package -from influxdb_client.domain.ast_response import ASTResponse -from influxdb_client.domain.add_resource_member_request_body import AddResourceMemberRequestBody -from influxdb_client.domain.analyze_query_response import AnalyzeQueryResponse -from influxdb_client.domain.analyze_query_response_errors import AnalyzeQueryResponseErrors -from influxdb_client.domain.array_expression import ArrayExpression -from influxdb_client.domain.authorization import Authorization -from influxdb_client.domain.authorization_post_request import AuthorizationPostRequest -from influxdb_client.domain.authorization_update_request import AuthorizationUpdateRequest -from influxdb_client.domain.authorizations import Authorizations -from influxdb_client.domain.axes import Axes -from influxdb_client.domain.axis import Axis -from influxdb_client.domain.axis_scale import AxisScale -from influxdb_client.domain.bad_statement import BadStatement -from influxdb_client.domain.band_view_properties import BandViewProperties -from influxdb_client.domain.binary_expression import BinaryExpression -from influxdb_client.domain.block import Block -from influxdb_client.domain.boolean_literal import BooleanLiteral -from influxdb_client.domain.bucket import Bucket -from influxdb_client.domain.bucket_links import BucketLinks -from influxdb_client.domain.bucket_metadata_manifest import BucketMetadataManifest -from influxdb_client.domain.bucket_retention_rules import BucketRetentionRules -from influxdb_client.domain.bucket_shard_mapping import BucketShardMapping -from influxdb_client.domain.buckets import Buckets -from influxdb_client.domain.builder_aggregate_function_type import BuilderAggregateFunctionType -from influxdb_client.domain.builder_config import BuilderConfig -from influxdb_client.domain.builder_config_aggregate_window import BuilderConfigAggregateWindow -from influxdb_client.domain.builder_functions_type import BuilderFunctionsType -from influxdb_client.domain.builder_tags_type import BuilderTagsType -from influxdb_client.domain.builtin_statement import BuiltinStatement -from influxdb_client.domain.call_expression import CallExpression -from influxdb_client.domain.cell import Cell -from influxdb_client.domain.cell_links import CellLinks -from influxdb_client.domain.cell_update import CellUpdate -from influxdb_client.domain.cell_with_view_properties import CellWithViewProperties -from influxdb_client.domain.check import Check -from influxdb_client.domain.check_base import CheckBase -from influxdb_client.domain.check_base_links import CheckBaseLinks -from influxdb_client.domain.check_discriminator import CheckDiscriminator -from influxdb_client.domain.check_patch import CheckPatch -from influxdb_client.domain.check_status_level import CheckStatusLevel -from influxdb_client.domain.check_view_properties import CheckViewProperties -from influxdb_client.domain.checks import Checks -from influxdb_client.domain.column_data_type import ColumnDataType -from influxdb_client.domain.column_semantic_type import ColumnSemanticType -from influxdb_client.domain.conditional_expression import ConditionalExpression -from influxdb_client.domain.config import Config -from influxdb_client.domain.constant_variable_properties import ConstantVariableProperties -from influxdb_client.domain.create_cell import CreateCell -from influxdb_client.domain.create_dashboard_request import CreateDashboardRequest -from influxdb_client.domain.custom_check import CustomCheck -from influxdb_client.domain.dbrp import DBRP -from influxdb_client.domain.dbrp_create import DBRPCreate -from influxdb_client.domain.dbrp_get import DBRPGet -from influxdb_client.domain.dbrp_update import DBRPUpdate -from influxdb_client.domain.dbr_ps import DBRPs -from influxdb_client.domain.dashboard import Dashboard -from influxdb_client.domain.dashboard_color import DashboardColor -from influxdb_client.domain.dashboard_query import DashboardQuery -from influxdb_client.domain.dashboard_with_view_properties import DashboardWithViewProperties -from influxdb_client.domain.dashboards import Dashboards -from influxdb_client.domain.date_time_literal import DateTimeLiteral -from influxdb_client.domain.deadman_check import DeadmanCheck -from influxdb_client.domain.decimal_places import DecimalPlaces -from influxdb_client.domain.delete_predicate_request import DeletePredicateRequest -from influxdb_client.domain.dialect import Dialect -from influxdb_client.domain.dict_expression import DictExpression -from influxdb_client.domain.dict_item import DictItem -from influxdb_client.domain.duration import Duration -from influxdb_client.domain.duration_literal import DurationLiteral -from influxdb_client.domain.error import Error -from influxdb_client.domain.expression import Expression -from influxdb_client.domain.expression_statement import ExpressionStatement -from influxdb_client.domain.field import Field -from influxdb_client.domain.file import File -from influxdb_client.domain.float_literal import FloatLiteral -from influxdb_client.domain.flux_response import FluxResponse -from influxdb_client.domain.flux_suggestion import FluxSuggestion -from influxdb_client.domain.flux_suggestions import FluxSuggestions -from influxdb_client.domain.function_expression import FunctionExpression -from influxdb_client.domain.gauge_view_properties import GaugeViewProperties -from influxdb_client.domain.greater_threshold import GreaterThreshold -from influxdb_client.domain.http_notification_endpoint import HTTPNotificationEndpoint -from influxdb_client.domain.http_notification_rule import HTTPNotificationRule -from influxdb_client.domain.http_notification_rule_base import HTTPNotificationRuleBase -from influxdb_client.domain.health_check import HealthCheck -from influxdb_client.domain.heatmap_view_properties import HeatmapViewProperties -from influxdb_client.domain.histogram_view_properties import HistogramViewProperties -from influxdb_client.domain.identifier import Identifier -from influxdb_client.domain.import_declaration import ImportDeclaration -from influxdb_client.domain.index_expression import IndexExpression -from influxdb_client.domain.integer_literal import IntegerLiteral -from influxdb_client.domain.is_onboarding import IsOnboarding -from influxdb_client.domain.label import Label -from influxdb_client.domain.label_create_request import LabelCreateRequest -from influxdb_client.domain.label_mapping import LabelMapping -from influxdb_client.domain.label_response import LabelResponse -from influxdb_client.domain.label_update import LabelUpdate -from influxdb_client.domain.labels_response import LabelsResponse -from influxdb_client.domain.language_request import LanguageRequest -from influxdb_client.domain.legacy_authorization_post_request import LegacyAuthorizationPostRequest -from influxdb_client.domain.lesser_threshold import LesserThreshold -from influxdb_client.domain.line_plus_single_stat_properties import LinePlusSingleStatProperties -from influxdb_client.domain.line_protocol_error import LineProtocolError -from influxdb_client.domain.line_protocol_length_error import LineProtocolLengthError -from influxdb_client.domain.links import Links -from influxdb_client.domain.list_stacks_response import ListStacksResponse -from influxdb_client.domain.log_event import LogEvent -from influxdb_client.domain.logical_expression import LogicalExpression -from influxdb_client.domain.logs import Logs -from influxdb_client.domain.map_variable_properties import MapVariableProperties -from influxdb_client.domain.markdown_view_properties import MarkdownViewProperties -from influxdb_client.domain.measurement_schema import MeasurementSchema -from influxdb_client.domain.measurement_schema_column import MeasurementSchemaColumn -from influxdb_client.domain.measurement_schema_create_request import MeasurementSchemaCreateRequest -from influxdb_client.domain.measurement_schema_list import MeasurementSchemaList -from influxdb_client.domain.measurement_schema_update_request import MeasurementSchemaUpdateRequest -from influxdb_client.domain.member_assignment import MemberAssignment -from influxdb_client.domain.member_expression import MemberExpression -from influxdb_client.domain.metadata_backup import MetadataBackup -from influxdb_client.domain.model_property import ModelProperty -from influxdb_client.domain.mosaic_view_properties import MosaicViewProperties -from influxdb_client.domain.node import Node -from influxdb_client.domain.notification_endpoint import NotificationEndpoint -from influxdb_client.domain.notification_endpoint_base import NotificationEndpointBase -from influxdb_client.domain.notification_endpoint_base_links import NotificationEndpointBaseLinks -from influxdb_client.domain.notification_endpoint_discriminator import NotificationEndpointDiscriminator -from influxdb_client.domain.notification_endpoint_type import NotificationEndpointType -from influxdb_client.domain.notification_endpoint_update import NotificationEndpointUpdate -from influxdb_client.domain.notification_endpoints import NotificationEndpoints -from influxdb_client.domain.notification_rule import NotificationRule -from influxdb_client.domain.notification_rule_base import NotificationRuleBase -from influxdb_client.domain.notification_rule_base_links import NotificationRuleBaseLinks -from influxdb_client.domain.notification_rule_discriminator import NotificationRuleDiscriminator -from influxdb_client.domain.notification_rule_update import NotificationRuleUpdate -from influxdb_client.domain.notification_rules import NotificationRules -from influxdb_client.domain.object_expression import ObjectExpression -from influxdb_client.domain.onboarding_request import OnboardingRequest -from influxdb_client.domain.onboarding_response import OnboardingResponse -from influxdb_client.domain.option_statement import OptionStatement -from influxdb_client.domain.organization import Organization -from influxdb_client.domain.organization_links import OrganizationLinks -from influxdb_client.domain.organizations import Organizations -from influxdb_client.domain.package import Package -from influxdb_client.domain.package_clause import PackageClause -from influxdb_client.domain.pager_duty_notification_endpoint import PagerDutyNotificationEndpoint -from influxdb_client.domain.pager_duty_notification_rule import PagerDutyNotificationRule -from influxdb_client.domain.pager_duty_notification_rule_base import PagerDutyNotificationRuleBase -from influxdb_client.domain.paren_expression import ParenExpression -from influxdb_client.domain.password_reset_body import PasswordResetBody -from influxdb_client.domain.patch_bucket_request import PatchBucketRequest -from influxdb_client.domain.patch_dashboard_request import PatchDashboardRequest -from influxdb_client.domain.patch_organization_request import PatchOrganizationRequest -from influxdb_client.domain.patch_retention_rule import PatchRetentionRule -from influxdb_client.domain.patch_stack_request import PatchStackRequest -from influxdb_client.domain.patch_stack_request_additional_resources import PatchStackRequestAdditionalResources -from influxdb_client.domain.permission import Permission -from influxdb_client.domain.permission_resource import PermissionResource -from influxdb_client.domain.pipe_expression import PipeExpression -from influxdb_client.domain.pipe_literal import PipeLiteral -from influxdb_client.domain.post_bucket_request import PostBucketRequest -from influxdb_client.domain.post_check import PostCheck -from influxdb_client.domain.post_notification_endpoint import PostNotificationEndpoint -from influxdb_client.domain.post_notification_rule import PostNotificationRule -from influxdb_client.domain.post_organization_request import PostOrganizationRequest -from influxdb_client.domain.post_restore_kv_response import PostRestoreKVResponse -from influxdb_client.domain.post_stack_request import PostStackRequest -from influxdb_client.domain.property_key import PropertyKey -from influxdb_client.domain.query import Query -from influxdb_client.domain.query_edit_mode import QueryEditMode -from influxdb_client.domain.query_variable_properties import QueryVariableProperties -from influxdb_client.domain.query_variable_properties_values import QueryVariablePropertiesValues -from influxdb_client.domain.range_threshold import RangeThreshold -from influxdb_client.domain.ready import Ready -from influxdb_client.domain.regexp_literal import RegexpLiteral -from influxdb_client.domain.remote_connection import RemoteConnection -from influxdb_client.domain.remote_connection_creation_request import RemoteConnectionCreationRequest -from influxdb_client.domain.remote_connection_update_request import RemoteConnectionUpdateRequest -from influxdb_client.domain.remote_connections import RemoteConnections -from influxdb_client.domain.renamable_field import RenamableField -from influxdb_client.domain.replication import Replication -from influxdb_client.domain.replication_creation_request import ReplicationCreationRequest -from influxdb_client.domain.replication_update_request import ReplicationUpdateRequest -from influxdb_client.domain.replications import Replications -from influxdb_client.domain.resource_member import ResourceMember -from influxdb_client.domain.resource_members import ResourceMembers -from influxdb_client.domain.resource_members_links import ResourceMembersLinks -from influxdb_client.domain.resource_owner import ResourceOwner -from influxdb_client.domain.resource_owners import ResourceOwners -from influxdb_client.domain.restored_bucket_mappings import RestoredBucketMappings -from influxdb_client.domain.retention_policy_manifest import RetentionPolicyManifest -from influxdb_client.domain.return_statement import ReturnStatement -from influxdb_client.domain.routes import Routes -from influxdb_client.domain.routes_external import RoutesExternal -from influxdb_client.domain.routes_query import RoutesQuery -from influxdb_client.domain.routes_system import RoutesSystem -from influxdb_client.domain.rule_status_level import RuleStatusLevel -from influxdb_client.domain.run import Run -from influxdb_client.domain.run_links import RunLinks -from influxdb_client.domain.run_manually import RunManually -from influxdb_client.domain.runs import Runs -from influxdb_client.domain.smtp_notification_rule import SMTPNotificationRule -from influxdb_client.domain.smtp_notification_rule_base import SMTPNotificationRuleBase -from influxdb_client.domain.scatter_view_properties import ScatterViewProperties -from influxdb_client.domain.schema_type import SchemaType -from influxdb_client.domain.scraper_target_request import ScraperTargetRequest -from influxdb_client.domain.scraper_target_response import ScraperTargetResponse -from influxdb_client.domain.scraper_target_responses import ScraperTargetResponses -from influxdb_client.domain.script import Script -from influxdb_client.domain.script_create_request import ScriptCreateRequest -from influxdb_client.domain.script_invocation_params import ScriptInvocationParams -from influxdb_client.domain.script_language import ScriptLanguage -from influxdb_client.domain.script_update_request import ScriptUpdateRequest -from influxdb_client.domain.scripts import Scripts -from influxdb_client.domain.secret_keys import SecretKeys -from influxdb_client.domain.secret_keys_response import SecretKeysResponse -from influxdb_client.domain.shard_group_manifest import ShardGroupManifest -from influxdb_client.domain.shard_manifest import ShardManifest -from influxdb_client.domain.shard_owner import ShardOwner -from influxdb_client.domain.simple_table_view_properties import SimpleTableViewProperties -from influxdb_client.domain.single_stat_view_properties import SingleStatViewProperties -from influxdb_client.domain.slack_notification_endpoint import SlackNotificationEndpoint -from influxdb_client.domain.slack_notification_rule import SlackNotificationRule -from influxdb_client.domain.slack_notification_rule_base import SlackNotificationRuleBase -from influxdb_client.domain.source import Source -from influxdb_client.domain.source_links import SourceLinks -from influxdb_client.domain.sources import Sources -from influxdb_client.domain.stack import Stack -from influxdb_client.domain.stack_associations import StackAssociations -from influxdb_client.domain.stack_events import StackEvents -from influxdb_client.domain.stack_links import StackLinks -from influxdb_client.domain.stack_resources import StackResources -from influxdb_client.domain.statement import Statement -from influxdb_client.domain.static_legend import StaticLegend -from influxdb_client.domain.status_rule import StatusRule -from influxdb_client.domain.string_literal import StringLiteral -from influxdb_client.domain.subscription_manifest import SubscriptionManifest -from influxdb_client.domain.table_view_properties import TableViewProperties -from influxdb_client.domain.table_view_properties_table_options import TableViewPropertiesTableOptions -from influxdb_client.domain.tag_rule import TagRule -from influxdb_client.domain.task import Task -from influxdb_client.domain.task_create_request import TaskCreateRequest -from influxdb_client.domain.task_links import TaskLinks -from influxdb_client.domain.task_status_type import TaskStatusType -from influxdb_client.domain.task_update_request import TaskUpdateRequest -from influxdb_client.domain.tasks import Tasks -from influxdb_client.domain.telegraf import Telegraf -from influxdb_client.domain.telegraf_plugin import TelegrafPlugin -from influxdb_client.domain.telegraf_plugin_request import TelegrafPluginRequest -from influxdb_client.domain.telegraf_plugin_request_plugins import TelegrafPluginRequestPlugins -from influxdb_client.domain.telegraf_plugins import TelegrafPlugins -from influxdb_client.domain.telegraf_request import TelegrafRequest -from influxdb_client.domain.telegraf_request_metadata import TelegrafRequestMetadata -from influxdb_client.domain.telegrafs import Telegrafs -from influxdb_client.domain.telegram_notification_endpoint import TelegramNotificationEndpoint -from influxdb_client.domain.telegram_notification_rule import TelegramNotificationRule -from influxdb_client.domain.telegram_notification_rule_base import TelegramNotificationRuleBase -from influxdb_client.domain.template_apply import TemplateApply -from influxdb_client.domain.template_apply_remotes import TemplateApplyRemotes -from influxdb_client.domain.template_apply_template import TemplateApplyTemplate -from influxdb_client.domain.template_chart import TemplateChart -from influxdb_client.domain.template_export_by_id import TemplateExportByID -from influxdb_client.domain.template_export_by_id_org_ids import TemplateExportByIDOrgIDs -from influxdb_client.domain.template_export_by_id_resource_filters import TemplateExportByIDResourceFilters -from influxdb_client.domain.template_export_by_id_resources import TemplateExportByIDResources -from influxdb_client.domain.template_kind import TemplateKind -from influxdb_client.domain.template_summary import TemplateSummary -from influxdb_client.domain.template_summary_diff import TemplateSummaryDiff -from influxdb_client.domain.template_summary_diff_buckets import TemplateSummaryDiffBuckets -from influxdb_client.domain.template_summary_diff_buckets_new_old import TemplateSummaryDiffBucketsNewOld -from influxdb_client.domain.template_summary_diff_checks import TemplateSummaryDiffChecks -from influxdb_client.domain.template_summary_diff_dashboards import TemplateSummaryDiffDashboards -from influxdb_client.domain.template_summary_diff_dashboards_new_old import TemplateSummaryDiffDashboardsNewOld -from influxdb_client.domain.template_summary_diff_label_mappings import TemplateSummaryDiffLabelMappings -from influxdb_client.domain.template_summary_diff_labels import TemplateSummaryDiffLabels -from influxdb_client.domain.template_summary_diff_labels_new_old import TemplateSummaryDiffLabelsNewOld -from influxdb_client.domain.template_summary_diff_notification_endpoints import TemplateSummaryDiffNotificationEndpoints -from influxdb_client.domain.template_summary_diff_notification_rules import TemplateSummaryDiffNotificationRules -from influxdb_client.domain.template_summary_diff_notification_rules_new_old import TemplateSummaryDiffNotificationRulesNewOld -from influxdb_client.domain.template_summary_diff_tasks import TemplateSummaryDiffTasks -from influxdb_client.domain.template_summary_diff_tasks_new_old import TemplateSummaryDiffTasksNewOld -from influxdb_client.domain.template_summary_diff_telegraf_configs import TemplateSummaryDiffTelegrafConfigs -from influxdb_client.domain.template_summary_diff_variables import TemplateSummaryDiffVariables -from influxdb_client.domain.template_summary_diff_variables_new_old import TemplateSummaryDiffVariablesNewOld -from influxdb_client.domain.template_summary_errors import TemplateSummaryErrors -from influxdb_client.domain.template_summary_label import TemplateSummaryLabel -from influxdb_client.domain.template_summary_label_properties import TemplateSummaryLabelProperties -from influxdb_client.domain.template_summary_summary import TemplateSummarySummary -from influxdb_client.domain.template_summary_summary_buckets import TemplateSummarySummaryBuckets -from influxdb_client.domain.template_summary_summary_dashboards import TemplateSummarySummaryDashboards -from influxdb_client.domain.template_summary_summary_label_mappings import TemplateSummarySummaryLabelMappings -from influxdb_client.domain.template_summary_summary_notification_rules import TemplateSummarySummaryNotificationRules -from influxdb_client.domain.template_summary_summary_status_rules import TemplateSummarySummaryStatusRules -from influxdb_client.domain.template_summary_summary_tag_rules import TemplateSummarySummaryTagRules -from influxdb_client.domain.template_summary_summary_tasks import TemplateSummarySummaryTasks -from influxdb_client.domain.template_summary_summary_variables import TemplateSummarySummaryVariables -from influxdb_client.domain.test_statement import TestStatement -from influxdb_client.domain.threshold import Threshold -from influxdb_client.domain.threshold_base import ThresholdBase -from influxdb_client.domain.threshold_check import ThresholdCheck -from influxdb_client.domain.unary_expression import UnaryExpression -from influxdb_client.domain.unsigned_integer_literal import UnsignedIntegerLiteral -from influxdb_client.domain.user import User -from influxdb_client.domain.user_response import UserResponse -from influxdb_client.domain.user_response_links import UserResponseLinks -from influxdb_client.domain.users import Users -from influxdb_client.domain.variable import Variable -from influxdb_client.domain.variable_assignment import VariableAssignment -from influxdb_client.domain.variable_links import VariableLinks -from influxdb_client.domain.variable_properties import VariableProperties -from influxdb_client.domain.variables import Variables -from influxdb_client.domain.view import View -from influxdb_client.domain.view_links import ViewLinks -from influxdb_client.domain.view_properties import ViewProperties -from influxdb_client.domain.views import Views -from influxdb_client.domain.write_precision import WritePrecision -from influxdb_client.domain.xy_geom import XYGeom -from influxdb_client.domain.xy_view_properties import XYViewProperties - -from influxdb_client.client.authorizations_api import AuthorizationsApi -from influxdb_client.client.bucket_api import BucketsApi -from influxdb_client.client.delete_api import DeleteApi -from influxdb_client.client.invokable_scripts_api import InvokableScriptsApi -from influxdb_client.client.labels_api import LabelsApi -from influxdb_client.client.organizations_api import OrganizationsApi -from influxdb_client.client.query_api import QueryApi -from influxdb_client.client.tasks_api import TasksApi -from influxdb_client.client.users_api import UsersApi -from influxdb_client.client.write_api import WriteApi, WriteOptions -from influxdb_client.client.influxdb_client import InfluxDBClient -from influxdb_client.client.logging_handler import InfluxLoggingHandler -from influxdb_client.client.write.point import Point - -from influxdb_client.version import VERSION - -__version__ = VERSION diff --git a/frogpilot/third_party/influxdb_client/_async/__init__.py b/frogpilot/third_party/influxdb_client/_async/__init__.py deleted file mode 100644 index 743539c50..000000000 --- a/frogpilot/third_party/influxdb_client/_async/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Asynchronous REST APIs.""" diff --git a/frogpilot/third_party/influxdb_client/_async/api_client.py b/frogpilot/third_party/influxdb_client/_async/api_client.py deleted file mode 100644 index 3a396a109..000000000 --- a/frogpilot/third_party/influxdb_client/_async/api_client.py +++ /dev/null @@ -1,663 +0,0 @@ -# coding: utf-8 -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - -from __future__ import absolute_import - -import datetime -import json -import mimetypes -import os -import re -import tempfile -from multiprocessing.pool import ThreadPool -from urllib.parse import quote - -import influxdb_client.domain -from influxdb_client import SigninService -from influxdb_client import SignoutService -from influxdb_client._async import rest -from influxdb_client.configuration import Configuration -from influxdb_client.rest import _requires_create_user_session, _requires_expire_user_session - - -class ApiClientAsync(object): - """Generic API client for OpenAPI client library Build. - - OpenAPI generic API client. This client handles the client- - server communication, and is invariant across implementations. Specifics of - the methods and models for each application are generated from the OpenAPI - templates. - - NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - Do not edit the class manually. - - :param configuration: .Configuration object for this client - :param header_name: a header to pass when making calls to the API. - :param header_value: a header value to pass when making calls to - the API. - :param cookie: a cookie to include in the header when making calls - to the API - :param pool_threads: The number of threads to use for async requests - to the API. More threads means more concurrent API requests. - """ - - PRIMITIVE_TYPES = (float, bool, bytes, str, int) - NATIVE_TYPES_MAPPING = { - 'int': int, - 'long': int, - 'float': float, - 'str': str, - 'bool': bool, - 'date': datetime.date, - 'datetime': datetime.datetime, - 'object': object, - } - _pool = None - - def __init__(self, configuration=None, header_name=None, header_value=None, - cookie=None, pool_threads=None, **kwargs): - """Initialize generic API client.""" - if configuration is None: - configuration = Configuration() - self.configuration = configuration - self.pool_threads = pool_threads - - self.rest_client = rest.RESTClientObjectAsync(configuration, **kwargs) - self.default_headers = {} - if header_name is not None: - self.default_headers[header_name] = header_value - self.cookie = cookie - # Set default User-Agent. - from influxdb_client import VERSION - self.user_agent = f'influxdb-client-python/{VERSION}' - - async def close(self): - """Dispose api client.""" - await self._signout() - await self.rest_client.close() - """Dispose pools.""" - if self._pool: - self._pool.close() - self._pool.join() - self._pool = None - - @property - def pool(self): - """Create thread pool on first request avoids instantiating unused threadpool for blocking clients.""" - if self._pool is None: - self._pool = ThreadPool(self.pool_threads) - return self._pool - - @property - def user_agent(self): - """User agent for this API client.""" - return self.default_headers['User-Agent'] - - @user_agent.setter - def user_agent(self, value): - """Set User agent for this API client.""" - self.default_headers['User-Agent'] = value - - def set_default_header(self, header_name, header_value): - """Set HTTP header for this API client.""" - self.default_headers[header_name] = header_value - - async def __call_api( - self, resource_path, method, path_params=None, - query_params=None, header_params=None, body=None, post_params=None, - files=None, response_type=None, auth_settings=None, - _return_http_data_only=None, collection_formats=None, - _preload_content=True, _request_timeout=None, urlopen_kw=None): - - config = self.configuration - await self._signin(resource_path=resource_path) - - # header parameters - header_params = header_params or {} - config.update_request_header_params(resource_path, header_params) - header_params.update(self.default_headers) - if self.cookie: - header_params['Cookie'] = self.cookie - if header_params: - header_params = self.sanitize_for_serialization(header_params) - header_params = dict(self.parameters_to_tuples(header_params, - collection_formats)) - - # path parameters - if path_params: - path_params = self.sanitize_for_serialization(path_params) - path_params = self.parameters_to_tuples(path_params, - collection_formats) - for k, v in path_params: - # specified safe chars, encode everything - resource_path = resource_path.replace( - '{%s}' % k, - quote(str(v), safe=config.safe_chars_for_path_param) - ) - - # query parameters - if query_params: - query_params = self.sanitize_for_serialization(query_params) - query_params = self.parameters_to_tuples(query_params, - collection_formats) - - # post parameters - if post_params or files: - post_params = self.prepare_post_parameters(post_params, files) - post_params = self.sanitize_for_serialization(post_params) - post_params = self.parameters_to_tuples(post_params, - collection_formats) - - # auth setting - self.update_params_for_auth(header_params, query_params, auth_settings) - - # body - if body: - body = self.sanitize_for_serialization(body) - body = config.update_request_body(resource_path, body) - - # request url - url = self.configuration.host + resource_path - - urlopen_kw = urlopen_kw or {} - - # perform request and return response - response_data = await self.request( - method, url, query_params=query_params, headers=header_params, - post_params=post_params, body=body, - _preload_content=_preload_content, - _request_timeout=_request_timeout, **urlopen_kw) - - self.last_response = response_data - - return_data = response_data - if _preload_content: - # deserialize response data - if response_type: - return_data = self.deserialize(response_data, response_type) - else: - return_data = None - - if _return_http_data_only is not False: - return return_data - else: - return (return_data, response_data.status, - response_data.getheaders()) - - def sanitize_for_serialization(self, obj): - """Build a JSON POST object. - - If obj is None, return None. - If obj is str, int, long, float, bool, return directly. - If obj is datetime.datetime, datetime.date - convert to string in iso8601 format. - If obj is list, sanitize each element in the list. - If obj is dict, return the dict. - If obj is OpenAPI model, return the properties dict. - - :param obj: The data to serialize. - :return: The serialized form of data. - """ - if obj is None: - return None - elif isinstance(obj, self.PRIMITIVE_TYPES): - return obj - elif isinstance(obj, list): - return [self.sanitize_for_serialization(sub_obj) - for sub_obj in obj] - elif isinstance(obj, tuple): - return tuple(self.sanitize_for_serialization(sub_obj) - for sub_obj in obj) - elif isinstance(obj, (datetime.datetime, datetime.date)): - return obj.isoformat() - - if isinstance(obj, dict): - obj_dict = obj - else: - # Convert model obj to dict except - # attributes `openapi_types`, `attribute_map` - # and attributes which value is not None. - # Convert attribute name to json key in - # model definition for request. - obj_dict = {obj.attribute_map[attr]: getattr(obj, attr) - for attr, _ in obj.openapi_types.items() - if getattr(obj, attr) is not None} - - return {key: self.sanitize_for_serialization(val) - for key, val in obj_dict.items()} - - def deserialize(self, response, response_type): - """Deserializes response into an object. - - :param response: RESTResponse object to be deserialized. - :param response_type: class literal for - deserialized object, or string of class name. - - :return: deserialized object. - """ - # handle file downloading - # save response body into a tmp file and return the instance - if response_type == "file": - return self.__deserialize_file(response) - - # fetch data from response object - try: - data = json.loads(response.data) - except ValueError: - data = response.data - - return self.__deserialize(data, response_type) - - def __deserialize(self, data, klass): - """Deserializes dict, list, str into an object. - - :param data: dict, list or str. - :param klass: class literal, or string of class name. - - :return: object. - """ - if data is None: - return None - - if type(klass) == str: - if klass.startswith('list['): - sub_kls = re.match(r'list\[(.*)\]', klass).group(1) - return [self.__deserialize(sub_data, sub_kls) - for sub_data in data] - - if klass.startswith('dict('): - sub_kls = re.match(r'dict\(([^,]*), (.*)\)', klass).group(2) - return {k: self.__deserialize(v, sub_kls) - for k, v in data.items()} - - # convert str to class - if klass in self.NATIVE_TYPES_MAPPING: - klass = self.NATIVE_TYPES_MAPPING[klass] - else: - klass = getattr(influxdb_client.domain, klass) - - if klass in self.PRIMITIVE_TYPES: - return self.__deserialize_primitive(data, klass) - elif klass == object: - return self.__deserialize_object(data) - elif klass == datetime.date: - return self.__deserialize_date(data) - elif klass == datetime.datetime: - return self.__deserialize_datatime(data) - else: - return self.__deserialize_model(data, klass) - - def call_api(self, resource_path, method, - path_params=None, query_params=None, header_params=None, - body=None, post_params=None, files=None, - response_type=None, auth_settings=None, async_req=None, - _return_http_data_only=None, collection_formats=None, - _preload_content=True, _request_timeout=None, urlopen_kw=None): - """Make the HTTP request (synchronous) and Return deserialized data. - - To make an async_req request, set the async_req parameter. - - :param resource_path: Path to method endpoint. - :param method: Method to call. - :param path_params: Path parameters in the url. - :param query_params: Query parameters in the url. - :param header_params: Header parameters to be - placed in the request header. - :param body: Request body. - :param post_params dict: Request post form parameters, - for `application/x-www-form-urlencoded`, `multipart/form-data`. - :param auth_settings list: Auth Settings names for the request. - :param response: Response data type. - :param files dict: key -> filename, value -> filepath, - for `multipart/form-data`. - :param async_req bool: execute request asynchronously - :param _return_http_data_only: response data without head status code - and headers - :param collection_formats: dict of collection formats for path, query, - header, and post parameters. - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :param urlopen_kw: Additional parameters are passed to - :meth:`urllib3.request.RequestMethods.request` - :return: - If async_req parameter is True, - the request will be called asynchronously. - The method will return the request thread. - If parameter async_req is False or missing, - then the method will return the response directly. - """ - if not async_req: - return self.__call_api(resource_path, method, - path_params, query_params, header_params, - body, post_params, files, - response_type, auth_settings, - _return_http_data_only, collection_formats, - _preload_content, _request_timeout, urlopen_kw) - else: - thread = self.pool.apply_async(self.__call_api, (resource_path, - method, path_params, query_params, - header_params, body, - post_params, files, - response_type, auth_settings, - _return_http_data_only, - collection_formats, - _preload_content, _request_timeout, urlopen_kw)) - return thread - - def request(self, method, url, query_params=None, headers=None, - post_params=None, body=None, _preload_content=True, - _request_timeout=None, **urlopen_kw): - """Make the HTTP request using RESTClient.""" - if method == "GET": - return self.rest_client.GET(url, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - headers=headers, - **urlopen_kw) - elif method == "HEAD": - return self.rest_client.HEAD(url, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - headers=headers, - **urlopen_kw) - elif method == "OPTIONS": - return self.rest_client.OPTIONS(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - elif method == "POST": - return self.rest_client.POST(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - elif method == "PUT": - return self.rest_client.PUT(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - elif method == "PATCH": - return self.rest_client.PATCH(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - elif method == "DELETE": - return self.rest_client.DELETE(url, - query_params=query_params, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - else: - raise ValueError( - "http method must be `GET`, `HEAD`, `OPTIONS`," - " `POST`, `PATCH`, `PUT` or `DELETE`." - ) - - def parameters_to_tuples(self, params, collection_formats): - """Get parameters as list of tuples, formatting collections. - - :param params: Parameters as dict or list of two-tuples - :param dict collection_formats: Parameter collection formats - :return: Parameters as list of tuples, collections formatted - """ - new_params = [] - if collection_formats is None: - collection_formats = {} - for k, v in params.items() if isinstance(params, dict) else params: # noqa: E501 - if k in collection_formats: - collection_format = collection_formats[k] - if collection_format == 'multi': - new_params.extend((k, value) for value in v) - else: - if collection_format == 'ssv': - delimiter = ' ' - elif collection_format == 'tsv': - delimiter = '\t' - elif collection_format == 'pipes': - delimiter = '|' - else: # csv is the default - delimiter = ',' - new_params.append( - (k, delimiter.join(str(value) for value in v))) - else: - new_params.append((k, v)) - return new_params - - def prepare_post_parameters(self, post_params=None, files=None): - """Build form parameters. - - :param post_params: Normal form parameters. - :param files: File parameters. - :return: Form parameters with files. - """ - params = [] - - if post_params: - params = post_params - - if files: - for k, v in files.items(): - if not v: - continue - file_names = v if type(v) is list else [v] - for n in file_names: - with open(n, 'rb') as f: - filename = os.path.basename(f.name) - filedata = f.read() - mimetype = (mimetypes.guess_type(filename)[0] or - 'application/octet-stream') - params.append( - tuple([k, tuple([filename, filedata, mimetype])])) - - return params - - def select_header_accept(self, accepts): - """Return `Accept` based on an array of accepts provided. - - :param accepts: List of headers. - :return: Accept (e.g. application/json). - """ - if not accepts: - return - - accepts = [x.lower() for x in accepts] - - if 'application/json' in accepts: - return 'application/json' - else: - return ', '.join(accepts) - - def select_header_content_type(self, content_types): - """Return `Content-Type` based on an array of content_types provided. - - :param content_types: List of content-types. - :return: Content-Type (e.g. application/json). - """ - if not content_types: - return 'application/json' - - content_types = [x.lower() for x in content_types] - - if 'application/json' in content_types or '*/*' in content_types: - return 'application/json' - else: - return content_types[0] - - def update_params_for_auth(self, headers, querys, auth_settings): - """Update header and query params based on authentication setting. - - :param headers: Header parameters dict to be updated. - :param querys: Query parameters tuple list to be updated. - :param auth_settings: Authentication setting identifiers list. - """ - if not auth_settings: - return - - for auth in auth_settings: - auth_setting = self.configuration.auth_settings().get(auth) - if auth_setting: - if not auth_setting['value']: - continue - elif auth_setting['in'] == 'header': - headers[auth_setting['key']] = auth_setting['value'] - elif auth_setting['in'] == 'query': - querys.append((auth_setting['key'], auth_setting['value'])) - else: - raise ValueError( - 'Authentication token must be in `query` or `header`' - ) - - def __deserialize_file(self, response): - """Deserializes body to file. - - Saves response body into a file in a temporary folder, - using the filename from the `Content-Disposition` header if provided. - - :param response: RESTResponse. - :return: file path. - """ - fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) - os.close(fd) - os.remove(path) - - content_disposition = response.getheader("Content-Disposition") - if content_disposition: - filename = re.search(r'filename=[\'"]?([^\'"\s]+)[\'"]?', - content_disposition).group(1) - path = os.path.join(os.path.dirname(path), filename) - - with open(path, "wb") as f: - f.write(response.data) - - return path - - def __deserialize_primitive(self, data, klass): - """Deserializes string to primitive type. - - :param data: str. - :param klass: class literal. - - :return: int, long, float, str, bool. - """ - try: - return klass(data) - except UnicodeEncodeError: - return str(data) - except TypeError: - return data - - def __deserialize_object(self, value): - """Return an original value. - - :return: object. - """ - return value - - def __deserialize_date(self, string): - """Deserializes string to date. - - :param string: str. - :return: date. - """ - try: - from dateutil.parser import parse - return parse(string).date() - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, - reason="Failed to parse `{0}` as date object".format(string) - ) - - def __deserialize_datatime(self, string): - """Deserializes string to datetime. - - The string should be in iso8601 datetime format. - - :param string: str. - :return: datetime. - """ - try: - from dateutil.parser import parse - return parse(string) - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, - reason=( - "Failed to parse `{0}` as datetime object" - .format(string) - ) - ) - - def __deserialize_model(self, data, klass): - """Deserializes list or dict to model. - - :param data: dict, list. - :param klass: class literal. - :return: model object. - """ - if not klass.openapi_types and not hasattr(klass, - 'get_real_child_model'): - return data - - kwargs = {} - if klass.openapi_types is not None: - for attr, attr_type in klass.openapi_types.items(): - if (data is not None and - klass.attribute_map[attr] in data and - isinstance(data, (list, dict))): - value = data[klass.attribute_map[attr]] - kwargs[attr] = self.__deserialize(value, attr_type) - - instance = klass(**kwargs) - - if hasattr(instance, 'get_real_child_model'): - klass_name = instance.get_real_child_model(data) - if klass_name: - instance = self.__deserialize(data, klass_name) - return instance - - async def _signin(self, resource_path: str): - if _requires_create_user_session(self.configuration, self.cookie, resource_path): - http_info = await SigninService(self).post_signin_async(_return_http_data_only=False) - self.cookie = http_info[2]['set-cookie'] - - async def _signout(self): - if _requires_expire_user_session(self.configuration, self.cookie): - await SignoutService(self).post_signout_async() - self.cookie = None diff --git a/frogpilot/third_party/influxdb_client/_async/rest.py b/frogpilot/third_party/influxdb_client/_async/rest.py deleted file mode 100644 index 53c555c9c..000000000 --- a/frogpilot/third_party/influxdb_client/_async/rest.py +++ /dev/null @@ -1,309 +0,0 @@ -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import io -import json -import re -import ssl -from urllib.parse import urlencode - -import aiohttp - -from influxdb_client.rest import ApiException -from influxdb_client.rest import _BaseRESTClient -from influxdb_client.rest import _UTF_8_encoding - - -async def _on_request_start(session, trace_config_ctx, params): - _BaseRESTClient.log_request(params.method, params.url) - _BaseRESTClient.log_headers(params.headers, '>>>') - - -async def _on_request_chunk_sent(session, context, params): - if params.chunk: - _BaseRESTClient.log_body(params.chunk, '>>>') - - -async def _on_request_end(session, trace_config_ctx, params): - _BaseRESTClient.log_response(params.response.status) - _BaseRESTClient.log_headers(params.headers, '<<<') - - response_content = params.response.content - data = bytearray() - while True: - chunk = await response_content.read(100) - if not chunk: - break - data += chunk - if data: - _BaseRESTClient.log_body(data.decode(_UTF_8_encoding), '<<<') - response_content.unread_data(data=data) - - -class RESTResponseAsync(io.IOBase): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - Do not edit the class manually. - """ - - def __init__(self, resp, data): - """Initialize with HTTP response.""" - self.aiohttp_response = resp - self.status = resp.status - self.reason = resp.reason - self.data = data - - def getheaders(self): - """Return a CIMultiDictProxy of the response headers.""" - return self.aiohttp_response.headers - - def getheader(self, name, default=None): - """Return a given response header.""" - return self.aiohttp_response.headers.get(name, default) - - -class RESTClientObjectAsync(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - Do not edit the class manually. - """ - - def __init__(self, configuration, pools_size=4, maxsize=None, **kwargs): - """Initialize REST client.""" - # maxsize is number of requests to host that are allowed in parallel - if maxsize is None: - maxsize = configuration.connection_pool_maxsize - - if configuration.ssl_context is None: - ssl_context = ssl.create_default_context(cafile=configuration.ssl_ca_cert) - if configuration.cert_file: - ssl_context.load_cert_chain( - certfile=configuration.cert_file, keyfile=configuration.cert_key_file, - password=configuration.cert_key_password - ) - - if not configuration.verify_ssl: - ssl_context.check_hostname = False - ssl_context.verify_mode = ssl.CERT_NONE - else: - ssl_context = configuration.ssl_context - - connector = aiohttp.TCPConnector( - limit=maxsize, - ssl=ssl_context - ) - - self.proxy = configuration.proxy - self.proxy_headers = configuration.proxy_headers - self.allow_redirects = kwargs.get('allow_redirects', True) - self.max_redirects = kwargs.get('max_redirects', 10) - - # configure tracing - trace_config = aiohttp.TraceConfig() - trace_config.on_request_start.append(_on_request_start) - trace_config.on_request_chunk_sent.append(_on_request_chunk_sent) - trace_config.on_request_end.append(_on_request_end) - - # timeout - if isinstance(configuration.timeout, (int, float,)): # noqa: E501,F821 - timeout = aiohttp.ClientTimeout(total=configuration.timeout / 1_000) - elif isinstance(configuration.timeout, aiohttp.ClientTimeout): - timeout = configuration.timeout - else: - timeout = aiohttp.client.DEFAULT_TIMEOUT - - # https pool manager - _client_session_type = kwargs.get('client_session_type', aiohttp.ClientSession) - _client_session_kwargs = kwargs.get('client_session_kwargs', {}) - self.pool_manager = _client_session_type( - connector=connector, - timeout=timeout, - trace_configs=[trace_config] if configuration.debug else None, - **_client_session_kwargs - ) - - async def close(self): - """Dispose connection pool manager.""" - await self.pool_manager.close() - - async def request(self, method, url, query_params=None, headers=None, - body=None, post_params=None, _preload_content=True, - _request_timeout=None): - """Execute request. - - :param method: http request method - :param url: http request url - :param query_params: query parameters in the url - :param headers: http request headers - :param body: request json body, for `application/json` - :param post_params: request post parameters, - `application/x-www-form-urlencoded` - and `multipart/form-data` - :param _preload_content: this is a non-applicable field for - the AiohttpClient. - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - """ - method = method.upper() - assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', - 'PATCH', 'OPTIONS'] - - if post_params and body: - raise ValueError( - "body parameter cannot be used with post_params parameter." - ) - - post_params = post_params or {} - headers = headers or {} - - if 'Content-Type' not in headers: - headers['Content-Type'] = 'application/json' - - args = { - "method": method, - "url": url, - "headers": headers, - "allow_redirects": self.allow_redirects, - "max_redirects": self.max_redirects - } - - if self.proxy: - args["proxy"] = self.proxy - if self.proxy_headers: - args["proxy_headers"] = self.proxy_headers - - if query_params: - args["url"] += '?' + urlencode(query_params) - - # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` - if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']: - if re.search('json', headers['Content-Type'], re.IGNORECASE): - if body is not None: - body = json.dumps(body) - args["data"] = body - elif headers['Content-Type'] == 'application/x-www-form-urlencoded': # noqa: E501 - args["data"] = aiohttp.FormData(post_params) - elif headers['Content-Type'] == 'multipart/form-data': - # must del headers['Content-Type'], or the correct - # Content-Type which generated by aiohttp - del headers['Content-Type'] - data = aiohttp.FormData() - for param in post_params: - k, v = param - if isinstance(v, tuple) and len(v) == 3: - data.add_field(k, - value=v[1], - filename=v[0], - content_type=v[2]) - else: - data.add_field(k, v) - args["data"] = data - - # Pass a `bytes` parameter directly in the body to support - # other content types than Json when `body` argument is provided - # in serialized form - elif isinstance(body, bytes): - args["data"] = body - else: - # Cannot generate the request from given parameters - msg = """Cannot prepare a request message for provided - arguments. Please check that your arguments match - declared content type.""" - raise ApiException(status=0, reason=msg) - - r = await self.pool_manager.request(**args) - if _preload_content: - - data = await r.read() - r = RESTResponseAsync(r, data) - - if not 200 <= r.status <= 299: - raise ApiException(http_resp=r) - - return r - - async def GET(self, url, headers=None, query_params=None, - _preload_content=True, _request_timeout=None): - """Perform GET HTTP request.""" - return (await self.request("GET", url, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - query_params=query_params)) - - async def HEAD(self, url, headers=None, query_params=None, - _preload_content=True, _request_timeout=None): - """Perform HEAD HTTP request.""" - return (await self.request("HEAD", url, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - query_params=query_params)) - - async def OPTIONS(self, url, headers=None, query_params=None, - post_params=None, body=None, _preload_content=True, - _request_timeout=None): - """Perform OPTIONS HTTP request.""" - return (await self.request("OPTIONS", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body)) - - async def DELETE(self, url, headers=None, query_params=None, body=None, - _preload_content=True, _request_timeout=None): - """Perform DELETE HTTP request.""" - return (await self.request("DELETE", url, - headers=headers, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body)) - - async def POST(self, url, headers=None, query_params=None, - post_params=None, body=None, _preload_content=True, - _request_timeout=None): - """Perform POST HTTP request.""" - return (await self.request("POST", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body)) - - async def PUT(self, url, headers=None, query_params=None, post_params=None, - body=None, _preload_content=True, _request_timeout=None): - """Perform PUT HTTP request.""" - return (await self.request("PUT", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body)) - - async def PATCH(self, url, headers=None, query_params=None, - post_params=None, body=None, _preload_content=True, - _request_timeout=None): - """Perform PATCH HTTP request.""" - return (await self.request("PATCH", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body)) diff --git a/frogpilot/third_party/influxdb_client/_sync/__init__.py b/frogpilot/third_party/influxdb_client/_sync/__init__.py deleted file mode 100644 index 476e193aa..000000000 --- a/frogpilot/third_party/influxdb_client/_sync/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Synchronous REST APIs.""" diff --git a/frogpilot/third_party/influxdb_client/_sync/api_client.py b/frogpilot/third_party/influxdb_client/_sync/api_client.py deleted file mode 100644 index f61ef26c7..000000000 --- a/frogpilot/third_party/influxdb_client/_sync/api_client.py +++ /dev/null @@ -1,663 +0,0 @@ -# coding: utf-8 -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - -from __future__ import absolute_import - -import datetime -import json -import mimetypes -import os -import re -import tempfile -from multiprocessing.pool import ThreadPool -from urllib.parse import quote - -import influxdb_client.domain -from influxdb_client import SigninService -from influxdb_client import SignoutService -from influxdb_client._sync import rest -from influxdb_client.configuration import Configuration -from influxdb_client.rest import _requires_create_user_session, _requires_expire_user_session - - -class ApiClient(object): - """Generic API client for OpenAPI client library Build. - - OpenAPI generic API client. This client handles the client- - server communication, and is invariant across implementations. Specifics of - the methods and models for each application are generated from the OpenAPI - templates. - - NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - Do not edit the class manually. - - :param configuration: .Configuration object for this client - :param header_name: a header to pass when making calls to the API. - :param header_value: a header value to pass when making calls to - the API. - :param cookie: a cookie to include in the header when making calls - to the API - :param pool_threads: The number of threads to use for async requests - to the API. More threads means more concurrent API requests. - """ - - PRIMITIVE_TYPES = (float, bool, bytes, str, int) - NATIVE_TYPES_MAPPING = { - 'int': int, - 'long': int, - 'float': float, - 'str': str, - 'bool': bool, - 'date': datetime.date, - 'datetime': datetime.datetime, - 'object': object, - } - _pool = None - - def __init__(self, configuration=None, header_name=None, header_value=None, - cookie=None, pool_threads=None, retries=False): - """Initialize generic API client.""" - if configuration is None: - configuration = Configuration() - self.configuration = configuration - self.pool_threads = pool_threads - - self.rest_client = rest.RESTClientObject(configuration, retries=retries) - self.default_headers = {} - if header_name is not None: - self.default_headers[header_name] = header_value - self.cookie = cookie - # Set default User-Agent. - from influxdb_client import VERSION - self.user_agent = f'influxdb-client-python/{VERSION}' - - def __del__(self): - """Dispose pools.""" - self._signout() - if self._pool: - self._pool.close() - self._pool.join() - self._pool = None - if self.rest_client and self.rest_client.pool_manager and hasattr(self.rest_client.pool_manager, 'clear'): - self.rest_client.pool_manager.clear() - - @property - def pool(self): - """Create thread pool on first request avoids instantiating unused threadpool for blocking clients.""" - if self._pool is None: - self._pool = ThreadPool(self.pool_threads) - return self._pool - - @property - def user_agent(self): - """User agent for this API client.""" - return self.default_headers['User-Agent'] - - @user_agent.setter - def user_agent(self, value): - """Set User agent for this API client.""" - self.default_headers['User-Agent'] = value - - def set_default_header(self, header_name, header_value): - """Set HTTP header for this API client.""" - self.default_headers[header_name] = header_value - - def __call_api( - self, resource_path, method, path_params=None, - query_params=None, header_params=None, body=None, post_params=None, - files=None, response_type=None, auth_settings=None, - _return_http_data_only=None, collection_formats=None, - _preload_content=True, _request_timeout=None, urlopen_kw=None): - - config = self.configuration - self._signin(resource_path=resource_path) - - # header parameters - header_params = header_params or {} - config.update_request_header_params(resource_path, header_params) - header_params.update(self.default_headers) - if self.cookie: - header_params['Cookie'] = self.cookie - if header_params: - header_params = self.sanitize_for_serialization(header_params) - header_params = dict(self.parameters_to_tuples(header_params, - collection_formats)) - - # path parameters - if path_params: - path_params = self.sanitize_for_serialization(path_params) - path_params = self.parameters_to_tuples(path_params, - collection_formats) - for k, v in path_params: - # specified safe chars, encode everything - resource_path = resource_path.replace( - '{%s}' % k, - quote(str(v), safe=config.safe_chars_for_path_param) - ) - - # query parameters - if query_params: - query_params = self.sanitize_for_serialization(query_params) - query_params = self.parameters_to_tuples(query_params, - collection_formats) - - # post parameters - if post_params or files: - post_params = self.prepare_post_parameters(post_params, files) - post_params = self.sanitize_for_serialization(post_params) - post_params = self.parameters_to_tuples(post_params, - collection_formats) - - # auth setting - self.update_params_for_auth(header_params, query_params, auth_settings) - - # body - if body: - body = self.sanitize_for_serialization(body) - body = config.update_request_body(resource_path, body) - - # request url - url = self.configuration.host + resource_path - - urlopen_kw = urlopen_kw or {} - - # perform request and return response - response_data = self.request( - method, url, query_params=query_params, headers=header_params, - post_params=post_params, body=body, - _preload_content=_preload_content, - _request_timeout=_request_timeout, **urlopen_kw) - - self.last_response = response_data - - return_data = response_data - if _preload_content: - # deserialize response data - if response_type: - return_data = self.deserialize(response_data, response_type) - else: - return_data = None - - if _return_http_data_only: - return (return_data) - else: - return (return_data, response_data.status, - response_data.getheaders()) - - def sanitize_for_serialization(self, obj): - """Build a JSON POST object. - - If obj is None, return None. - If obj is str, int, long, float, bool, return directly. - If obj is datetime.datetime, datetime.date - convert to string in iso8601 format. - If obj is list, sanitize each element in the list. - If obj is dict, return the dict. - If obj is OpenAPI model, return the properties dict. - - :param obj: The data to serialize. - :return: The serialized form of data. - """ - if obj is None: - return None - elif isinstance(obj, self.PRIMITIVE_TYPES): - return obj - elif isinstance(obj, list): - return [self.sanitize_for_serialization(sub_obj) - for sub_obj in obj] - elif isinstance(obj, tuple): - return tuple(self.sanitize_for_serialization(sub_obj) - for sub_obj in obj) - elif isinstance(obj, (datetime.datetime, datetime.date)): - return obj.isoformat() - - if isinstance(obj, dict): - obj_dict = obj - else: - # Convert model obj to dict except - # attributes `openapi_types`, `attribute_map` - # and attributes which value is not None. - # Convert attribute name to json key in - # model definition for request. - obj_dict = {obj.attribute_map[attr]: getattr(obj, attr) - for attr, _ in obj.openapi_types.items() - if getattr(obj, attr) is not None} - - return {key: self.sanitize_for_serialization(val) - for key, val in obj_dict.items()} - - def deserialize(self, response, response_type): - """Deserializes response into an object. - - :param response: RESTResponse object to be deserialized. - :param response_type: class literal for - deserialized object, or string of class name. - - :return: deserialized object. - """ - # handle file downloading - # save response body into a tmp file and return the instance - if response_type == "file": - return self.__deserialize_file(response) - - # fetch data from response object - try: - data = json.loads(response.data) - except ValueError: - data = response.data - - return self.__deserialize(data, response_type) - - def __deserialize(self, data, klass): - """Deserializes dict, list, str into an object. - - :param data: dict, list or str. - :param klass: class literal, or string of class name. - - :return: object. - """ - if data is None: - return None - - if type(klass) == str: - if klass.startswith('list['): - sub_kls = re.match(r'list\[(.*)\]', klass).group(1) - return [self.__deserialize(sub_data, sub_kls) - for sub_data in data] - - if klass.startswith('dict('): - sub_kls = re.match(r'dict\(([^,]*), (.*)\)', klass).group(2) - return {k: self.__deserialize(v, sub_kls) - for k, v in data.items()} - - # convert str to class - if klass in self.NATIVE_TYPES_MAPPING: - klass = self.NATIVE_TYPES_MAPPING[klass] - else: - klass = getattr(influxdb_client.domain, klass) - - if klass in self.PRIMITIVE_TYPES: - return self.__deserialize_primitive(data, klass) - elif klass == object: - return self.__deserialize_object(data) - elif klass == datetime.date: - return self.__deserialize_date(data) - elif klass == datetime.datetime: - return self.__deserialize_datatime(data) - else: - return self.__deserialize_model(data, klass) - - def call_api(self, resource_path, method, - path_params=None, query_params=None, header_params=None, - body=None, post_params=None, files=None, - response_type=None, auth_settings=None, async_req=None, - _return_http_data_only=None, collection_formats=None, - _preload_content=True, _request_timeout=None, urlopen_kw=None): - """Make the HTTP request (synchronous) and Return deserialized data. - - To make an async_req request, set the async_req parameter. - - :param resource_path: Path to method endpoint. - :param method: Method to call. - :param path_params: Path parameters in the url. - :param query_params: Query parameters in the url. - :param header_params: Header parameters to be - placed in the request header. - :param body: Request body. - :param post_params dict: Request post form parameters, - for `application/x-www-form-urlencoded`, `multipart/form-data`. - :param auth_settings list: Auth Settings names for the request. - :param response: Response data type. - :param files dict: key -> filename, value -> filepath, - for `multipart/form-data`. - :param async_req bool: execute request asynchronously - :param _return_http_data_only: response data without head status code - and headers - :param collection_formats: dict of collection formats for path, query, - header, and post parameters. - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :param urlopen_kw: Additional parameters are passed to - :meth:`urllib3.request.RequestMethods.request` - :return: - If async_req parameter is True, - the request will be called asynchronously. - The method will return the request thread. - If parameter async_req is False or missing, - then the method will return the response directly. - """ - if not async_req: - return self.__call_api(resource_path, method, - path_params, query_params, header_params, - body, post_params, files, - response_type, auth_settings, - _return_http_data_only, collection_formats, - _preload_content, _request_timeout, urlopen_kw) - else: - thread = self.pool.apply_async(self.__call_api, (resource_path, - method, path_params, query_params, - header_params, body, - post_params, files, - response_type, auth_settings, - _return_http_data_only, - collection_formats, - _preload_content, _request_timeout, urlopen_kw)) - return thread - - def request(self, method, url, query_params=None, headers=None, - post_params=None, body=None, _preload_content=True, - _request_timeout=None, **urlopen_kw): - """Make the HTTP request using RESTClient.""" - if method == "GET": - return self.rest_client.GET(url, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - headers=headers, - **urlopen_kw) - elif method == "HEAD": - return self.rest_client.HEAD(url, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - headers=headers, - **urlopen_kw) - elif method == "OPTIONS": - return self.rest_client.OPTIONS(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - elif method == "POST": - return self.rest_client.POST(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - elif method == "PUT": - return self.rest_client.PUT(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - elif method == "PATCH": - return self.rest_client.PATCH(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - elif method == "DELETE": - return self.rest_client.DELETE(url, - query_params=query_params, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - else: - raise ValueError( - "http method must be `GET`, `HEAD`, `OPTIONS`," - " `POST`, `PATCH`, `PUT` or `DELETE`." - ) - - def parameters_to_tuples(self, params, collection_formats): - """Get parameters as list of tuples, formatting collections. - - :param params: Parameters as dict or list of two-tuples - :param dict collection_formats: Parameter collection formats - :return: Parameters as list of tuples, collections formatted - """ - new_params = [] - if collection_formats is None: - collection_formats = {} - for k, v in params.items() if isinstance(params, dict) else params: # noqa: E501 - if k in collection_formats: - collection_format = collection_formats[k] - if collection_format == 'multi': - new_params.extend((k, value) for value in v) - else: - if collection_format == 'ssv': - delimiter = ' ' - elif collection_format == 'tsv': - delimiter = '\t' - elif collection_format == 'pipes': - delimiter = '|' - else: # csv is the default - delimiter = ',' - new_params.append( - (k, delimiter.join(str(value) for value in v))) - else: - new_params.append((k, v)) - return new_params - - def prepare_post_parameters(self, post_params=None, files=None): - """Build form parameters. - - :param post_params: Normal form parameters. - :param files: File parameters. - :return: Form parameters with files. - """ - params = [] - - if post_params: - params = post_params - - if files: - for k, v in files.items(): - if not v: - continue - file_names = v if type(v) is list else [v] - for n in file_names: - with open(n, 'rb') as f: - filename = os.path.basename(f.name) - filedata = f.read() - mimetype = (mimetypes.guess_type(filename)[0] or - 'application/octet-stream') - params.append( - tuple([k, tuple([filename, filedata, mimetype])])) - - return params - - def select_header_accept(self, accepts): - """Return `Accept` based on an array of accepts provided. - - :param accepts: List of headers. - :return: Accept (e.g. application/json). - """ - if not accepts: - return - - accepts = [x.lower() for x in accepts] - - if 'application/json' in accepts: - return 'application/json' - else: - return ', '.join(accepts) - - def select_header_content_type(self, content_types): - """Return `Content-Type` based on an array of content_types provided. - - :param content_types: List of content-types. - :return: Content-Type (e.g. application/json). - """ - if not content_types: - return 'application/json' - - content_types = [x.lower() for x in content_types] - - if 'application/json' in content_types or '*/*' in content_types: - return 'application/json' - else: - return content_types[0] - - def update_params_for_auth(self, headers, querys, auth_settings): - """Update header and query params based on authentication setting. - - :param headers: Header parameters dict to be updated. - :param querys: Query parameters tuple list to be updated. - :param auth_settings: Authentication setting identifiers list. - """ - if not auth_settings: - return - - for auth in auth_settings: - auth_setting = self.configuration.auth_settings().get(auth) - if auth_setting: - if not auth_setting['value']: - continue - elif auth_setting['in'] == 'header': - headers[auth_setting['key']] = auth_setting['value'] - elif auth_setting['in'] == 'query': - querys.append((auth_setting['key'], auth_setting['value'])) - else: - raise ValueError( - 'Authentication token must be in `query` or `header`' - ) - - def __deserialize_file(self, response): - """Deserializes body to file. - - Saves response body into a file in a temporary folder, - using the filename from the `Content-Disposition` header if provided. - - :param response: RESTResponse. - :return: file path. - """ - fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) - os.close(fd) - os.remove(path) - - content_disposition = response.getheader("Content-Disposition") - if content_disposition: - filename = re.search(r'filename=[\'"]?([^\'"\s]+)[\'"]?', - content_disposition).group(1) - path = os.path.join(os.path.dirname(path), filename) - - with open(path, "wb") as f: - f.write(response.data) - - return path - - def __deserialize_primitive(self, data, klass): - """Deserializes string to primitive type. - - :param data: str. - :param klass: class literal. - - :return: int, long, float, str, bool. - """ - try: - return klass(data) - except UnicodeEncodeError: - return str(data) - except TypeError: - return data - - def __deserialize_object(self, value): - """Return an original value. - - :return: object. - """ - return value - - def __deserialize_date(self, string): - """Deserializes string to date. - - :param string: str. - :return: date. - """ - try: - from dateutil.parser import parse - return parse(string).date() - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, - reason="Failed to parse `{0}` as date object".format(string) - ) - - def __deserialize_datatime(self, string): - """Deserializes string to datetime. - - The string should be in iso8601 datetime format. - - :param string: str. - :return: datetime. - """ - try: - from dateutil.parser import parse - return parse(string) - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, - reason=( - "Failed to parse `{0}` as datetime object" - .format(string) - ) - ) - - def __deserialize_model(self, data, klass): - """Deserializes list or dict to model. - - :param data: dict, list. - :param klass: class literal. - :return: model object. - """ - if not klass.openapi_types and not hasattr(klass, - 'get_real_child_model'): - return data - - kwargs = {} - if klass.openapi_types is not None: - for attr, attr_type in klass.openapi_types.items(): - if (data is not None and - klass.attribute_map[attr] in data and - isinstance(data, (list, dict))): - value = data[klass.attribute_map[attr]] - kwargs[attr] = self.__deserialize(value, attr_type) - - instance = klass(**kwargs) - - if hasattr(instance, 'get_real_child_model'): - klass_name = instance.get_real_child_model(data) - if klass_name: - instance = self.__deserialize(data, klass_name) - return instance - - def _signin(self, resource_path: str): - if _requires_create_user_session(self.configuration, self.cookie, resource_path): - http_info = SigninService(self).post_signin_with_http_info() - self.cookie = http_info[2]['set-cookie'] - - def _signout(self): - if _requires_expire_user_session(self.configuration, self.cookie): - SignoutService(self).post_signout() - self.cookie = None diff --git a/frogpilot/third_party/influxdb_client/_sync/rest.py b/frogpilot/third_party/influxdb_client/_sync/rest.py deleted file mode 100644 index eadbf0615..000000000 --- a/frogpilot/third_party/influxdb_client/_sync/rest.py +++ /dev/null @@ -1,355 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import io -import json -import re -import ssl -from urllib.parse import urlencode - -from influxdb_client.rest import ApiException -from influxdb_client.rest import _BaseRESTClient - -try: - import urllib3 -except ImportError: - raise ImportError('OpenAPI Python client requires urllib3.') - - -class RESTResponse(io.IOBase): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - Do not edit the class manually. - """ - - def __init__(self, resp): - """Initialize with HTTP response.""" - self.urllib3_response = resp - self.status = resp.status - self.reason = resp.reason - self.data = resp.data - - def getheaders(self): - """Return a dictionary of the response headers.""" - return self.urllib3_response.headers - - def getheader(self, name, default=None): - """Return a given response header.""" - return self.urllib3_response.headers.get(name, default) - - -class RESTClientObject(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - Do not edit the class manually. - """ - - def __init__(self, configuration, pools_size=4, maxsize=None, retries=False): - """Initialize REST client.""" - # urllib3.PoolManager will pass all kw parameters to connectionpool - # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501 - # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501 - # maxsize is the number of requests to host that are allowed in parallel # noqa: E501 - # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501 - - self.configuration = configuration - self.pools_size = pools_size - self.maxsize = maxsize - self.retries = retries - - # cert_reqs - if configuration.verify_ssl: - cert_reqs = ssl.CERT_REQUIRED - else: - cert_reqs = ssl.CERT_NONE - - # ca_certs - if configuration.ssl_ca_cert: - ca_certs = configuration.ssl_ca_cert - else: - ca_certs = None - - addition_pool_args = {} - if configuration.assert_hostname is not None: - addition_pool_args['assert_hostname'] = configuration.assert_hostname # noqa: E501 - addition_pool_args['retries'] = self.retries - - if maxsize is None: - if configuration.connection_pool_maxsize is not None: - maxsize = configuration.connection_pool_maxsize - else: - maxsize = 4 - - # https pool manager - if configuration.proxy: - self.pool_manager = urllib3.ProxyManager( - num_pools=pools_size, - maxsize=maxsize, - cert_reqs=cert_reqs, - ca_certs=ca_certs, - cert_file=configuration.cert_file, - key_file=configuration.cert_key_file, - key_password=configuration.cert_key_password, - proxy_url=configuration.proxy, - proxy_headers=configuration.proxy_headers, - ssl_context=configuration.ssl_context, - **addition_pool_args - ) - else: - self.pool_manager = urllib3.PoolManager( - num_pools=pools_size, - maxsize=maxsize, - cert_reqs=cert_reqs, - ca_certs=ca_certs, - cert_file=configuration.cert_file, - key_file=configuration.cert_key_file, - key_password=configuration.cert_key_password, - ssl_context=configuration.ssl_context, - **addition_pool_args - ) - - def request(self, method, url, query_params=None, headers=None, - body=None, post_params=None, _preload_content=True, - _request_timeout=None, **urlopen_kw): - """Perform requests. - - :param method: http request method - :param url: http request url - :param query_params: query parameters in the url - :param headers: http request headers - :param body: request json body, for `application/json` - :param post_params: request post parameters, - `application/x-www-form-urlencoded` - and `multipart/form-data` - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :param urlopen_kw: Additional parameters are passed to - :meth:`urllib3.request.RequestMethods.request` - """ - method = method.upper() - assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', - 'PATCH', 'OPTIONS'] - - if post_params and body: - raise ValueError( - "body parameter cannot be used with post_params parameter." - ) - - post_params = post_params or {} - headers = headers or {} - - timeout = None - _configured_timeout = _request_timeout or self.configuration.timeout - if _configured_timeout: - if isinstance(_configured_timeout, (int, float, )): # noqa: E501,F821 - timeout = urllib3.Timeout(total=_configured_timeout / 1_000) - elif (isinstance(_configured_timeout, tuple) and - len(_configured_timeout) == 2): - timeout = urllib3.Timeout( - connect=_configured_timeout[0] / 1_000, read=_configured_timeout[1] / 1_000) - - if 'Content-Type' not in headers: - headers['Content-Type'] = 'application/json' - - if self.configuration.debug: - _BaseRESTClient.log_request(method, f"{url}{'' if query_params is None else '?' + urlencode(query_params)}") - _BaseRESTClient.log_headers(headers, '>>>') - _BaseRESTClient.log_body(body, '>>>') - - try: - # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` - if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']: - if query_params: - url += '?' + urlencode(query_params) - if re.search('json', headers['Content-Type'], re.IGNORECASE): - request_body = None - if body is not None: - request_body = json.dumps(body) - r = self.pool_manager.request( - method, url, - body=request_body, - preload_content=_preload_content, - timeout=timeout, - headers=headers, - **urlopen_kw) - elif headers['Content-Type'] == 'application/x-www-form-urlencoded': # noqa: E501 - r = self.pool_manager.request( - method, url, - fields=post_params, - encode_multipart=False, - preload_content=_preload_content, - timeout=timeout, - headers=headers, - **urlopen_kw) - elif headers['Content-Type'] == 'multipart/form-data': - # must del headers['Content-Type'], or the correct - # Content-Type which generated by urllib3 will be - # overwritten. - del headers['Content-Type'] - r = self.pool_manager.request( - method, url, - fields=post_params, - encode_multipart=True, - preload_content=_preload_content, - timeout=timeout, - headers=headers, - **urlopen_kw) - # Pass a `string` parameter directly in the body to support - # other content types than Json when `body` argument is - # provided in serialized form - elif isinstance(body, str) or isinstance(body, bytes): - request_body = body - r = self.pool_manager.request( - method, url, - body=request_body, - preload_content=_preload_content, - timeout=timeout, - headers=headers, - **urlopen_kw) - else: - # Cannot generate the request from given parameters - msg = """Cannot prepare a request message for provided - arguments. Please check that your arguments match - declared content type.""" - raise ApiException(status=0, reason=msg) - # For `GET`, `HEAD` - else: - r = self.pool_manager.request(method, url, - fields=query_params, - preload_content=_preload_content, - timeout=timeout, - headers=headers, - **urlopen_kw) - except urllib3.exceptions.SSLError as e: - msg = "{0}\n{1}".format(type(e).__name__, str(e)) - raise ApiException(status=0, reason=msg) - - if _preload_content: - r = RESTResponse(r) - - # In the python 3, the response.data is bytes. - # we need to decode it to string. - r.data = r.data.decode('utf8') - - if self.configuration.debug: - _BaseRESTClient.log_response(r.status) - if hasattr(r, 'headers'): - _BaseRESTClient.log_headers(r.headers, '<<<') - if hasattr(r, 'urllib3_response'): - _BaseRESTClient.log_headers(r.urllib3_response.headers, '<<<') - _BaseRESTClient.log_body(r.data, '<<<') - - if not 200 <= r.status <= 299: - raise ApiException(http_resp=r) - - return r - - def GET(self, url, headers=None, query_params=None, _preload_content=True, - _request_timeout=None, **urlopen_kw): - """Perform GET HTTP request.""" - return self.request("GET", url, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - query_params=query_params, - **urlopen_kw) - - def HEAD(self, url, headers=None, query_params=None, _preload_content=True, - _request_timeout=None, **urlopen_kw): - """Perform HEAD HTTP request.""" - return self.request("HEAD", url, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - query_params=query_params, - **urlopen_kw) - - def OPTIONS(self, url, headers=None, query_params=None, post_params=None, - body=None, _preload_content=True, _request_timeout=None, **urlopen_kw): - """Perform OPTIONS HTTP request.""" - return self.request("OPTIONS", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - - def DELETE(self, url, headers=None, query_params=None, body=None, - _preload_content=True, _request_timeout=None, **urlopen_kw): - """Perform DELETE HTTP request.""" - return self.request("DELETE", url, - headers=headers, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - - def POST(self, url, headers=None, query_params=None, post_params=None, - body=None, _preload_content=True, _request_timeout=None, **urlopen_kw): - """Perform POST HTTP request.""" - return self.request("POST", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - - def PUT(self, url, headers=None, query_params=None, post_params=None, - body=None, _preload_content=True, _request_timeout=None, **urlopen_kw): - """Perform PUT HTTP request.""" - return self.request("PUT", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - - def PATCH(self, url, headers=None, query_params=None, post_params=None, - body=None, _preload_content=True, _request_timeout=None, **urlopen_kw): - """Perform PATCH HTTP request.""" - return self.request("PATCH", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body, - **urlopen_kw) - - def __getstate__(self): - """Return a dict of attributes that you want to pickle.""" - state = self.__dict__.copy() - # Remove Pool managaer - del state['pool_manager'] - return state - - def __setstate__(self, state): - """Set your object with the provided dict.""" - self.__dict__.update(state) - # Init Pool manager - self.__init__(self.configuration, self.pools_size, self.maxsize, self.retries) diff --git a/frogpilot/third_party/influxdb_client/client/__init__.py b/frogpilot/third_party/influxdb_client/client/__init__.py deleted file mode 100644 index 0d21a4384..000000000 --- a/frogpilot/third_party/influxdb_client/client/__init__.py +++ /dev/null @@ -1,56 +0,0 @@ -# flake8: noqa - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -# import apis into api package -from influxdb_client.service.authorizations_service import AuthorizationsService -from influxdb_client.service.backup_service import BackupService -from influxdb_client.service.bucket_schemas_service import BucketSchemasService -from influxdb_client.service.buckets_service import BucketsService -from influxdb_client.service.cells_service import CellsService -from influxdb_client.service.checks_service import ChecksService -from influxdb_client.service.config_service import ConfigService -from influxdb_client.service.dbr_ps_service import DBRPsService -from influxdb_client.service.dashboards_service import DashboardsService -from influxdb_client.service.delete_service import DeleteService -from influxdb_client.service.health_service import HealthService -from influxdb_client.service.invokable_scripts_service import InvokableScriptsService -from influxdb_client.service.labels_service import LabelsService -from influxdb_client.service.legacy_authorizations_service import LegacyAuthorizationsService -from influxdb_client.service.metrics_service import MetricsService -from influxdb_client.service.notification_endpoints_service import NotificationEndpointsService -from influxdb_client.service.notification_rules_service import NotificationRulesService -from influxdb_client.service.organizations_service import OrganizationsService -from influxdb_client.service.ping_service import PingService -from influxdb_client.service.query_service import QueryService -from influxdb_client.service.ready_service import ReadyService -from influxdb_client.service.remote_connections_service import RemoteConnectionsService -from influxdb_client.service.replications_service import ReplicationsService -from influxdb_client.service.resources_service import ResourcesService -from influxdb_client.service.restore_service import RestoreService -from influxdb_client.service.routes_service import RoutesService -from influxdb_client.service.rules_service import RulesService -from influxdb_client.service.scraper_targets_service import ScraperTargetsService -from influxdb_client.service.secrets_service import SecretsService -from influxdb_client.service.setup_service import SetupService -from influxdb_client.service.signin_service import SigninService -from influxdb_client.service.signout_service import SignoutService -from influxdb_client.service.sources_service import SourcesService -from influxdb_client.service.tasks_service import TasksService -from influxdb_client.service.telegraf_plugins_service import TelegrafPluginsService -from influxdb_client.service.telegrafs_service import TelegrafsService -from influxdb_client.service.templates_service import TemplatesService -from influxdb_client.service.users_service import UsersService -from influxdb_client.service.variables_service import VariablesService -from influxdb_client.service.views_service import ViewsService -from influxdb_client.service.write_service import WriteService diff --git a/frogpilot/third_party/influxdb_client/client/_base.py b/frogpilot/third_party/influxdb_client/client/_base.py deleted file mode 100644 index d4f179018..000000000 --- a/frogpilot/third_party/influxdb_client/client/_base.py +++ /dev/null @@ -1,556 +0,0 @@ -"""Commons function for Sync and Async client.""" -from __future__ import absolute_import - -import base64 -import configparser -import logging -import os -from datetime import datetime, timedelta -from typing import List, Generator, Any, Union, Iterable, AsyncGenerator - -from urllib3 import HTTPResponse - -from influxdb_client import Configuration, Dialect, Query, OptionStatement, VariableAssignment, Identifier, \ - Expression, BooleanLiteral, IntegerLiteral, FloatLiteral, DateTimeLiteral, UnaryExpression, DurationLiteral, \ - Duration, StringLiteral, ArrayExpression, ImportDeclaration, MemberExpression, MemberAssignment, File, \ - WriteService, QueryService, DeleteService, DeletePredicateRequest -from influxdb_client.client.flux_csv_parser import FluxResponseMetadataMode, FluxCsvParser, FluxSerializationMode -from influxdb_client.client.flux_table import FluxRecord, TableList, CSVIterator -from influxdb_client.client.util.date_utils import get_date_helper -from influxdb_client.client.util.helpers import get_org_query_param -from influxdb_client.client.warnings import MissingPivotFunction -from influxdb_client.client.write.dataframe_serializer import DataframeSerializer -from influxdb_client.rest import _UTF_8_encoding - -try: - import dataclasses - - _HAS_DATACLASS = True -except ModuleNotFoundError: - _HAS_DATACLASS = False - -LOGGERS_NAMES = [ - 'influxdb_client.client.influxdb_client', - 'influxdb_client.client.influxdb_client_async', - 'influxdb_client.client.write_api', - 'influxdb_client.client.write_api_async', - 'influxdb_client.client.write.retry', - 'influxdb_client.client.write.dataframe_serializer', - 'influxdb_client.client.util.multiprocessing_helper', - 'influxdb_client.client.http', - 'influxdb_client.client.exceptions', -] - - -# noinspection PyMethodMayBeStatic -class _BaseClient(object): - def __init__(self, url, token, debug=None, timeout=10_000, enable_gzip=False, org: str = None, - default_tags: dict = None, http_client_logger: str = None, **kwargs) -> None: - self.url = url - self.token = token - self.org = org - - self.default_tags = default_tags - - self.conf = _Configuration() - if not isinstance(self.url, str): - raise ValueError('"url" attribute is not str instance') - if self.url.endswith("/"): - self.conf.host = self.url[:-1] - else: - self.conf.host = self.url - self.conf.enable_gzip = enable_gzip - self.conf.verify_ssl = kwargs.get('verify_ssl', True) - self.conf.ssl_ca_cert = kwargs.get('ssl_ca_cert', None) - self.conf.cert_file = kwargs.get('cert_file', None) - self.conf.cert_key_file = kwargs.get('cert_key_file', None) - self.conf.cert_key_password = kwargs.get('cert_key_password', None) - self.conf.ssl_context = kwargs.get('ssl_context', None) - self.conf.proxy = kwargs.get('proxy', None) - self.conf.proxy_headers = kwargs.get('proxy_headers', None) - self.conf.connection_pool_maxsize = kwargs.get('connection_pool_maxsize', self.conf.connection_pool_maxsize) - self.conf.timeout = timeout - # logging - self.conf.loggers["http_client_logger"] = logging.getLogger(http_client_logger) - for client_logger in LOGGERS_NAMES: - self.conf.loggers[client_logger] = logging.getLogger(client_logger) - self.conf.debug = debug - - self.conf.username = kwargs.get('username', None) - self.conf.password = kwargs.get('password', None) - # defaults - self.auth_header_name = None - self.auth_header_value = None - # by token - if self.token: - self.auth_header_name = "Authorization" - self.auth_header_value = "Token " + self.token - # by HTTP basic - auth_basic = kwargs.get('auth_basic', False) - if auth_basic: - self.auth_header_name = "Authorization" - self.auth_header_value = "Basic " + base64.b64encode(token.encode()).decode() - # by username, password - if self.conf.username and self.conf.password: - self.auth_header_name = None - self.auth_header_value = None - - self.retries = kwargs.get('retries', False) - - self.profilers = kwargs.get('profilers', None) - pass - - @classmethod - def _from_config_file(cls, config_file: str = "config.ini", debug=None, enable_gzip=False, **kwargs): - config = configparser.ConfigParser() - config_name = kwargs.get('config_name', 'influx2') - is_json = False - try: - config.read(config_file) - except configparser.ParsingError: - with open(config_file) as json_file: - import json - config = json.load(json_file) - is_json = True - - def _config_value(key: str): - value = str(config[key]) if is_json else config[config_name][key] - return value.strip('"') - - def _has_option(key: str): - return key in config if is_json else config.has_option(config_name, key) - - def _has_section(key: str): - return key in config if is_json else config.has_section(key) - - url = _config_value('url') - token = _config_value('token') - - timeout = None - if _has_option('timeout'): - timeout = _config_value('timeout') - - org = None - if _has_option('org'): - org = _config_value('org') - - verify_ssl = True - if _has_option('verify_ssl'): - verify_ssl = _config_value('verify_ssl') - - ssl_ca_cert = None - if _has_option('ssl_ca_cert'): - ssl_ca_cert = _config_value('ssl_ca_cert') - - cert_file = None - if _has_option('cert_file'): - cert_file = _config_value('cert_file') - - cert_key_file = None - if _has_option('cert_key_file'): - cert_key_file = _config_value('cert_key_file') - - cert_key_password = None - if _has_option('cert_key_password'): - cert_key_password = _config_value('cert_key_password') - - connection_pool_maxsize = None - if _has_option('connection_pool_maxsize'): - connection_pool_maxsize = _config_value('connection_pool_maxsize') - - auth_basic = False - if _has_option('auth_basic'): - auth_basic = _config_value('auth_basic') - - default_tags = None - if _has_section('tags'): - if is_json: - default_tags = config['tags'] - else: - tags = {k: v.strip('"') for k, v in config.items('tags')} - default_tags = dict(tags) - - profilers = None - if _has_option('profilers'): - profilers = [x.strip() for x in _config_value('profilers').split(',')] - - proxy = None - if _has_option('proxy'): - proxy = _config_value('proxy') - - return cls(url, token, debug=debug, timeout=_to_int(timeout), org=org, default_tags=default_tags, - enable_gzip=enable_gzip, verify_ssl=_to_bool(verify_ssl), ssl_ca_cert=ssl_ca_cert, - cert_file=cert_file, cert_key_file=cert_key_file, cert_key_password=cert_key_password, - connection_pool_maxsize=_to_int(connection_pool_maxsize), auth_basic=_to_bool(auth_basic), - profilers=profilers, proxy=proxy, **kwargs) - - @classmethod - def _from_env_properties(cls, debug=None, enable_gzip=False, **kwargs): - url = os.getenv('INFLUXDB_V2_URL', "http://localhost:8086") - token = os.getenv('INFLUXDB_V2_TOKEN', "my-token") - timeout = os.getenv('INFLUXDB_V2_TIMEOUT', "10000") - org = os.getenv('INFLUXDB_V2_ORG', "my-org") - verify_ssl = os.getenv('INFLUXDB_V2_VERIFY_SSL', "True") - ssl_ca_cert = os.getenv('INFLUXDB_V2_SSL_CA_CERT', None) - cert_file = os.getenv('INFLUXDB_V2_CERT_FILE', None) - cert_key_file = os.getenv('INFLUXDB_V2_CERT_KEY_FILE', None) - cert_key_password = os.getenv('INFLUXDB_V2_CERT_KEY_PASSWORD', None) - connection_pool_maxsize = os.getenv('INFLUXDB_V2_CONNECTION_POOL_MAXSIZE', None) - auth_basic = os.getenv('INFLUXDB_V2_AUTH_BASIC', "False") - - prof = os.getenv("INFLUXDB_V2_PROFILERS", None) - profilers = None - if prof is not None: - profilers = [x.strip() for x in prof.split(',')] - - default_tags = dict() - - for key, value in os.environ.items(): - if key.startswith("INFLUXDB_V2_TAG_"): - default_tags[key[16:].lower()] = value - - return cls(url, token, debug=debug, timeout=_to_int(timeout), org=org, default_tags=default_tags, - enable_gzip=enable_gzip, verify_ssl=_to_bool(verify_ssl), ssl_ca_cert=ssl_ca_cert, - cert_file=cert_file, cert_key_file=cert_key_file, cert_key_password=cert_key_password, - connection_pool_maxsize=_to_int(connection_pool_maxsize), auth_basic=_to_bool(auth_basic), - profilers=profilers, **kwargs) - - -# noinspection PyMethodMayBeStatic -class _BaseQueryApi(object): - default_dialect = Dialect(header=True, delimiter=",", comment_prefix="#", - annotations=["datatype", "group", "default"], date_time_format="RFC3339") - - def __init__(self, influxdb_client, query_options=None): - from influxdb_client.client.query_api import QueryOptions - self._query_options = QueryOptions() if query_options is None else query_options - self._influxdb_client = influxdb_client - self._query_api = QueryService(influxdb_client.api_client) - - """Base implementation for Queryable API.""" - - def _to_tables(self, response, query_options=None, response_metadata_mode: - FluxResponseMetadataMode = FluxResponseMetadataMode.full) -> TableList: - """ - Parse HTTP response to TableList. - - :param response: HTTP response from an HTTP client. Expected type: `urllib3.response.HTTPResponse`. - """ - _parser = self._to_tables_parser(response, query_options, response_metadata_mode) - list(_parser.generator()) - return _parser.table_list() - - async def _to_tables_async(self, response, query_options=None, response_metadata_mode: - FluxResponseMetadataMode = FluxResponseMetadataMode.full) -> TableList: - """ - Parse HTTP response to TableList. - - :param response: HTTP response from an HTTP client. Expected type: `aiohttp.client_reqrep.ClientResponse`. - """ - async with self._to_tables_parser(response, query_options, response_metadata_mode) as parser: - async for _ in parser.generator_async(): - pass - return parser.table_list() - - def _to_csv(self, response: HTTPResponse) -> CSVIterator: - """Parse HTTP response to CSV.""" - return CSVIterator(response) - - def _to_flux_record_stream(self, response, query_options=None, - response_metadata_mode: FluxResponseMetadataMode = FluxResponseMetadataMode.full) -> \ - Generator[FluxRecord, Any, None]: - """ - Parse HTTP response to FluxRecord stream. - - :param response: HTTP response from an HTTP client. Expected type: `urllib3.response.HTTPResponse`. - """ - _parser = self._to_flux_record_stream_parser(query_options, response, response_metadata_mode) - return _parser.generator() - - async def _to_flux_record_stream_async(self, response, query_options=None, response_metadata_mode: - FluxResponseMetadataMode = FluxResponseMetadataMode.full) -> \ - AsyncGenerator['FluxRecord', None]: - """ - Parse HTTP response to FluxRecord stream. - - :param response: HTTP response from an HTTP client. Expected type: `aiohttp.client_reqrep.ClientResponse`. - """ - _parser = self._to_flux_record_stream_parser(query_options, response, response_metadata_mode) - return (await _parser.__aenter__()).generator_async() - - def _to_data_frame_stream(self, data_frame_index, response, query_options=None, - response_metadata_mode: FluxResponseMetadataMode = FluxResponseMetadataMode.full, - use_extension_dtypes=False): - """ - Parse HTTP response to DataFrame stream. - - :param response: HTTP response from an HTTP client. Expected type: `urllib3.response.HTTPResponse`. - """ - _parser = self._to_data_frame_stream_parser(data_frame_index, query_options, response, response_metadata_mode, - use_extension_dtypes) - return _parser.generator() - - async def _to_data_frame_stream_async(self, data_frame_index, response, query_options=None, response_metadata_mode: - FluxResponseMetadataMode = FluxResponseMetadataMode.full, - use_extension_dtypes=False): - """ - Parse HTTP response to DataFrame stream. - - :param response: HTTP response from an HTTP client. Expected type: `aiohttp.client_reqrep.ClientResponse`. - """ - _parser = self._to_data_frame_stream_parser(data_frame_index, query_options, response, response_metadata_mode, - use_extension_dtypes) - return (await _parser.__aenter__()).generator_async() - - def _to_tables_parser(self, response, query_options, response_metadata_mode): - return FluxCsvParser(response=response, serialization_mode=FluxSerializationMode.tables, - query_options=query_options, response_metadata_mode=response_metadata_mode) - - def _to_flux_record_stream_parser(self, query_options, response, response_metadata_mode): - return FluxCsvParser(response=response, serialization_mode=FluxSerializationMode.stream, - query_options=query_options, response_metadata_mode=response_metadata_mode) - - def _to_data_frame_stream_parser(self, data_frame_index, query_options, response, response_metadata_mode, - use_extension_dtypes): - return FluxCsvParser(response=response, serialization_mode=FluxSerializationMode.dataFrame, - data_frame_index=data_frame_index, query_options=query_options, - response_metadata_mode=response_metadata_mode, - use_extension_dtypes=use_extension_dtypes) - - def _to_data_frames(self, _generator): - """Parse stream of DataFrames into expected type.""" - from ..extras import pd - if isinstance(_generator, list): - _dataFrames = _generator - else: - _dataFrames = list(_generator) - - if len(_dataFrames) == 0: - return pd.DataFrame(columns=[], index=None) - elif len(_dataFrames) == 1: - return _dataFrames[0] - else: - return _dataFrames - - def _org_param(self, org): - return get_org_query_param(org=org, client=self._influxdb_client) - - def _get_query_options(self): - if self._query_options and self._query_options.profilers: - return self._query_options - elif self._influxdb_client.profilers: - from influxdb_client.client.query_api import QueryOptions - return QueryOptions(profilers=self._influxdb_client.profilers) - - def _create_query(self, query, dialect=default_dialect, params: dict = None, **kwargs): - query_options = self._get_query_options() - profilers = query_options.profilers if query_options is not None else None - q = Query(query=query, dialect=dialect, extern=_BaseQueryApi._build_flux_ast(params, profilers)) - - if profilers: - print("\n===============") - print("Profiler: query") - print("===============") - print(query) - - if kwargs.get('dataframe_query', False): - MissingPivotFunction.print_warning(query) - - return q - - @staticmethod - def _params_to_extern_ast(params: dict) -> List['OptionStatement']: - - statements = [] - for key, value in params.items(): - expression = _BaseQueryApi._parm_to_extern_ast(value) - if expression is None: - continue - - statements.append(OptionStatement("OptionStatement", - VariableAssignment("VariableAssignment", Identifier("Identifier", key), - expression))) - return statements - - @staticmethod - def _parm_to_extern_ast(value) -> Union[Expression, None]: - if value is None: - return None - if isinstance(value, bool): - return BooleanLiteral("BooleanLiteral", value) - elif isinstance(value, int): - return IntegerLiteral("IntegerLiteral", str(value)) - elif isinstance(value, float): - return FloatLiteral("FloatLiteral", value) - elif isinstance(value, datetime): - value = get_date_helper().to_utc(value) - nanoseconds = getattr(value, 'nanosecond', 0) - fraction = f'{(value.microsecond * 1000 + nanoseconds):09d}' - return DateTimeLiteral("DateTimeLiteral", value.strftime('%Y-%m-%dT%H:%M:%S.') + fraction + 'Z') - elif isinstance(value, timedelta): - _micro_delta = int(value / timedelta(microseconds=1)) - if _micro_delta < 0: - return UnaryExpression("UnaryExpression", argument=DurationLiteral("DurationLiteral", [ - Duration(magnitude=-_micro_delta, unit="us")]), operator="-") - else: - return DurationLiteral("DurationLiteral", [Duration(magnitude=_micro_delta, unit="us")]) - elif isinstance(value, str): - return StringLiteral("StringLiteral", str(value)) - elif isinstance(value, Iterable): - return ArrayExpression("ArrayExpression", - elements=list(map(lambda it: _BaseQueryApi._parm_to_extern_ast(it), value))) - else: - return value - - @staticmethod - def _build_flux_ast(params: dict = None, profilers: List[str] = None): - - imports = [] - body = [] - - if profilers is not None and len(profilers) > 0: - imports.append(ImportDeclaration( - "ImportDeclaration", - path=StringLiteral("StringLiteral", "profiler"))) - - elements = [] - for profiler in profilers: - elements.append(StringLiteral("StringLiteral", value=profiler)) - - member = MemberExpression( - "MemberExpression", - object=Identifier("Identifier", "profiler"), - _property=Identifier("Identifier", "enabledProfilers")) - - prof = OptionStatement( - "OptionStatement", - assignment=MemberAssignment( - "MemberAssignment", - member=member, - init=ArrayExpression( - "ArrayExpression", - elements=elements))) - - body.append(prof) - - if params is not None: - body.extend(_BaseQueryApi._params_to_extern_ast(params)) - - return File(package=None, name=None, type=None, imports=imports, body=body) - - -class _BaseWriteApi(object): - def __init__(self, influxdb_client, point_settings=None): - self._influxdb_client = influxdb_client - self._point_settings = point_settings - self._write_service = WriteService(influxdb_client.api_client) - if influxdb_client.default_tags: - for key, value in influxdb_client.default_tags.items(): - self._point_settings.add_default_tag(key, value) - - def _append_default_tag(self, key, val, record): - from influxdb_client import Point - if isinstance(record, bytes) or isinstance(record, str): - pass - elif isinstance(record, Point): - record.tag(key, val) - elif isinstance(record, dict): - record.setdefault("tags", {}) - record.get("tags")[key] = val - elif isinstance(record, Iterable): - for item in record: - self._append_default_tag(key, val, item) - - def _append_default_tags(self, record): - if self._point_settings.defaultTags and record is not None: - for key, val in self._point_settings.defaultTags.items(): - self._append_default_tag(key, val, record) - - def _serialize(self, record, write_precision, payload, **kwargs): - from influxdb_client import Point - if isinstance(record, bytes): - payload[write_precision].append(record) - - elif isinstance(record, str): - self._serialize(record.encode(_UTF_8_encoding), write_precision, payload, **kwargs) - - elif isinstance(record, Point): - precision_from_point = kwargs.get('precision_from_point', True) - precision = record.write_precision if precision_from_point else write_precision - self._serialize(record.to_line_protocol(precision=precision), precision, payload, **kwargs) - - elif isinstance(record, dict): - self._serialize(Point.from_dict(record, write_precision=write_precision, **kwargs), - write_precision, payload, **kwargs) - elif 'DataFrame' in type(record).__name__: - serializer = DataframeSerializer(record, self._point_settings, write_precision, **kwargs) - self._serialize(serializer.serialize(), write_precision, payload, **kwargs) - elif hasattr(record, "_asdict"): - # noinspection PyProtectedMember - self._serialize(record._asdict(), write_precision, payload, **kwargs) - elif _HAS_DATACLASS and dataclasses.is_dataclass(record): - self._serialize(dataclasses.asdict(record), write_precision, payload, **kwargs) - elif isinstance(record, Iterable): - for item in record: - self._serialize(item, write_precision, payload, **kwargs) - - -# noinspection PyMethodMayBeStatic -class _BaseDeleteApi(object): - def __init__(self, influxdb_client): - self._influxdb_client = influxdb_client - self._service = DeleteService(influxdb_client.api_client) - - def _prepare_predicate_request(self, start, stop, predicate): - date_helper = get_date_helper() - if isinstance(start, datetime): - start = date_helper.to_utc(start) - if isinstance(stop, datetime): - stop = date_helper.to_utc(stop) - predicate_request = DeletePredicateRequest(start=start, stop=stop, predicate=predicate) - return predicate_request - - -class _Configuration(Configuration): - def __init__(self): - Configuration.__init__(self) - self.enable_gzip = False - self.username = None - self.password = None - - def update_request_header_params(self, path: str, params: dict): - super().update_request_header_params(path, params) - if self.enable_gzip: - # GZIP Request - if path == '/api/v2/write': - params["Content-Encoding"] = "gzip" - params["Accept-Encoding"] = "identity" - pass - # GZIP Response - if path == '/api/v2/query': - # params["Content-Encoding"] = "gzip" - params["Accept-Encoding"] = "gzip" - pass - pass - pass - - def update_request_body(self, path: str, body): - _body = super().update_request_body(path, body) - if self.enable_gzip: - # GZIP Request - if path == '/api/v2/write': - import gzip - if isinstance(_body, bytes): - return gzip.compress(data=_body) - else: - return gzip.compress(bytes(_body, _UTF_8_encoding)) - - return _body - - -def _to_bool(bool_value): - return str(bool_value).lower() in ("yes", "true") - - -def _to_int(int_value): - return int(int_value) if int_value is not None else None diff --git a/frogpilot/third_party/influxdb_client/client/_pages.py b/frogpilot/third_party/influxdb_client/client/_pages.py deleted file mode 100644 index 5e4184276..000000000 --- a/frogpilot/third_party/influxdb_client/client/_pages.py +++ /dev/null @@ -1,66 +0,0 @@ - - -class _Page: - def __init__(self, values, has_next, next_after): - self.has_next = has_next - self.values = values - self.next_after = next_after - - @staticmethod - def empty(): - return _Page([], False, None) - - @staticmethod - def initial(after): - return _Page([], True, after) - - -class _PageIterator: - def __init__(self, page: _Page, get_next_page): - self.page = page - self.get_next_page = get_next_page - - def __iter__(self): - return self - - def __next__(self): - if not self.page.values: - if self.page.has_next: - self.page = self.get_next_page(self.page) - if not self.page.values: - raise StopIteration - return self.page.values.pop(0) - - -class _Paginated: - def __init__(self, paginated_getter, pluck_page_resources_from_response): - self.paginated_getter = paginated_getter - self.pluck_page_resources_from_response = pluck_page_resources_from_response - - def find_iter(self, **kwargs): - """Iterate over resources with pagination. - - :key str org: The organization name. - :key str org_id: The organization ID. - :key str after: The last resource ID from which to seek from (but not including). - :key int limit: the maximum number of items per page - :return: resources iterator - """ - - def get_next_page(page: _Page): - return self._find_next_page(page, **kwargs) - - return iter(_PageIterator(_Page.initial(kwargs.get('after')), get_next_page)) - - def _find_next_page(self, page: _Page, **kwargs): - if not page.has_next: - return _Page.empty() - - kw_args = {**kwargs, 'after': page.next_after} if page.next_after is not None else kwargs - response = self.paginated_getter(**kw_args) - - resources = self.pluck_page_resources_from_response(response) - has_next = response.links.next is not None - last_id = resources[-1].id if resources else None - - return _Page(resources, has_next, last_id) diff --git a/frogpilot/third_party/influxdb_client/client/authorizations_api.py b/frogpilot/third_party/influxdb_client/client/authorizations_api.py deleted file mode 100644 index 05be6ecd4..000000000 --- a/frogpilot/third_party/influxdb_client/client/authorizations_api.py +++ /dev/null @@ -1,136 +0,0 @@ -"""Authorization is about managing the security of your InfluxDB instance.""" - -from influxdb_client import Authorization, AuthorizationsService, User, Organization - - -class AuthorizationsApi(object): - """Implementation for '/api/v2/authorizations' endpoint.""" - - def __init__(self, influxdb_client): - """Initialize defaults.""" - self._influxdb_client = influxdb_client - self._authorizations_service = AuthorizationsService(influxdb_client.api_client) - - def create_authorization(self, org_id: str = None, permissions: list = None, - authorization: Authorization = None) -> Authorization: - """ - Create an authorization. - - :type permissions: list of Permission - :param org_id: organization id - :param permissions: list of permissions - :type authorization: authorization object - - """ - if authorization is not None: - if not isinstance(authorization, Authorization): - raise TypeError(f"Attempt to use non-Authorization value for authorization: {authorization}") - return self._authorizations_service.post_authorizations(authorization_post_request=authorization) - - # if org_id is not None and permissions is not None: - authorization = Authorization(org_id=org_id, permissions=permissions) - return self._authorizations_service.post_authorizations(authorization_post_request=authorization) - - def find_authorization_by_id(self, auth_id: str) -> Authorization: - """ - Find authorization by id. - - :param auth_id: authorization id - :return: Authorization - """ - return self._authorizations_service.get_authorizations_id(auth_id=auth_id) - - def find_authorizations(self, **kwargs): - """ - Get a list of all authorizations. - - :key str user_id: filter authorizations belonging to a user id - :key str user: filter authorizations belonging to a user name - :key str org_id: filter authorizations belonging to a org id - :key str org: filter authorizations belonging to a org name - :return: Authorizations - """ - authorizations = self._authorizations_service.get_authorizations(**kwargs) - - return authorizations.authorizations - - def find_authorizations_by_user(self, user: User): - """ - Find authorization by User. - - :return: Authorization list - """ - return self.find_authorizations(user_id=user.id) - - def find_authorizations_by_user_id(self, user_id: str): - """ - Find authorization by user id. - - :return: Authorization list - """ - return self.find_authorizations(user_id=user_id) - - def find_authorizations_by_user_name(self, user_name: str): - """ - Find authorization by user name. - - :return: Authorization list - """ - return self.find_authorizations(user=user_name) - - def find_authorizations_by_org(self, org: Organization): - """ - Find authorization by user name. - - :return: Authorization list - """ - if isinstance(org, Organization): - return self.find_authorizations(org_id=org.id) - - def find_authorizations_by_org_name(self, org_name: str): - """ - Find authorization by org name. - - :return: Authorization list - """ - return self.find_authorizations(org=org_name) - - def find_authorizations_by_org_id(self, org_id: str): - """ - Find authorization by org id. - - :return: Authorization list - """ - return self.find_authorizations(org_id=org_id) - - def update_authorization(self, auth): - """ - Update authorization object. - - :param auth: - :return: - """ - return self._authorizations_service.patch_authorizations_id(auth_id=auth.id, authorization_update_request=auth) - - def clone_authorization(self, auth) -> Authorization: - """Clone an authorization.""" - if isinstance(auth, Authorization): - cloned = Authorization(org_id=auth.org_id, permissions=auth.permissions) - # cloned.description = auth.description - # cloned.status = auth.status - return self.create_authorization(authorization=cloned) - - if isinstance(auth, str): - authorization = self.find_authorization_by_id(auth) - return self.clone_authorization(auth=authorization) - - raise ValueError("Invalid argument") - - def delete_authorization(self, auth): - """Delete a authorization.""" - if isinstance(auth, Authorization): - return self._authorizations_service.delete_authorizations_id(auth_id=auth.id) - - if isinstance(auth, str): - return self._authorizations_service.delete_authorizations_id(auth_id=auth) - raise ValueError("Invalid argument") diff --git a/frogpilot/third_party/influxdb_client/client/bucket_api.py b/frogpilot/third_party/influxdb_client/client/bucket_api.py deleted file mode 100644 index 684da7676..000000000 --- a/frogpilot/third_party/influxdb_client/client/bucket_api.py +++ /dev/null @@ -1,132 +0,0 @@ -""" -A bucket is a named location where time series data is stored. - -All buckets have a retention policy, a duration of time that each data point persists. -A bucket belongs to an organization. -""" -import warnings - -from influxdb_client import BucketsService, Bucket, PostBucketRequest, PatchBucketRequest -from influxdb_client.client.util.helpers import get_org_query_param -from influxdb_client.client._pages import _Paginated - - -class BucketsApi(object): - """Implementation for '/api/v2/buckets' endpoint.""" - - def __init__(self, influxdb_client): - """Initialize defaults.""" - self._influxdb_client = influxdb_client - self._buckets_service = BucketsService(influxdb_client.api_client) - - def create_bucket(self, bucket=None, bucket_name=None, org_id=None, retention_rules=None, - description=None, org=None) -> Bucket: - """Create a bucket. - - :param Bucket|PostBucketRequest bucket: bucket to create - :param bucket_name: bucket name - :param description: bucket description - :param org_id: org_id - :param bucket_name: bucket name - :param retention_rules: retention rules array or single BucketRetentionRules - :param str, Organization org: specifies the organization for create the bucket; - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClient.org`` is used. - :return: Bucket - If the method is called asynchronously, - returns the request thread. - """ - if retention_rules is None: - retention_rules = [] - - rules = [] - - if isinstance(retention_rules, list): - rules.extend(retention_rules) - else: - rules.append(retention_rules) - - if org_id is not None: - warnings.warn("org_id is deprecated; use org", DeprecationWarning) - - if bucket is None: - bucket = PostBucketRequest(name=bucket_name, - retention_rules=rules, - description=description, - org_id=get_org_query_param(org=(org_id if org is None else org), - client=self._influxdb_client, - required_id=True)) - - return self._buckets_service.post_buckets(post_bucket_request=bucket) - - def update_bucket(self, bucket: Bucket) -> Bucket: - """Update a bucket. - - :param bucket: Bucket update to apply (required) - :return: Bucket - """ - request = PatchBucketRequest(name=bucket.name, - description=bucket.description, - retention_rules=bucket.retention_rules) - - return self._buckets_service.patch_buckets_id(bucket_id=bucket.id, patch_bucket_request=request) - - def delete_bucket(self, bucket): - """Delete a bucket. - - :param bucket: bucket id or Bucket - :return: Bucket - """ - if isinstance(bucket, Bucket): - bucket_id = bucket.id - else: - bucket_id = bucket - - return self._buckets_service.delete_buckets_id(bucket_id=bucket_id) - - def find_bucket_by_id(self, id): - """Find bucket by ID. - - :param id: - :return: - """ - return self._buckets_service.get_buckets_id(id) - - def find_bucket_by_name(self, bucket_name): - """Find bucket by name. - - :param bucket_name: bucket name - :return: Bucket - """ - buckets = self._buckets_service.get_buckets(name=bucket_name) - - if len(buckets.buckets) > 0: - return buckets.buckets[0] - else: - return None - - def find_buckets(self, **kwargs): - """List buckets. - - :key int offset: Offset for pagination - :key int limit: Limit for pagination - :key str after: The last resource ID from which to seek from (but not including). - This is to be used instead of `offset`. - :key str org: The organization name. - :key str org_id: The organization ID. - :key str name: Only returns buckets with a specific name. - :return: Buckets - """ - return self._buckets_service.get_buckets(**kwargs) - - def find_buckets_iter(self, **kwargs): - """Iterate over all buckets with pagination. - - :key str name: Only returns buckets with the specified name - :key str org: The organization name. - :key str org_id: The organization ID. - :key str after: The last resource ID from which to seek from (but not including). - :key int limit: the maximum number of buckets in one page - :return: Buckets iterator - """ - return _Paginated(self._buckets_service.get_buckets, lambda response: response.buckets).find_iter(**kwargs) diff --git a/frogpilot/third_party/influxdb_client/client/delete_api.py b/frogpilot/third_party/influxdb_client/client/delete_api.py deleted file mode 100644 index 5f9da4716..000000000 --- a/frogpilot/third_party/influxdb_client/client/delete_api.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Delete time series data from InfluxDB.""" - -from datetime import datetime -from typing import Union - -from influxdb_client import Organization -from influxdb_client.client._base import _BaseDeleteApi -from influxdb_client.client.util.helpers import get_org_query_param - - -class DeleteApi(_BaseDeleteApi): - """Implementation for '/api/v2/delete' endpoint.""" - - def __init__(self, influxdb_client): - """Initialize defaults.""" - super().__init__(influxdb_client) - - def delete(self, start: Union[str, datetime], stop: Union[str, datetime], predicate: str, bucket: str, - org: Union[str, Organization, None] = None) -> None: - """ - Delete Time series data from InfluxDB. - - :param str, datetime.datetime start: start time - :param str, datetime.datetime stop: stop time - :param str predicate: predicate - :param str bucket: bucket id or name from which data will be deleted - :param str, Organization org: specifies the organization to delete data from. - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClient.org`` is used. - :return: - """ - predicate_request = self._prepare_predicate_request(start, stop, predicate) - org_param = get_org_query_param(org=org, client=self._influxdb_client, required_id=False) - - return self._service.post_delete(delete_predicate_request=predicate_request, bucket=bucket, org=org_param) diff --git a/frogpilot/third_party/influxdb_client/client/delete_api_async.py b/frogpilot/third_party/influxdb_client/client/delete_api_async.py deleted file mode 100644 index ef44c843a..000000000 --- a/frogpilot/third_party/influxdb_client/client/delete_api_async.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Delete time series data from InfluxDB.""" - -from datetime import datetime -from typing import Union - -from influxdb_client import Organization -from influxdb_client.client._base import _BaseDeleteApi -from influxdb_client.client.util.helpers import get_org_query_param - - -class DeleteApiAsync(_BaseDeleteApi): - """Async implementation for '/api/v2/delete' endpoint.""" - - def __init__(self, influxdb_client): - """Initialize defaults.""" - super().__init__(influxdb_client) - - async def delete(self, start: Union[str, datetime], stop: Union[str, datetime], predicate: str, bucket: str, - org: Union[str, Organization, None] = None) -> bool: - """ - Delete Time series data from InfluxDB. - - :param str, datetime.datetime start: start time - :param str, datetime.datetime stop: stop time - :param str predicate: predicate - :param str bucket: bucket id or name from which data will be deleted - :param str, Organization org: specifies the organization to delete data from. - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClientAsync.org`` is used. - :return: ``True`` for successfully deleted data, otherwise raise an exception - """ - predicate_request = self._prepare_predicate_request(start, stop, predicate) - org_param = get_org_query_param(org=org, client=self._influxdb_client, required_id=False) - - response = await self._service.post_delete_async(delete_predicate_request=predicate_request, bucket=bucket, - org=org_param, _return_http_data_only=False) - return response[1] == 204 diff --git a/frogpilot/third_party/influxdb_client/client/exceptions.py b/frogpilot/third_party/influxdb_client/client/exceptions.py deleted file mode 100644 index bfa453e2d..000000000 --- a/frogpilot/third_party/influxdb_client/client/exceptions.py +++ /dev/null @@ -1,47 +0,0 @@ -"""Exceptions utils for InfluxDB.""" - -import logging - -from urllib3 import HTTPResponse - -logger = logging.getLogger('influxdb_client.client.exceptions') - - -class InfluxDBError(Exception): - """Raised when a server error occurs.""" - - def __init__(self, response: HTTPResponse = None, message: str = None): - """Initialize the InfluxDBError handler.""" - if response is not None: - self.response = response - self.message = self._get_message(response) - if isinstance(response, HTTPResponse): # response is HTTPResponse - self.headers = response.headers - self.retry_after = response.headers.get('Retry-After') - else: # response is RESTResponse - self.headers = response.getheaders() - self.retry_after = response.getheader('Retry-After') - else: - self.response = None - self.message = message or 'no response' - self.retry_after = None - super().__init__(self.message) - - def _get_message(self, response): - # Body - if response.data: - import json - try: - return json.loads(response.data)["message"] - except Exception as e: - logging.debug(f"Cannot parse error response to JSON: {response.data}, {e}") - return response.data - - # Header - for header_key in ["X-Platform-Error-Code", "X-Influx-Error", "X-InfluxDb-Error"]: - header_value = response.getheader(header_key) - if header_value is not None: - return header_value - - # Http Status - return response.reason diff --git a/frogpilot/third_party/influxdb_client/client/flux_csv_parser.py b/frogpilot/third_party/influxdb_client/client/flux_csv_parser.py deleted file mode 100644 index 99e680941..000000000 --- a/frogpilot/third_party/influxdb_client/client/flux_csv_parser.py +++ /dev/null @@ -1,408 +0,0 @@ -"""Parsing response from InfluxDB to FluxStructures or DataFrame.""" - -import base64 -import codecs -import csv as csv_parser -import warnings -from enum import Enum -from typing import List - -from influxdb_client.client.flux_table import FluxTable, FluxColumn, FluxRecord, TableList -from influxdb_client.client.util.date_utils import get_date_helper -from influxdb_client.rest import _UTF_8_encoding - -ANNOTATION_DEFAULT = "#default" -ANNOTATION_GROUP = "#group" -ANNOTATION_DATATYPE = "#datatype" -ANNOTATIONS = [ANNOTATION_DEFAULT, ANNOTATION_GROUP, ANNOTATION_DATATYPE] - - -class FluxQueryException(Exception): - """The exception from InfluxDB.""" - - def __init__(self, message, reference) -> None: - """Initialize defaults.""" - self.message = message - self.reference = reference - - -class FluxCsvParserException(Exception): - """The exception for not parsable data.""" - - pass - - -class FluxSerializationMode(Enum): - """The type how we want to serialize data.""" - - tables = 1 - stream = 2 - dataFrame = 3 - - -class FluxResponseMetadataMode(Enum): - """The configuration for expected amount of metadata response from InfluxDB.""" - - full = 1 - # useful for Invokable scripts - only_names = 2 - - -class _FluxCsvParserMetadata(object): - def __init__(self): - self.table_index = 0 - self.table_id = -1 - self.start_new_table = False - self.table = None - self.groups = [] - self.parsing_state_error = False - - -class FluxCsvParser(object): - """Parse to processing response from InfluxDB to FluxStructures or DataFrame.""" - - def __init__(self, response, serialization_mode: FluxSerializationMode, - data_frame_index: List[str] = None, query_options=None, - response_metadata_mode: FluxResponseMetadataMode = FluxResponseMetadataMode.full, - use_extension_dtypes=False) -> None: - """ - Initialize defaults. - - :param response: HTTP response from a HTTP client. - Acceptable types: `urllib3.response.HTTPResponse`, `aiohttp.client_reqrep.ClientResponse`. - """ - self._response = response - self.tables = TableList() - self._serialization_mode = serialization_mode - self._response_metadata_mode = response_metadata_mode - self._use_extension_dtypes = use_extension_dtypes - self._data_frame_index = data_frame_index - self._data_frame_values = [] - self._profilers = query_options.profilers if query_options is not None else None - self._profiler_callback = query_options.profiler_callback if query_options is not None else None - self._async_mode = True if 'ClientResponse' in type(response).__name__ else False - - def _close(self): - self._response.close() - - def __enter__(self): - """Initialize CSV reader.""" - # response can be exhausted by logger, so we have to use data that has already been read - if hasattr(self._response, 'closed') and self._response.closed: - from io import StringIO - self._reader = csv_parser.reader(StringIO(self._response.data.decode(_UTF_8_encoding))) - else: - self._reader = csv_parser.reader(codecs.iterdecode(self._response, _UTF_8_encoding)) - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - """Close HTTP response.""" - self._close() - - async def __aenter__(self) -> 'FluxCsvParser': - """Initialize CSV reader.""" - from aiocsv import AsyncReader - self._reader = AsyncReader(_StreamReaderToWithAsyncRead(self._response.content)) - - return self - - async def __aexit__(self, exc_type, exc_val, exc_tb) -> None: - """Shutdown the client.""" - self.__exit__(exc_type, exc_val, exc_tb) - - def generator(self): - """Return Python generator.""" - with self as parser: - for val in parser._parse_flux_response(): - yield val - - def generator_async(self): - """Return Python async-generator.""" - return self._parse_flux_response_async() - - def _parse_flux_response(self): - metadata = _FluxCsvParserMetadata() - - for csv in self._reader: - for val in self._parse_flux_response_row(metadata, csv): - yield val - - # Return latest DataFrame - if (self._serialization_mode is FluxSerializationMode.dataFrame) & hasattr(self, '_data_frame'): - df = self._prepare_data_frame() - if not self._is_profiler_table(metadata.table): - yield df - - async def _parse_flux_response_async(self): - metadata = _FluxCsvParserMetadata() - - try: - async for csv in self._reader: - for val in self._parse_flux_response_row(metadata, csv): - yield val - - # Return latest DataFrame - if (self._serialization_mode is FluxSerializationMode.dataFrame) & hasattr(self, '_data_frame'): - df = self._prepare_data_frame() - if not self._is_profiler_table(metadata.table): - yield df - except BaseException as e: - e_type = type(e).__name__ - if "CancelledError" in e_type or "TimeoutError" in e_type: - e.add_note("Stream cancelled during read. Recommended: Check Influxdb client `timeout` setting.") - raise - finally: - self._close() - - def _parse_flux_response_row(self, metadata, csv): - if len(csv) < 1: - # Skip empty line in results (new line is used as a delimiter between tables or table and error) - pass - - elif "error" == csv[1] and "reference" == csv[2]: - metadata.parsing_state_error = True - - else: - # Throw InfluxException with error response - if metadata.parsing_state_error: - error = csv[1] - reference_value = csv[2] - raise FluxQueryException(error, reference_value) - - token = csv[0] - # start new table - if (token in ANNOTATIONS and not metadata.start_new_table) or \ - (self._response_metadata_mode is FluxResponseMetadataMode.only_names and not metadata.table): - - # Return already parsed DataFrame - if (self._serialization_mode is FluxSerializationMode.dataFrame) & hasattr(self, '_data_frame'): - df = self._prepare_data_frame() - if not self._is_profiler_table(metadata.table): - yield df - - metadata.start_new_table = True - metadata.table = FluxTable() - self._insert_table(metadata.table, metadata.table_index) - metadata.table_index = metadata.table_index + 1 - metadata.table_id = -1 - elif metadata.table is None: - raise FluxCsvParserException("Unable to parse CSV response. FluxTable definition was not found.") - - # # datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,double,string,string,string - if ANNOTATION_DATATYPE == token: - self.add_data_types(metadata.table, csv) - - elif ANNOTATION_GROUP == token: - metadata.groups = csv - - elif ANNOTATION_DEFAULT == token: - self.add_default_empty_values(metadata.table, csv) - - else: - # parse column names - if metadata.start_new_table: - # Invokable scripts doesn't supports dialect => all columns are string - if not metadata.table.columns and \ - self._response_metadata_mode is FluxResponseMetadataMode.only_names: - self.add_data_types(metadata.table, list(map(lambda column: 'string', csv))) - metadata.groups = list(map(lambda column: 'false', csv)) - self.add_groups(metadata.table, metadata.groups) - self.add_column_names_and_tags(metadata.table, csv) - metadata.start_new_table = False - # Create DataFrame with default values - if self._serialization_mode is FluxSerializationMode.dataFrame: - from ..extras import pd - labels = list(map(lambda it: it.label, metadata.table.columns)) - self._data_frame = pd.DataFrame(data=[], columns=labels, index=None) - pass - else: - - # to int conversions todo - current_id = int(csv[2]) - if metadata.table_id == -1: - metadata.table_id = current_id - - if metadata.table_id != current_id: - # create new table with previous column headers settings - flux_columns = metadata.table.columns - metadata.table = FluxTable() - metadata.table.columns.extend(flux_columns) - self._insert_table(metadata.table, metadata.table_index) - metadata.table_index = metadata.table_index + 1 - metadata.table_id = current_id - - flux_record = self.parse_record(metadata.table_index - 1, metadata.table, csv) - - if self._is_profiler_record(flux_record): - self._print_profiler_info(flux_record) - else: - if self._serialization_mode is FluxSerializationMode.tables: - self.tables[metadata.table_index - 1].records.append(flux_record) - - if self._serialization_mode is FluxSerializationMode.stream: - yield flux_record - - if self._serialization_mode is FluxSerializationMode.dataFrame: - self._data_frame_values.append(flux_record.values) - pass - - def _prepare_data_frame(self): - from ..extras import pd - - # We have to create temporary DataFrame because we want to preserve default column values - _temp_df = pd.DataFrame(self._data_frame_values) - self._data_frame_values = [] - - # Custom DataFrame index - if self._data_frame_index: - self._data_frame = self._data_frame.set_index(self._data_frame_index) - _temp_df = _temp_df.set_index(self._data_frame_index) - - # Append data - df = pd.concat([self._data_frame.astype(_temp_df.dtypes), _temp_df]) - - if self._use_extension_dtypes: - return df.convert_dtypes() - return df - - def parse_record(self, table_index, table, csv): - """Parse one record.""" - record = FluxRecord(table_index) - - for fluxColumn in table.columns: - column_name = fluxColumn.label - str_val = csv[fluxColumn.index + 1] - record.values[column_name] = self._to_value(str_val, fluxColumn) - record.row.append(record.values[column_name]) - - return record - - def _to_value(self, str_val, column): - - if str_val == '' or str_val is None: - default_value = column.default_value - if default_value == '' or default_value is None: - if self._serialization_mode is FluxSerializationMode.dataFrame: - if self._use_extension_dtypes: - from ..extras import pd - return pd.NA - return None - return None - return self._to_value(default_value, column) - - if "string" == column.data_type: - return str_val - - if "boolean" == column.data_type: - return "true" == str_val - - if "unsignedLong" == column.data_type or "long" == column.data_type: - return int(str_val) - - if "double" == column.data_type: - return float(str_val) - - if "base64Binary" == column.data_type: - return base64.b64decode(str_val) - - if "dateTime:RFC3339" == column.data_type or "dateTime:RFC3339Nano" == column.data_type: - return get_date_helper().parse_date(str_val) - - if "duration" == column.data_type: - # todo better type ? - return int(str_val) - - @staticmethod - def add_data_types(table, data_types): - """Add data types to columns.""" - for index in range(1, len(data_types)): - column_def = FluxColumn(index=index - 1, data_type=data_types[index]) - table.columns.append(column_def) - - @staticmethod - def add_groups(table, csv): - """Add group keys to columns.""" - i = 1 - for column in table.columns: - column.group = csv[i] == "true" - i += 1 - - @staticmethod - def add_default_empty_values(table, default_values): - """Add default values to columns.""" - i = 1 - for column in table.columns: - column.default_value = default_values[i] - i += 1 - - @staticmethod - def add_column_names_and_tags(table, csv): - """Add labels to columns.""" - if len(csv) != len(set(csv)): - message = f"""The response contains columns with duplicated names: '{csv}'. - -You should use the 'record.row' to access your data instead of 'record.values' dictionary. -""" - warnings.warn(message, UserWarning) - print(message) - i = 1 - for column in table.columns: - column.label = csv[i] - i += 1 - - def _insert_table(self, table, table_index): - if self._serialization_mode is FluxSerializationMode.tables: - self.tables.insert(table_index, table) - - def _is_profiler_record(self, flux_record: FluxRecord) -> bool: - if not self._profilers: - return False - - for profiler in self._profilers: - if "_measurement" in flux_record.values and flux_record["_measurement"] == "profiler/" + profiler: - return True - - return False - - def _is_profiler_table(self, table: FluxTable) -> bool: - - if not self._profilers: - return False - - return any(filter(lambda column: (column.default_value == "_profiler" and column.label == "result"), - table.columns)) - - def table_list(self) -> TableList: - """Get the list of flux tables.""" - if not self._profilers: - return self.tables - else: - return TableList(filter(lambda table: not self._is_profiler_table(table), self.tables)) - - def _print_profiler_info(self, flux_record: FluxRecord): - if flux_record.get_measurement().startswith("profiler/"): - if self._profiler_callback: - self._profiler_callback(flux_record) - else: - msg = "Profiler: " + flux_record.get_measurement() - print("\n" + len(msg) * "=") - print(msg) - print(len(msg) * "=") - for name in flux_record.values: - val = flux_record[name] - if isinstance(val, str) and len(val) > 50: - print(f"{name:<20}: \n\n{val}") - elif val is not None: - print(f"{name:<20}: {val:<20}") - - -class _StreamReaderToWithAsyncRead: - def __init__(self, response): - self.response = response - self.decoder = codecs.getincrementaldecoder(_UTF_8_encoding)() - - async def read(self, size: int) -> str: - raw_bytes = (await self.response.read(size)) - if not raw_bytes: - return self.decoder.decode(b'', final=True) - return self.decoder.decode(raw_bytes, final=False) diff --git a/frogpilot/third_party/influxdb_client/client/flux_table.py b/frogpilot/third_party/influxdb_client/client/flux_table.py deleted file mode 100644 index 5fd9a061d..000000000 --- a/frogpilot/third_party/influxdb_client/client/flux_table.py +++ /dev/null @@ -1,290 +0,0 @@ -""" -Flux employs a basic data model built from basic data types. - -The data model consists of tables, records, columns. -""" -import codecs -import csv -from http.client import HTTPResponse -from json import JSONEncoder -from typing import List, Iterator -from influxdb_client.rest import _UTF_8_encoding - - -class FluxStructure: - """The data model consists of tables, records, columns.""" - - pass - - -class FluxStructureEncoder(JSONEncoder): - """The FluxStructure encoder to encode query results to JSON.""" - - def default(self, obj): - """Return serializable objects for JSONEncoder.""" - import datetime - if isinstance(obj, FluxStructure): - return obj.__dict__ - elif isinstance(obj, (datetime.datetime, datetime.date)): - return obj.isoformat() - return super().default(obj) - - -class FluxTable(FluxStructure): - """ - A table is set of records with a common set of columns and a group key. - - The table can be serialized into JSON by:: - - import json - from influxdb_client.client.flux_table import FluxStructureEncoder - - output = json.dumps(tables, cls=FluxStructureEncoder, indent=2) - print(output) - - """ - - def __init__(self) -> None: - """Initialize defaults.""" - self.columns: List[FluxColumn] = [] - self.records: List[FluxRecord] = [] - - def get_group_key(self): - """ - Group key is a list of columns. - - A table’s group key denotes which subset of the entire dataset is assigned to the table. - """ - return list(filter(lambda column: (column.group is True), self.columns)) - - def __str__(self): - """Return formatted output.""" - cls_name = type(self).__name__ - return cls_name + "() columns: " + str(len(self.columns)) + ", records: " + str(len(self.records)) - - def __repr__(self): - """Format for inspection.""" - return f"<{type(self).__name__}: {len(self.columns)} columns, {len(self.records)} records>" - - def __iter__(self): - """Iterate over records.""" - return iter(self.records) - - -class FluxColumn(FluxStructure): - """A column has a label and a data type.""" - - def __init__(self, index=None, label=None, data_type=None, group=None, default_value=None) -> None: - """Initialize defaults.""" - self.default_value = default_value - self.group = group - self.data_type = data_type - self.label = label - self.index = index - - def __repr__(self): - """Format for inspection.""" - fields = [repr(self.index)] + [ - f'{name}={getattr(self, name)!r}' for name in ( - 'label', 'data_type', 'group', 'default_value' - ) if getattr(self, name) is not None - ] - return f"{type(self).__name__}({', '.join(fields)})" - - -class FluxRecord(FluxStructure): - """A record is a tuple of named values and is represented using an object type.""" - - def __init__(self, table, values=None) -> None: - """Initialize defaults.""" - if values is None: - values = {} - self.table = table - self.values = values - self.row = [] - - def get_start(self): - """Get '_start' value.""" - return self["_start"] - - def get_stop(self): - """Get '_stop' value.""" - return self["_stop"] - - def get_time(self): - """Get timestamp.""" - return self["_time"] - - def get_value(self): - """Get field value.""" - return self["_value"] - - def get_field(self): - """Get field name.""" - return self["_field"] - - def get_measurement(self): - """Get measurement name.""" - return self["_measurement"] - - def __getitem__(self, key): - """Get value by key.""" - return self.values.__getitem__(key) - - def __setitem__(self, key, value): - """Set value with key and value.""" - return self.values.__setitem__(key, value) - - def __str__(self): - """Return formatted output.""" - cls_name = type(self).__name__ - return cls_name + "() table: " + str(self.table) + ", " + str(self.values) - - def __repr__(self): - """Format for inspection.""" - return f"<{type(self).__name__}: field={self.values.get('_field')}, value={self.values.get('_value')}>" - - -class TableList(List[FluxTable]): - """:class:`~influxdb_client.client.flux_table.FluxTable` list with additionally functional to better handle of query result.""" # noqa: E501 - - def to_values(self, columns: List['str'] = None) -> List[List[object]]: - """ - Serialize query results to a flattened list of values. - - :param columns: if not ``None`` then only specified columns are presented in results - :return: :class:`~list` of values - - Output example: - - .. code-block:: python - - [ - ['New York', datetime.datetime(2022, 6, 7, 11, 3, 22, 917593, tzinfo=tzutc()), 24.3], - ['Prague', datetime.datetime(2022, 6, 7, 11, 3, 22, 917593, tzinfo=tzutc()), 25.3], - ... - ] - - Configure required columns: - - .. code-block:: python - - from influxdb_client import InfluxDBClient - - with InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org") as client: - - # Query: using Table structure - tables = client.query_api().query('from(bucket:"my-bucket") |> range(start: -10m)') - - # Serialize to values - output = tables.to_values(columns=['location', '_time', '_value']) - print(output) - """ - - def filter_values(record): - if columns is not None: - return [record.values.get(k) for k in columns] - return record.values.values() - - return self._to_values(filter_values) - - def to_json(self, columns: List['str'] = None, **kwargs) -> str: - """ - Serialize query results to a JSON formatted :class:`~str`. - - :param columns: if not ``None`` then only specified columns are presented in results - :return: :class:`~str` - - The query results is flattened to array: - - .. code-block:: javascript - - [ - { - "_measurement": "mem", - "_start": "2021-06-23T06:50:11.897825+00:00", - "_stop": "2021-06-25T06:50:11.897825+00:00", - "_time": "2020-02-27T16:20:00.897825+00:00", - "region": "north", - "_field": "usage", - "_value": 15 - }, - { - "_measurement": "mem", - "_start": "2021-06-23T06:50:11.897825+00:00", - "_stop": "2021-06-25T06:50:11.897825+00:00", - "_time": "2020-02-27T16:20:01.897825+00:00", - "region": "west", - "_field": "usage", - "_value": 10 - }, - ... - ] - - The JSON format could be configured via ``**kwargs`` arguments: - - .. code-block:: python - - from influxdb_client import InfluxDBClient - - with InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org") as client: - - # Query: using Table structure - tables = client.query_api().query('from(bucket:"my-bucket") |> range(start: -10m)') - - # Serialize to JSON - output = tables.to_json(indent=5) - print(output) - - For all available options see - `json.dump `_. - """ - if 'indent' not in kwargs: - kwargs['indent'] = 2 - - def filter_values(record): - if columns is not None: - return {k: v for (k, v) in record.values.items() if k in columns} - return record.values - - import json - return json.dumps(self._to_values(filter_values), cls=FluxStructureEncoder, **kwargs) - - def _to_values(self, mapping): - return [mapping(record) for table in self for record in table.records] - - -class CSVIterator(Iterator[List[str]]): - """:class:`Iterator[List[str]]` with additionally functional to better handle of query result.""" - - def __init__(self, response: HTTPResponse) -> None: - """Initialize ``csv.reader``.""" - self.delegate = csv.reader(codecs.iterdecode(response, _UTF_8_encoding)) - - def __iter__(self): - """Return an iterator object.""" - return self - - def __next__(self): - """Retrieve the next item from the iterator.""" - row = self.delegate.__next__() - while not row: - row = self.delegate.__next__() - return row - - def to_values(self) -> List[List[str]]: - """ - Serialize query results to a flattened list of values. - - :return: :class:`~list` of values - - Output example: - - .. code-block:: python - - [ - ['New York', '2022-06-14T08:00:51.749072045Z', '24.3'], - ['Prague', '2022-06-14T08:00:51.749072045Z', '25.3'], - ... - ] - """ - return list(self.__iter__()) diff --git a/frogpilot/third_party/influxdb_client/client/influxdb_client.py b/frogpilot/third_party/influxdb_client/client/influxdb_client.py deleted file mode 100644 index cbae75a90..000000000 --- a/frogpilot/third_party/influxdb_client/client/influxdb_client.py +++ /dev/null @@ -1,438 +0,0 @@ -"""InfluxDBClient is client for API defined in https://github.com/influxdata/influxdb/blob/master/http/swagger.yml.""" - -from __future__ import absolute_import - -import logging -import warnings - -from influxdb_client import HealthCheck, HealthService, Ready, ReadyService, PingService, \ - InvokableScriptsApi -from influxdb_client.client._base import _BaseClient -from influxdb_client.client.authorizations_api import AuthorizationsApi -from influxdb_client.client.bucket_api import BucketsApi -from influxdb_client.client.delete_api import DeleteApi -from influxdb_client.client.labels_api import LabelsApi -from influxdb_client.client.organizations_api import OrganizationsApi -from influxdb_client.client.query_api import QueryApi, QueryOptions -from influxdb_client.client.tasks_api import TasksApi -from influxdb_client.client.users_api import UsersApi -from influxdb_client.client.write_api import WriteApi, WriteOptions, PointSettings - -logger = logging.getLogger('influxdb_client.client.influxdb_client') - - -class InfluxDBClient(_BaseClient): - """InfluxDBClient is client for InfluxDB v2.""" - - def __init__(self, url, token: str = None, debug=None, timeout=10_000, enable_gzip=False, org: str = None, - default_tags: dict = None, **kwargs) -> None: - """ - Initialize defaults. - - :param url: InfluxDB server API url (ex. http://localhost:8086). - :param token: ``token`` to authenticate to the InfluxDB API - :param debug: enable verbose logging of http requests - :param timeout: HTTP client timeout setting for a request specified in milliseconds. - If one number provided, it will be total request timeout. - It can also be a pair (tuple) of (connection, read) timeouts. - :param enable_gzip: Enable Gzip compression for http requests. Currently, only the "Write" and "Query" endpoints - supports the Gzip compression. - :param org: organization name (used as a default in Query, Write and Delete API) - :key bool verify_ssl: Set this to false to skip verifying SSL certificate when calling API from https server. - :key str ssl_ca_cert: Set this to customize the certificate file to verify the peer. - :key str cert_file: Path to the certificate that will be used for mTLS authentication. - :key str cert_key_file: Path to the file contains private key for mTLS certificate. - :key str cert_key_password: String or function which returns password for decrypting the mTLS private key. - :key ssl.SSLContext ssl_context: Specify a custom Python SSL Context for the TLS/ mTLS handshake. - Be aware that only delivered certificate/ key files or an SSL Context are - possible. - :key str proxy: Set this to configure the http proxy to be used (ex. http://localhost:3128) - :key str proxy_headers: A dictionary containing headers that will be sent to the proxy. Could be used for proxy - authentication. - :key int connection_pool_maxsize: Number of connections to save that can be reused by urllib3. - Defaults to "multiprocessing.cpu_count() * 5". - :key urllib3.util.retry.Retry retries: Set the default retry strategy that is used for all HTTP requests - except batching writes. As a default there is no one retry strategy. - :key bool auth_basic: Set this to true to enable basic authentication when talking to a InfluxDB 1.8.x that - does not use auth-enabled but is protected by a reverse proxy with basic authentication. - (defaults to false, don't set to true when talking to InfluxDB 2) - :key str username: ``username`` to authenticate via username and password credentials to the InfluxDB 2.x - :key str password: ``password`` to authenticate via username and password credentials to the InfluxDB 2.x - :key list[str] profilers: list of enabled Flux profilers - """ - super().__init__(url=url, token=token, debug=debug, timeout=timeout, enable_gzip=enable_gzip, org=org, - default_tags=default_tags, http_client_logger="urllib3", **kwargs) - - from .._sync.api_client import ApiClient - self.api_client = ApiClient(configuration=self.conf, header_name=self.auth_header_name, - header_value=self.auth_header_value, retries=self.retries) - - def __enter__(self): - """ - Enter the runtime context related to this object. - - It will bind this method’s return value to the target(s) - specified in the `as` clause of the statement. - - return: self instance - """ - return self - - def __exit__(self, exc_type, exc_value, traceback): - """Exit the runtime context related to this object and close the client.""" - self.close() - - @classmethod - def from_config_file(cls, config_file: str = "config.ini", debug=None, enable_gzip=False, **kwargs): - """ - Configure client via configuration file. The configuration has to be under 'influx' section. - - :param config_file: Path to configuration file - :param debug: Enable verbose logging of http requests - :param enable_gzip: Enable Gzip compression for http requests. Currently, only the "Write" and "Query" endpoints - supports the Gzip compression. - :key config_name: Name of the configuration section of the configuration file - :key str proxy_headers: A dictionary containing headers that will be sent to the proxy. Could be used for proxy - authentication. - :key urllib3.util.retry.Retry retries: Set the default retry strategy that is used for all HTTP requests - except batching writes. As a default there is no one retry strategy. - :key ssl.SSLContext ssl_context: Specify a custom Python SSL Context for the TLS/ mTLS handshake. - Be aware that only delivered certificate/ key files or an SSL Context are - possible. - - The supported formats: - - https://docs.python.org/3/library/configparser.html - - https://toml.io/en/ - - https://www.json.org/json-en.html - - Configuration options: - - url - - org - - token - - timeout, - - verify_ssl - - ssl_ca_cert - - cert_file - - cert_key_file - - cert_key_password - - connection_pool_maxsize - - auth_basic - - profilers - - proxy - - - config.ini example:: - - [influx2] - url=http://localhost:8086 - org=my-org - token=my-token - timeout=6000 - connection_pool_maxsize=25 - auth_basic=false - profilers=query,operator - proxy=http:proxy.domain.org:8080 - - [tags] - id = 132-987-655 - customer = California Miner - data_center = ${env.data_center} - - config.toml example:: - - [influx2] - url = "http://localhost:8086" - token = "my-token" - org = "my-org" - timeout = 6000 - connection_pool_maxsize = 25 - auth_basic = false - profilers="query, operator" - proxy = "http://proxy.domain.org:8080" - - [tags] - id = "132-987-655" - customer = "California Miner" - data_center = "${env.data_center}" - - config.json example:: - - { - "url": "http://localhost:8086", - "token": "my-token", - "org": "my-org", - "active": true, - "timeout": 6000, - "connection_pool_maxsize": 55, - "auth_basic": false, - "profilers": "query, operator", - "tags": { - "id": "132-987-655", - "customer": "California Miner", - "data_center": "${env.data_center}" - } - } - - """ - return InfluxDBClient._from_config_file(config_file=config_file, debug=debug, enable_gzip=enable_gzip, **kwargs) - - @classmethod - def from_env_properties(cls, debug=None, enable_gzip=False, **kwargs): - """ - Configure client via environment properties. - - :param debug: Enable verbose logging of http requests - :param enable_gzip: Enable Gzip compression for http requests. Currently, only the "Write" and "Query" endpoints - supports the Gzip compression. - :key str proxy: Set this to configure the http proxy to be used (ex. http://localhost:3128) - :key str proxy_headers: A dictionary containing headers that will be sent to the proxy. Could be used for proxy - authentication. - :key urllib3.util.retry.Retry retries: Set the default retry strategy that is used for all HTTP requests - except batching writes. As a default there is no one retry strategy. - :key ssl.SSLContext ssl_context: Specify a custom Python SSL Context for the TLS/ mTLS handshake. - Be aware that only delivered certificate/ key files or an SSL Context are - possible. - - Supported environment properties: - - INFLUXDB_V2_URL - - INFLUXDB_V2_ORG - - INFLUXDB_V2_TOKEN - - INFLUXDB_V2_TIMEOUT - - INFLUXDB_V2_VERIFY_SSL - - INFLUXDB_V2_SSL_CA_CERT - - INFLUXDB_V2_CERT_FILE - - INFLUXDB_V2_CERT_KEY_FILE - - INFLUXDB_V2_CERT_KEY_PASSWORD - - INFLUXDB_V2_CONNECTION_POOL_MAXSIZE - - INFLUXDB_V2_AUTH_BASIC - - INFLUXDB_V2_PROFILERS - - INFLUXDB_V2_TAG - """ - return InfluxDBClient._from_env_properties(debug=debug, enable_gzip=enable_gzip, **kwargs) - - def write_api(self, write_options=WriteOptions(), point_settings=PointSettings(), **kwargs) -> WriteApi: - """ - Create Write API instance. - - Example: - .. code-block:: python - - from influxdb_client import InfluxDBClient - from influxdb_client.client.write_api import SYNCHRONOUS - - - # Initialize SYNCHRONOUS instance of WriteApi - with InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org") as client: - write_api = client.write_api(write_options=SYNCHRONOUS) - - If you would like to use a **background batching**, you have to configure client like this: - - .. code-block:: python - - from influxdb_client import InfluxDBClient - - # Initialize background batching instance of WriteApi - with InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org") as client: - with client.write_api() as write_api: - pass - - There is also possibility to use callbacks to notify about state of background batches: - - .. code-block:: python - - from influxdb_client import InfluxDBClient - from influxdb_client.client.exceptions import InfluxDBError - - - class BatchingCallback(object): - - def success(self, conf: (str, str, str), data: str): - print(f"Written batch: {conf}, data: {data}") - - def error(self, conf: (str, str, str), data: str, exception: InfluxDBError): - print(f"Cannot write batch: {conf}, data: {data} due: {exception}") - - def retry(self, conf: (str, str, str), data: str, exception: InfluxDBError): - print(f"Retryable error occurs for batch: {conf}, data: {data} retry: {exception}") - - - with InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org") as client: - callback = BatchingCallback() - with client.write_api(success_callback=callback.success, - error_callback=callback.error, - retry_callback=callback.retry) as write_api: - pass - - :param write_options: Write API configuration - :param point_settings: settings to store default tags - :key success_callback: The callable ``callback`` to run after having successfully written a batch. - - The callable must accept two arguments: - - `Tuple`: ``(bucket, organization, precision)`` - - `str`: written data - - **[batching mode]** - - :key error_callback: The callable ``callback`` to run after having unsuccessfully written a batch. - - The callable must accept three arguments: - - `Tuple`: ``(bucket, organization, precision)`` - - `str`: written data - - `Exception`: an occurred error - - **[batching mode]** - :key retry_callback: The callable ``callback`` to run after retryable error occurred. - - The callable must accept three arguments: - - `Tuple`: ``(bucket, organization, precision)`` - - `str`: written data - - `Exception`: an retryable error - - **[batching mode]** - :return: write api instance - """ - return WriteApi(influxdb_client=self, write_options=write_options, point_settings=point_settings, **kwargs) - - def query_api(self, query_options: QueryOptions = QueryOptions()) -> QueryApi: - """ - Create an Query API instance. - - :param query_options: optional query api configuration - :return: Query api instance - """ - return QueryApi(self, query_options) - - def invokable_scripts_api(self) -> InvokableScriptsApi: - """ - Create an InvokableScripts API instance. - - :return: InvokableScripts API instance - """ - return InvokableScriptsApi(self) - - def close(self): - """Shutdown the client.""" - self.__del__() - - def __del__(self): - """Shutdown the client.""" - if self.api_client: - self.api_client.__del__() - self.api_client = None - - def buckets_api(self) -> BucketsApi: - """ - Create the Bucket API instance. - - :return: buckets api - """ - return BucketsApi(self) - - def authorizations_api(self) -> AuthorizationsApi: - """ - Create the Authorizations API instance. - - :return: authorizations api - """ - return AuthorizationsApi(self) - - def users_api(self) -> UsersApi: - """ - Create the Users API instance. - - :return: users api - """ - return UsersApi(self) - - def organizations_api(self) -> OrganizationsApi: - """ - Create the Organizations API instance. - - :return: organizations api - """ - return OrganizationsApi(self) - - def tasks_api(self) -> TasksApi: - """ - Create the Tasks API instance. - - :return: tasks api - """ - return TasksApi(self) - - def labels_api(self) -> LabelsApi: - """ - Create the Labels API instance. - - :return: labels api - """ - return LabelsApi(self) - - def health(self) -> HealthCheck: - """ - Get the health of an instance. - - :return: HealthCheck - """ - warnings.warn("This method is deprecated. Call 'ping()' instead.", DeprecationWarning) - health_service = HealthService(self.api_client) - - try: - health = health_service.get_health() - return health - except Exception as e: - return HealthCheck(name="influxdb", message=str(e), status="fail") - - def ping(self) -> bool: - """ - Return the status of InfluxDB instance. - - :return: The status of InfluxDB. - """ - ping_service = PingService(self.api_client) - - try: - ping_service.get_ping() - return True - except Exception as ex: - logger.debug("Unexpected error during /ping: %s", ex) - return False - - def version(self) -> str: - """ - Return the version of the connected InfluxDB Server. - - :return: The version of InfluxDB. - """ - ping_service = PingService(self.api_client) - - response = ping_service.get_ping_with_http_info(_return_http_data_only=False) - - return ping_service.response_header(response) - - def build(self) -> str: - """ - Return the build type of the connected InfluxDB Server. - - :return: The type of InfluxDB build. - """ - ping_service = PingService(self.api_client) - - return ping_service.build_type() - - def ready(self) -> Ready: - """ - Get The readiness of the InfluxDB 2.0. - - :return: Ready - """ - ready_service = ReadyService(self.api_client) - return ready_service.get_ready() - - def delete_api(self) -> DeleteApi: - """ - Get the delete metrics API instance. - - :return: delete api - """ - return DeleteApi(self) diff --git a/frogpilot/third_party/influxdb_client/client/influxdb_client_async.py b/frogpilot/third_party/influxdb_client/client/influxdb_client_async.py deleted file mode 100644 index a8a2d1734..000000000 --- a/frogpilot/third_party/influxdb_client/client/influxdb_client_async.py +++ /dev/null @@ -1,301 +0,0 @@ -"""InfluxDBClientAsync is client for API defined in https://github.com/influxdata/openapi/blob/master/contracts/oss.yml.""" # noqa: E501 -import logging -import sys - -from influxdb_client import PingService -from influxdb_client.client._base import _BaseClient -from influxdb_client.client.delete_api_async import DeleteApiAsync -from influxdb_client.client.query_api import QueryOptions -from influxdb_client.client.query_api_async import QueryApiAsync -from influxdb_client.client.write_api import PointSettings -from influxdb_client.client.write_api_async import WriteApiAsync - -logger = logging.getLogger('influxdb_client.client.influxdb_client_async') - - -class InfluxDBClientAsync(_BaseClient): - """InfluxDBClientAsync is client for InfluxDB v2.""" - - def __init__(self, url, token: str = None, org: str = None, debug=None, timeout=10_000, enable_gzip=False, - **kwargs) -> None: - """ - Initialize defaults. - - :param url: InfluxDB server API url (ex. http://localhost:8086). - :param token: ``token`` to authenticate to the InfluxDB 2.x - :param org: organization name (used as a default in Query, Write and Delete API) - :param debug: enable verbose logging of http requests - :param timeout: The maximal number of milliseconds for the whole HTTP request including - connection establishment, request sending and response reading. - It can also be a :class:`~aiohttp.ClientTimeout` which is directly pass to ``aiohttp``. - :param enable_gzip: Enable Gzip compression for http requests. Currently, only the "Write" and "Query" endpoints - supports the Gzip compression. - :key bool verify_ssl: Set this to false to skip verifying SSL certificate when calling API from https server. - :key str ssl_ca_cert: Set this to customize the certificate file to verify the peer. - :key str cert_file: Path to the certificate that will be used for mTLS authentication. - :key str cert_key_file: Path to the file contains private key for mTLS certificate. - :key str cert_key_password: String or function which returns password for decrypting the mTLS private key. - :key ssl.SSLContext ssl_context: Specify a custom Python SSL Context for the TLS/ mTLS handshake. - Be aware that only delivered certificate/ key files or an SSL Context are - possible. - :key str proxy: Set this to configure the http proxy to be used (ex. http://localhost:3128) - :key str proxy_headers: A dictionary containing headers that will be sent to the proxy. Could be used for proxy - authentication. - :key int connection_pool_maxsize: The total number of simultaneous connections. - Defaults to "multiprocessing.cpu_count() * 5". - :key bool auth_basic: Set this to true to enable basic authentication when talking to a InfluxDB 1.8.x that - does not use auth-enabled but is protected by a reverse proxy with basic authentication. - (defaults to false, don't set to true when talking to InfluxDB 2) - :key str username: ``username`` to authenticate via username and password credentials to the InfluxDB 2.x - :key str password: ``password`` to authenticate via username and password credentials to the InfluxDB 2.x - :key bool allow_redirects: If set to ``False``, do not follow HTTP redirects. ``True`` by default. - :key int max_redirects: Maximum number of HTTP redirects to follow. ``10`` by default. - :key dict client_session_kwargs: Additional configuration arguments for :class:`~aiohttp.ClientSession` - :key type client_session_type: Type of aiohttp client to use. Useful for third party wrappers like - ``aiohttp-retry``. :class:`~aiohttp.ClientSession` by default. - :key list[str] profilers: list of enabled Flux profilers - """ - super().__init__(url=url, token=token, org=org, debug=debug, timeout=timeout, enable_gzip=enable_gzip, - http_client_logger="aiohttp.client", **kwargs) - - # compatibility with Python 3.6 - if sys.version_info[:2] >= (3, 7): - from asyncio import get_running_loop - else: - from asyncio import _get_running_loop as get_running_loop - - # check present asynchronous context - try: - loop = get_running_loop() - # compatibility with Python 3.6 - if loop is None: - raise RuntimeError('no running event loop') - except RuntimeError: - from influxdb_client.client.exceptions import InfluxDBError - message = "The async client should be initialised inside async coroutine " \ - "otherwise there can be unexpected behaviour." - raise InfluxDBError(response=None, message=message) - - from .._async.api_client import ApiClientAsync - self.api_client = ApiClientAsync(configuration=self.conf, header_name=self.auth_header_name, - header_value=self.auth_header_value, **kwargs) - - async def __aenter__(self) -> 'InfluxDBClientAsync': - """ - Enter the runtime context related to this object. - - return: self instance - """ - return self - - async def __aexit__(self, exc_type, exc, tb) -> None: - """Shutdown the client.""" - await self.close() - - async def close(self): - """Shutdown the client.""" - if self.api_client: - await self.api_client.close() - self.api_client = None - - @classmethod - def from_config_file(cls, config_file: str = "config.ini", debug=None, enable_gzip=False, **kwargs): - """ - Configure client via configuration file. The configuration has to be under 'influx' section. - - :param config_file: Path to configuration file - :param debug: Enable verbose logging of http requests - :param enable_gzip: Enable Gzip compression for http requests. Currently, only the "Write" and "Query" endpoints - supports the Gzip compression. - :key config_name: Name of the configuration section of the configuration file - :key str proxy_headers: A dictionary containing headers that will be sent to the proxy. Could be used for proxy - authentication. - :key urllib3.util.retry.Retry retries: Set the default retry strategy that is used for all HTTP requests - except batching writes. As a default there is no one retry strategy. - :key ssl.SSLContext ssl_context: Specify a custom Python SSL Context for the TLS/ mTLS handshake. - Be aware that only delivered certificate/ key files or an SSL Context are - possible. - - The supported formats: - - https://docs.python.org/3/library/configparser.html - - https://toml.io/en/ - - https://www.json.org/json-en.html - - Configuration options: - - url - - org - - token - - timeout, - - verify_ssl - - ssl_ca_cert - - cert_file - - cert_key_file - - cert_key_password - - connection_pool_maxsize - - auth_basic - - profilers - - proxy - - - config.ini example:: - - [influx2] - url=http://localhost:8086 - org=my-org - token=my-token - timeout=6000 - connection_pool_maxsize=25 - auth_basic=false - profilers=query,operator - proxy=http:proxy.domain.org:8080 - - [tags] - id = 132-987-655 - customer = California Miner - data_center = ${env.data_center} - - config.toml example:: - - [influx2] - url = "http://localhost:8086" - token = "my-token" - org = "my-org" - timeout = 6000 - connection_pool_maxsize = 25 - auth_basic = false - profilers="query, operator" - proxy = "http://proxy.domain.org:8080" - - [tags] - id = "132-987-655" - customer = "California Miner" - data_center = "${env.data_center}" - - config.json example:: - - { - "url": "http://localhost:8086", - "token": "my-token", - "org": "my-org", - "active": true, - "timeout": 6000, - "connection_pool_maxsize": 55, - "auth_basic": false, - "profilers": "query, operator", - "tags": { - "id": "132-987-655", - "customer": "California Miner", - "data_center": "${env.data_center}" - } - } - - """ - return InfluxDBClientAsync._from_config_file(config_file=config_file, debug=debug, - enable_gzip=enable_gzip, **kwargs) - - @classmethod - def from_env_properties(cls, debug=None, enable_gzip=False, **kwargs): - """ - Configure client via environment properties. - - :param debug: Enable verbose logging of http requests - :param enable_gzip: Enable Gzip compression for http requests. Currently, only the "Write" and "Query" endpoints - supports the Gzip compression. - :key str proxy: Set this to configure the http proxy to be used (ex. http://localhost:3128) - :key str proxy_headers: A dictionary containing headers that will be sent to the proxy. Could be used for proxy - authentication. - :key urllib3.util.retry.Retry retries: Set the default retry strategy that is used for all HTTP requests - except batching writes. As a default there is no one retry strategy. - :key ssl.SSLContext ssl_context: Specify a custom Python SSL Context for the TLS/ mTLS handshake. - Be aware that only delivered certificate/ key files or an SSL Context are - possible. - - - Supported environment properties: - - INFLUXDB_V2_URL - - INFLUXDB_V2_ORG - - INFLUXDB_V2_TOKEN - - INFLUXDB_V2_TIMEOUT - - INFLUXDB_V2_VERIFY_SSL - - INFLUXDB_V2_SSL_CA_CERT - - INFLUXDB_V2_CERT_FILE - - INFLUXDB_V2_CERT_KEY_FILE - - INFLUXDB_V2_CERT_KEY_PASSWORD - - INFLUXDB_V2_CONNECTION_POOL_MAXSIZE - - INFLUXDB_V2_AUTH_BASIC - - INFLUXDB_V2_PROFILERS - - INFLUXDB_V2_TAG - """ - return InfluxDBClientAsync._from_env_properties(debug=debug, enable_gzip=enable_gzip, **kwargs) - - async def ping(self) -> bool: - """ - Return the status of InfluxDB instance. - - :return: The status of InfluxDB. - """ - ping_service = PingService(self.api_client) - - try: - await ping_service.get_ping_async() - return True - except Exception as ex: - logger.debug("Unexpected error during /ping: %s", ex) - raise ex - - async def version(self) -> str: - """ - Return the version of the connected InfluxDB Server. - - :return: The version of InfluxDB. - """ - ping_service = PingService(self.api_client) - - response = await ping_service.get_ping_async(_return_http_data_only=False) - return ping_service.response_header(response) - - async def build(self) -> str: - """ - Return the build type of the connected InfluxDB Server. - - :return: The type of InfluxDB build. - """ - ping_service = PingService(self.api_client) - - return await ping_service.build_type_async() - - def query_api(self, query_options: QueryOptions = QueryOptions()) -> QueryApiAsync: - """ - Create an asynchronous Query API instance. - - :param query_options: optional query api configuration - :return: Query api instance - """ - return QueryApiAsync(self, query_options) - - def write_api(self, point_settings=PointSettings()) -> WriteApiAsync: - """ - Create an asynchronous Write API instance. - - Example: - .. code-block:: python - - from influxdb_client_async import InfluxDBClientAsync - - - # Initialize async/await instance of Write API - async with InfluxDBClientAsync(url="http://localhost:8086", token="my-token", org="my-org") as client: - write_api = client.write_api() - - :param point_settings: settings to store default tags - :return: write api instance - """ - return WriteApiAsync(influxdb_client=self, point_settings=point_settings) - - def delete_api(self) -> DeleteApiAsync: - """ - Get the asynchronous delete metrics API instance. - - :return: delete api - """ - return DeleteApiAsync(self) diff --git a/frogpilot/third_party/influxdb_client/client/invokable_scripts_api.py b/frogpilot/third_party/influxdb_client/client/invokable_scripts_api.py deleted file mode 100644 index cf5df2807..000000000 --- a/frogpilot/third_party/influxdb_client/client/invokable_scripts_api.py +++ /dev/null @@ -1,293 +0,0 @@ -""" -Use API invokable scripts to create custom InfluxDB API endpoints that query, process, and shape data. - -API invokable scripts let you assign scripts to API endpoints and then execute them as standard REST operations -in InfluxDB Cloud. -""" - -from typing import List, Iterator, Generator, Any - -from influxdb_client import Script, InvokableScriptsService, ScriptCreateRequest, ScriptUpdateRequest, \ - ScriptInvocationParams -from influxdb_client.client._base import _BaseQueryApi -from influxdb_client.client.flux_csv_parser import FluxResponseMetadataMode -from influxdb_client.client.flux_table import FluxRecord, TableList, CSVIterator - - -class InvokableScriptsApi(_BaseQueryApi): - """Use API invokable scripts to create custom InfluxDB API endpoints that query, process, and shape data.""" - - def __init__(self, influxdb_client): - """Initialize defaults.""" - self._influxdb_client = influxdb_client - self._invokable_scripts_service = InvokableScriptsService(influxdb_client.api_client) - - def create_script(self, create_request: ScriptCreateRequest) -> Script: - """Create a script. - - :param ScriptCreateRequest create_request: The script to create. (required) - :return: The created script. - """ - return self._invokable_scripts_service.post_scripts(script_create_request=create_request) - - def update_script(self, script_id: str, update_request: ScriptUpdateRequest) -> Script: - """Update a script. - - :param str script_id: The ID of the script to update. (required) - :param ScriptUpdateRequest update_request: Script updates to apply (required) - :return: The updated. - """ - return self._invokable_scripts_service.patch_scripts_id(script_id=script_id, - script_update_request=update_request) - - def delete_script(self, script_id: str) -> None: - """Delete a script. - - :param str script_id: The ID of the script to delete. (required) - :return: None - """ - self._invokable_scripts_service.delete_scripts_id(script_id=script_id) - - def find_scripts(self, **kwargs): - """List scripts. - - :key int limit: The number of scripts to return. - :key int offset: The offset for pagination. - :return: List of scripts. - :rtype: list[Script] - """ - return self._invokable_scripts_service.get_scripts(**kwargs).scripts - - def invoke_script(self, script_id: str, params: dict = None) -> TableList: - """ - Invoke synchronously a script and return result as a TableList. - - The bind parameters referenced in the script are substitutes with `params` key-values sent in the request body. - - :param str script_id: The ID of the script to invoke. (required) - :param params: bind parameters - :return: :class:`~influxdb_client.client.flux_table.FluxTable` list wrapped into - :class:`~influxdb_client.client.flux_table.TableList` - :rtype: TableList - - Serialization the query results to flattened list of values via :func:`~influxdb_client.client.flux_table.TableList.to_values`: - - .. code-block:: python - - from influxdb_client import InfluxDBClient - - with InfluxDBClient(url="https://us-west-2-1.aws.cloud2.influxdata.com", token="my-token", org="my-org") as client: - - # Query: using Table structure - tables = client.invokable_scripts_api().invoke_script(script_id="script-id") - - # Serialize to values - output = tables.to_values(columns=['location', '_time', '_value']) - print(output) - - .. code-block:: python - - [ - ['New York', datetime.datetime(2022, 6, 7, 11, 3, 22, 917593, tzinfo=tzutc()), 24.3], - ['Prague', datetime.datetime(2022, 6, 7, 11, 3, 22, 917593, tzinfo=tzutc()), 25.3], - ... - ] - - Serialization the query results to JSON via :func:`~influxdb_client.client.flux_table.TableList.to_json`: - - .. code-block:: python - - from influxdb_client import InfluxDBClient - - with InfluxDBClient(url="https://us-west-2-1.aws.cloud2.influxdata.com", token="my-token", org="my-org") as client: - - # Query: using Table structure - tables = client.invokable_scripts_api().invoke_script(script_id="script-id") - - # Serialize to JSON - output = tables.to_json(indent=5) - print(output) - - .. code-block:: javascript - - [ - { - "_measurement": "mem", - "_start": "2021-06-23T06:50:11.897825+00:00", - "_stop": "2021-06-25T06:50:11.897825+00:00", - "_time": "2020-02-27T16:20:00.897825+00:00", - "region": "north", - "_field": "usage", - "_value": 15 - }, - { - "_measurement": "mem", - "_start": "2021-06-23T06:50:11.897825+00:00", - "_stop": "2021-06-25T06:50:11.897825+00:00", - "_time": "2020-02-27T16:20:01.897825+00:00", - "region": "west", - "_field": "usage", - "_value": 10 - }, - ... - ] - """ # noqa: E501 - response = self._invokable_scripts_service \ - .post_scripts_id_invoke(script_id=script_id, - script_invocation_params=ScriptInvocationParams(params=params), - async_req=False, - _preload_content=False, - _return_http_data_only=False) - return self._to_tables(response, query_options=None, response_metadata_mode=FluxResponseMetadataMode.only_names) - - def invoke_script_stream(self, script_id: str, params: dict = None) -> Generator['FluxRecord', Any, None]: - """ - Invoke synchronously a script and return result as a Generator['FluxRecord']. - - The bind parameters referenced in the script are substitutes with `params` key-values sent in the request body. - - :param str script_id: The ID of the script to invoke. (required) - :param params: bind parameters - :return: Stream of FluxRecord. - :rtype: Generator['FluxRecord'] - """ - response = self._invokable_scripts_service \ - .post_scripts_id_invoke(script_id=script_id, - script_invocation_params=ScriptInvocationParams(params=params), - async_req=False, - _preload_content=False, - _return_http_data_only=False) - - return self._to_flux_record_stream(response, query_options=None, - response_metadata_mode=FluxResponseMetadataMode.only_names) - - def invoke_script_data_frame(self, script_id: str, params: dict = None, data_frame_index: List[str] = None): - """ - Invoke synchronously a script and return Pandas DataFrame. - - The bind parameters referenced in the script are substitutes with `params` key-values sent in the request body. - - .. note:: If the ``script`` returns tables with differing schemas than the client generates a :class:`~DataFrame` for each of them. - - :param str script_id: The ID of the script to invoke. (required) - :param List[str] data_frame_index: The list of columns that are used as DataFrame index. - :param params: bind parameters - :return: :class:`~DataFrame` or :class:`~List[DataFrame]` - - .. warning:: For the optimal processing of the query results use the ``pivot() function`` which align results as a table. - - .. code-block:: text - - from(bucket:"my-bucket") - |> range(start: -5m, stop: now()) - |> filter(fn: (r) => r._measurement == "mem") - |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") - - For more info see: - - https://docs.influxdata.com/resources/videos/pivots-in-flux/ - - https://docs.influxdata.com/flux/latest/stdlib/universe/pivot/ - - https://docs.influxdata.com/flux/latest/stdlib/influxdata/influxdb/schema/fieldsascols/ - """ # noqa: E501 - _generator = self.invoke_script_data_frame_stream(script_id=script_id, - params=params, - data_frame_index=data_frame_index) - return self._to_data_frames(_generator) - - def invoke_script_data_frame_stream(self, script_id: str, params: dict = None, data_frame_index: List[str] = None): - """ - Invoke synchronously a script and return stream of Pandas DataFrame as a Generator['pd.DataFrame']. - - The bind parameters referenced in the script are substitutes with `params` key-values sent in the request body. - - .. note:: If the ``script`` returns tables with differing schemas than the client generates a :class:`~DataFrame` for each of them. - - :param str script_id: The ID of the script to invoke. (required) - :param List[str] data_frame_index: The list of columns that are used as DataFrame index. - :param params: bind parameters - :return: :class:`~Generator[DataFrame]` - - .. warning:: For the optimal processing of the query results use the ``pivot() function`` which align results as a table. - - .. code-block:: text - - from(bucket:"my-bucket") - |> range(start: -5m, stop: now()) - |> filter(fn: (r) => r._measurement == "mem") - |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") - - For more info see: - - https://docs.influxdata.com/resources/videos/pivots-in-flux/ - - https://docs.influxdata.com/flux/latest/stdlib/universe/pivot/ - - https://docs.influxdata.com/flux/latest/stdlib/influxdata/influxdb/schema/fieldsascols/ - """ # noqa: E501 - response = self._invokable_scripts_service \ - .post_scripts_id_invoke(script_id=script_id, - script_invocation_params=ScriptInvocationParams(params=params), - async_req=False, - _preload_content=False, - _return_http_data_only=False) - - return self._to_data_frame_stream(data_frame_index, response, query_options=None, - response_metadata_mode=FluxResponseMetadataMode.only_names) - - def invoke_script_csv(self, script_id: str, params: dict = None) -> CSVIterator: - """ - Invoke synchronously a script and return result as a CSV iterator. Each iteration returns a row of the CSV file. - - The bind parameters referenced in the script are substitutes with `params` key-values sent in the request body. - - :param str script_id: The ID of the script to invoke. (required) - :param params: bind parameters - :return: :class:`~Iterator[List[str]]` wrapped into :class:`~influxdb_client.client.flux_table.CSVIterator` - :rtype: CSVIterator - - Serialization the query results to flattened list of values via :func:`~influxdb_client.client.flux_table.CSVIterator.to_values`: - - .. code-block:: python - - from influxdb_client import InfluxDBClient - - with InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org") as client: - - # Query: using CSV iterator - csv_iterator = client.invokable_scripts_api().invoke_script_csv(script_id="script-id") - - # Serialize to values - output = csv_iterator.to_values() - print(output) - - .. code-block:: python - - [ - ['', 'result', 'table', '_start', '_stop', '_time', '_value', '_field', '_measurement', 'location'] - ['', '', '0', '2022-06-16', '2022-06-16', '2022-06-16', '24.3', 'temperature', 'my_measurement', 'New York'] - ['', '', '1', '2022-06-16', '2022-06-16', '2022-06-16', '25.3', 'temperature', 'my_measurement', 'Prague'] - ... - ] - - """ # noqa: E501 - response = self._invokable_scripts_service \ - .post_scripts_id_invoke(script_id=script_id, - script_invocation_params=ScriptInvocationParams(params=params), - async_req=False, - _preload_content=False) - - return self._to_csv(response) - - def invoke_script_raw(self, script_id: str, params: dict = None) -> Iterator[List[str]]: - """ - Invoke synchronously a script and return result as raw unprocessed result as a str. - - The bind parameters referenced in the script are substitutes with `params` key-values sent in the request body. - - :param str script_id: The ID of the script to invoke. (required) - :param params: bind parameters - :return: Result as a str. - """ - response = self._invokable_scripts_service \ - .post_scripts_id_invoke(script_id=script_id, - script_invocation_params=ScriptInvocationParams(params=params), - async_req=False, - _preload_content=True) - - return response diff --git a/frogpilot/third_party/influxdb_client/client/labels_api.py b/frogpilot/third_party/influxdb_client/client/labels_api.py deleted file mode 100644 index 006cb90c2..000000000 --- a/frogpilot/third_party/influxdb_client/client/labels_api.py +++ /dev/null @@ -1,96 +0,0 @@ -"""Labels are a way to add visual metadata to dashboards, tasks, and other items in the InfluxDB UI.""" - -from typing import List, Dict, Union - -from influxdb_client import LabelsService, LabelCreateRequest, Label, LabelUpdate - - -class LabelsApi(object): - """Implementation for '/api/v2/labels' endpoint.""" - - def __init__(self, influxdb_client): - """Initialize defaults.""" - self._influxdb_client = influxdb_client - self._service = LabelsService(influxdb_client.api_client) - - def create_label(self, name: str, org_id: str, properties: Dict[str, str] = None) -> Label: - """ - Create a new label. - - :param name: label name - :param org_id: organization id - :param properties: optional label properties - :return: created label - """ - label_request = LabelCreateRequest(org_id=org_id, name=name, properties=properties) - return self._service.post_labels(label_create_request=label_request).label - - def update_label(self, label: Label): - """ - Update an existing label name and properties. - - :param label: label - :return: the updated label - """ - label_update = LabelUpdate() - label_update.properties = label.properties - label_update.name = label.name - return self._service.patch_labels_id(label_id=label.id, label_update=label_update).label - - def delete_label(self, label: Union[str, Label]): - """ - Delete the label. - - :param label: label id or Label - """ - label_id = None - - if isinstance(label, str): - label_id = label - - if isinstance(label, Label): - label_id = label.id - - return self._service.delete_labels_id(label_id=label_id) - - def clone_label(self, cloned_name: str, label: Label) -> Label: - """ - Create the new instance of the label as a copy existing label. - - :param cloned_name: new label name - :param label: existing label - :return: clonned Label - """ - cloned_properties = None - if label.properties is not None: - cloned_properties = label.properties.copy() - - return self.create_label(name=cloned_name, properties=cloned_properties, org_id=label.org_id) - - def find_labels(self, **kwargs) -> List['Label']: - """ - Get all available labels. - - :key str org_id: The organization ID. - - :return: labels - """ - return self._service.get_labels(**kwargs).labels - - def find_label_by_id(self, label_id: str): - """ - Retrieve the label by id. - - :param label_id: - :return: Label - """ - return self._service.get_labels_id(label_id=label_id).label - - def find_label_by_org(self, org_id) -> List['Label']: - """ - Get the list of all labels for given organization. - - :param org_id: organization id - :return: list of labels - """ - return self._service.get_labels(org_id=org_id).labels diff --git a/frogpilot/third_party/influxdb_client/client/logging_handler.py b/frogpilot/third_party/influxdb_client/client/logging_handler.py deleted file mode 100644 index 445a828d5..000000000 --- a/frogpilot/third_party/influxdb_client/client/logging_handler.py +++ /dev/null @@ -1,64 +0,0 @@ -"""Use the influxdb_client with python native logging.""" -import logging - -from influxdb_client import InfluxDBClient - - -class InfluxLoggingHandler(logging.Handler): - """ - InfluxLoggingHandler instances dispatch logging events to influx. - - There is no need to set a Formatter. - The raw input will be passed on to the influx write api. - """ - - DEFAULT_LOG_RECORD_KEYS = list(logging.makeLogRecord({}).__dict__.keys()) + ['message'] - - def __init__(self, *, url, token, org, bucket, client_args=None, write_api_args=None): - """ - Initialize defaults. - - The arguments `client_args` and `write_api_args` can be dicts of kwargs. - They are passed on to the InfluxDBClient and write_api calls respectively. - """ - super().__init__() - - self.bucket = bucket - - client_args = {} if client_args is None else client_args - self.client = InfluxDBClient(url=url, token=token, org=org, **client_args) - - write_api_args = {} if write_api_args is None else write_api_args - self.write_api = self.client.write_api(**write_api_args) - - def __del__(self): - """Make sure all resources are closed.""" - self.close() - - def close(self) -> None: - """Close the write_api, client and logger.""" - self.write_api.close() - self.client.close() - super().close() - - def emit(self, record: logging.LogRecord) -> None: - """Emit a record via the influxDB WriteApi.""" - try: - message = self.format(record) - extra = self._get_extra_values(record) - return self.write_api.write(record=message, **extra) - except (KeyboardInterrupt, SystemExit): - raise - except (Exception,): - self.handleError(record) - - def _get_extra_values(self, record: logging.LogRecord) -> dict: - """ - Extract all items from the record that were injected via extra. - - Example: `logging.debug(msg, extra={key: value, ...})`. - """ - extra = {'bucket': self.bucket} - extra.update({key: value for key, value in record.__dict__.items() - if key not in self.DEFAULT_LOG_RECORD_KEYS}) - return extra diff --git a/frogpilot/third_party/influxdb_client/client/organizations_api.py b/frogpilot/third_party/influxdb_client/client/organizations_api.py deleted file mode 100644 index e25c6989d..000000000 --- a/frogpilot/third_party/influxdb_client/client/organizations_api.py +++ /dev/null @@ -1,60 +0,0 @@ -""" -An organization is a workspace for a group of users. - -All dashboards, tasks, buckets, members, etc., belong to an organization. -""" - -from influxdb_client import OrganizationsService, UsersService, Organization, PatchOrganizationRequest - - -class OrganizationsApi(object): - """Implementation for '/api/v2/orgs' endpoint.""" - - def __init__(self, influxdb_client): - """Initialize defaults.""" - self._influxdb_client = influxdb_client - self._organizations_service = OrganizationsService(influxdb_client.api_client) - self._users_service = UsersService(influxdb_client.api_client) - - def me(self): - """Return the current authenticated user.""" - user = self._users_service.get_me() - return user - - def find_organization(self, org_id): - """Retrieve an organization.""" - return self._organizations_service.get_orgs_id(org_id=org_id) - - def find_organizations(self, **kwargs): - """ - List all organizations. - - :key int offset: Offset for pagination - :key int limit: Limit for pagination - :key bool descending: - :key str org: Filter organizations to a specific organization name. - :key str org_id: Filter organizations to a specific organization ID. - :key str user_id: Filter organizations to a specific user ID. - """ - return self._organizations_service.get_orgs(**kwargs).orgs - - def create_organization(self, name: str = None, organization: Organization = None) -> Organization: - """Create an organization.""" - if organization is None: - organization = Organization(name=name) - return self._organizations_service.post_orgs(post_organization_request=organization) - - def update_organization(self, organization: Organization) -> Organization: - """Update an organization. - - :param organization: Organization update to apply (required) - :return: Organization - """ - request = PatchOrganizationRequest(name=organization.name, - description=organization.description) - - return self._organizations_service.patch_orgs_id(org_id=organization.id, patch_organization_request=request) - - def delete_organization(self, org_id: str): - """Delete an organization.""" - return self._organizations_service.delete_orgs_id(org_id=org_id) diff --git a/frogpilot/third_party/influxdb_client/client/query_api.py b/frogpilot/third_party/influxdb_client/client/query_api.py deleted file mode 100644 index 8611021da..000000000 --- a/frogpilot/third_party/influxdb_client/client/query_api.py +++ /dev/null @@ -1,310 +0,0 @@ -""" -Querying InfluxDB by FluxLang. - -Flux is InfluxData’s functional data scripting language designed for querying, analyzing, and acting on data. -""" - -from typing import List, Generator, Any, Callable - -from influxdb_client import Dialect -from influxdb_client.client._base import _BaseQueryApi -from influxdb_client.client.flux_table import FluxRecord, TableList, CSVIterator - - -class QueryOptions(object): - """Query options.""" - - def __init__(self, profilers: List[str] = None, profiler_callback: Callable = None) -> None: - """ - Initialize query options. - - :param profilers: list of enabled flux profilers - :param profiler_callback: callback function return profilers (FluxRecord) - """ - self.profilers = profilers - self.profiler_callback = profiler_callback - - -class QueryApi(_BaseQueryApi): - """Implementation for '/api/v2/query' endpoint.""" - - def __init__(self, influxdb_client, query_options=QueryOptions()): - """ - Initialize query client. - - :param influxdb_client: influxdb client - """ - super().__init__(influxdb_client=influxdb_client, query_options=query_options) - - def query_csv(self, query: str, org=None, dialect: Dialect = _BaseQueryApi.default_dialect, params: dict = None) \ - -> CSVIterator: - """ - Execute the Flux query and return results as a CSV iterator. Each iteration returns a row of the CSV file. - - :param query: a Flux query - :param str, Organization org: specifies the organization for executing the query; - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClient.org`` is used. - :param dialect: csv dialect format - :param params: bind parameters - :return: :class:`~Iterator[List[str]]` wrapped into :class:`~influxdb_client.client.flux_table.CSVIterator` - :rtype: CSVIterator - - Serialization the query results to flattened list of values via :func:`~influxdb_client.client.flux_table.CSVIterator.to_values`: - - .. code-block:: python - - from influxdb_client import InfluxDBClient - - with InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org") as client: - - # Query: using CSV iterator - csv_iterator = client.query_api().query_csv('from(bucket:"my-bucket") |> range(start: -10m)') - - # Serialize to values - output = csv_iterator.to_values() - print(output) - - .. code-block:: python - - [ - ['#datatype', 'string', 'long', 'dateTime:RFC3339', 'dateTime:RFC3339', 'dateTime:RFC3339', 'double', 'string', 'string', 'string'] - ['#group', 'false', 'false', 'true', 'true', 'false', 'false', 'true', 'true', 'true'] - ['#default', '_result', '', '', '', '', '', '', '', ''] - ['', 'result', 'table', '_start', '_stop', '_time', '_value', '_field', '_measurement', 'location'] - ['', '', '0', '2022-06-16', '2022-06-16', '2022-06-16', '24.3', 'temperature', 'my_measurement', 'New York'] - ['', '', '1', '2022-06-16', '2022-06-16', '2022-06-16', '25.3', 'temperature', 'my_measurement', 'Prague'] - ... - ] - - If you would like to turn off `Annotated CSV header's `_ you can use following code: - - .. code-block:: python - - from influxdb_client import InfluxDBClient, Dialect - - with InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org") as client: - - # Query: using CSV iterator - csv_iterator = client.query_api().query_csv('from(bucket:"my-bucket") |> range(start: -10m)', - dialect=Dialect(header=False, annotations=[])) - - for csv_line in csv_iterator: - print(csv_line) - - .. code-block:: python - - [ - ['', '_result', '0', '2022-06-16', '2022-06-16', '2022-06-16', '24.3', 'temperature', 'my_measurement', 'New York'] - ['', '_result', '1', '2022-06-16', '2022-06-16', '2022-06-16', '25.3', 'temperature', 'my_measurement', 'Prague'] - ... - ] - """ # noqa: E501 - org = self._org_param(org) - response = self._query_api.post_query(org=org, query=self._create_query(query, dialect, params), - async_req=False, _preload_content=False) - - return self._to_csv(response) - - def query_raw(self, query: str, org=None, dialect=_BaseQueryApi.default_dialect, params: dict = None): - """ - Execute synchronous Flux query and return result as raw unprocessed result as a str. - - :param query: a Flux query - :param str, Organization org: specifies the organization for executing the query; - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClient.org`` is used. - :param dialect: csv dialect format - :param params: bind parameters - :return: str - """ - org = self._org_param(org) - result = self._query_api.post_query(org=org, query=self._create_query(query, dialect, params), async_req=False, - _preload_content=False) - - return result - - def query(self, query: str, org=None, params: dict = None) -> TableList: - """Execute synchronous Flux query and return result as a :class:`~influxdb_client.client.flux_table.FluxTable` list. - - :param query: the Flux query - :param str, Organization org: specifies the organization for executing the query; - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClient.org`` is used. - :param params: bind parameters - :return: :class:`~influxdb_client.client.flux_table.FluxTable` list wrapped into - :class:`~influxdb_client.client.flux_table.TableList` - :rtype: TableList - - Serialization the query results to flattened list of values via :func:`~influxdb_client.client.flux_table.TableList.to_values`: - - .. code-block:: python - - from influxdb_client import InfluxDBClient - - with InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org") as client: - - # Query: using Table structure - tables = client.query_api().query('from(bucket:"my-bucket") |> range(start: -10m)') - - # Serialize to values - output = tables.to_values(columns=['location', '_time', '_value']) - print(output) - - .. code-block:: python - - [ - ['New York', datetime.datetime(2022, 6, 7, 11, 3, 22, 917593, tzinfo=tzutc()), 24.3], - ['Prague', datetime.datetime(2022, 6, 7, 11, 3, 22, 917593, tzinfo=tzutc()), 25.3], - ... - ] - - Serialization the query results to JSON via :func:`~influxdb_client.client.flux_table.TableList.to_json`: - - .. code-block:: python - - from influxdb_client import InfluxDBClient - - with InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org") as client: - - # Query: using Table structure - tables = client.query_api().query('from(bucket:"my-bucket") |> range(start: -10m)') - - # Serialize to JSON - output = tables.to_json(indent=5) - print(output) - - .. code-block:: javascript - - [ - { - "_measurement": "mem", - "_start": "2021-06-23T06:50:11.897825+00:00", - "_stop": "2021-06-25T06:50:11.897825+00:00", - "_time": "2020-02-27T16:20:00.897825+00:00", - "region": "north", - "_field": "usage", - "_value": 15 - }, - { - "_measurement": "mem", - "_start": "2021-06-23T06:50:11.897825+00:00", - "_stop": "2021-06-25T06:50:11.897825+00:00", - "_time": "2020-02-27T16:20:01.897825+00:00", - "region": "west", - "_field": "usage", - "_value": 10 - }, - ... - ] - """ # noqa: E501 - org = self._org_param(org) - - response = self._query_api.post_query(org=org, query=self._create_query(query, self.default_dialect, params), - async_req=False, _preload_content=False, _return_http_data_only=False) - - return self._to_tables(response, query_options=self._get_query_options()) - - def query_stream(self, query: str, org=None, params: dict = None) -> Generator['FluxRecord', Any, None]: - """ - Execute synchronous Flux query and return stream of FluxRecord as a Generator['FluxRecord']. - - :param query: the Flux query - :param str, Organization org: specifies the organization for executing the query; - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClient.org`` is used. - :param params: bind parameters - :return: Generator['FluxRecord'] - """ - org = self._org_param(org) - - response = self._query_api.post_query(org=org, query=self._create_query(query, self.default_dialect, params), - async_req=False, _preload_content=False, _return_http_data_only=False) - return self._to_flux_record_stream(response, query_options=self._get_query_options()) - - def query_data_frame(self, query: str, org=None, data_frame_index: List[str] = None, params: dict = None, - use_extension_dtypes: bool = False): - """ - Execute synchronous Flux query and return Pandas DataFrame. - - .. note:: If the ``query`` returns tables with differing schemas than the client generates a :class:`~DataFrame` for each of them. - - :param query: the Flux query - :param str, Organization org: specifies the organization for executing the query; - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClient.org`` is used. - :param data_frame_index: the list of columns that are used as DataFrame index - :param params: bind parameters - :param use_extension_dtypes: set to ``True`` to use panda's extension data types. - Useful for queries with ``pivot`` function. - When data has missing values, column data type may change (to ``object`` or ``float64``). - Nullable extension types (``Int64``, ``Float64``, ``boolean``) support ``panda.NA`` value. - For more info, see https://pandas.pydata.org/docs/user_guide/missing_data.html. - :return: :class:`~DataFrame` or :class:`~List[DataFrame]` - - .. warning:: For the optimal processing of the query results use the ``pivot() function`` which align results as a table. - - .. code-block:: text - - from(bucket:"my-bucket") - |> range(start: -5m, stop: now()) - |> filter(fn: (r) => r._measurement == "mem") - |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") - - For more info see: - - https://docs.influxdata.com/resources/videos/pivots-in-flux/ - - https://docs.influxdata.com/flux/latest/stdlib/universe/pivot/ - - https://docs.influxdata.com/flux/latest/stdlib/influxdata/influxdb/schema/fieldsascols/ - """ # noqa: E501 - _generator = self.query_data_frame_stream(query, org=org, data_frame_index=data_frame_index, params=params, - use_extension_dtypes=use_extension_dtypes) - return self._to_data_frames(_generator) - - def query_data_frame_stream(self, query: str, org=None, data_frame_index: List[str] = None, params: dict = None, - use_extension_dtypes: bool = False): - """ - Execute synchronous Flux query and return stream of Pandas DataFrame as a :class:`~Generator[DataFrame]`. - - .. note:: If the ``query`` returns tables with differing schemas than the client generates a :class:`~DataFrame` for each of them. - - :param query: the Flux query - :param str, Organization org: specifies the organization for executing the query; - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClient.org`` is used. - :param data_frame_index: the list of columns that are used as DataFrame index - :param params: bind parameters - :param use_extension_dtypes: set to ``True`` to use panda's extension data types. - Useful for queries with ``pivot`` function. - When data has missing values, column data type may change (to ``object`` or ``float64``). - Nullable extension types (``Int64``, ``Float64``, ``boolean``) support ``panda.NA`` value. - For more info, see https://pandas.pydata.org/docs/user_guide/missing_data.html. - :return: :class:`~Generator[DataFrame]` - - .. warning:: For the optimal processing of the query results use the ``pivot() function`` which align results as a table. - - .. code-block:: text - - from(bucket:"my-bucket") - |> range(start: -5m, stop: now()) - |> filter(fn: (r) => r._measurement == "mem") - |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") - - For more info see: - - https://docs.influxdata.com/resources/videos/pivots-in-flux/ - - https://docs.influxdata.com/flux/latest/stdlib/universe/pivot/ - - https://docs.influxdata.com/flux/latest/stdlib/influxdata/influxdb/schema/fieldsascols/ - """ # noqa: E501 - org = self._org_param(org) - - response = self._query_api.post_query(org=org, query=self._create_query(query, self.default_dialect, params, - dataframe_query=True), - async_req=False, _preload_content=False, _return_http_data_only=False) - - return self._to_data_frame_stream(data_frame_index=data_frame_index, - response=response, - query_options=self._get_query_options(), - use_extension_dtypes=use_extension_dtypes) - - def __del__(self): - """Close QueryAPI.""" - pass diff --git a/frogpilot/third_party/influxdb_client/client/query_api_async.py b/frogpilot/third_party/influxdb_client/client/query_api_async.py deleted file mode 100644 index b3b42cb4e..000000000 --- a/frogpilot/third_party/influxdb_client/client/query_api_async.py +++ /dev/null @@ -1,236 +0,0 @@ -""" -Querying InfluxDB by FluxLang. - -Flux is InfluxData’s functional data scripting language designed for querying, analyzing, and acting on data. -""" -from typing import List, AsyncGenerator - -from influxdb_client.client._base import _BaseQueryApi -from influxdb_client.client.flux_table import FluxRecord, TableList -from influxdb_client.client.query_api import QueryOptions -from influxdb_client.rest import _UTF_8_encoding, ApiException -from .._async.rest import RESTResponseAsync - - -class QueryApiAsync(_BaseQueryApi): - """Asynchronous implementation for '/api/v2/query' endpoint.""" - - def __init__(self, influxdb_client, query_options=QueryOptions()): - """ - Initialize query client. - - :param influxdb_client: influxdb client - """ - super().__init__(influxdb_client=influxdb_client, query_options=query_options) - - async def query(self, query: str, org=None, params: dict = None) -> TableList: - """ - Execute asynchronous Flux query and return result as a :class:`~influxdb_client.client.flux_table.FluxTable` list. - - :param query: the Flux query - :param str, Organization org: specifies the organization for executing the query; - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClientAsync.org`` is used. - :param params: bind parameters - :return: :class:`~influxdb_client.client.flux_table.FluxTable` list wrapped into - :class:`~influxdb_client.client.flux_table.TableList` - :rtype: TableList - - Serialization the query results to flattened list of values via :func:`~influxdb_client.client.flux_table.TableList.to_values`: - - .. code-block:: python - - from influxdb_client import InfluxDBClient - - async with InfluxDBClientAsync(url="http://localhost:8086", token="my-token", org="my-org") as client: - - # Query: using Table structure - tables = await client.query_api().query('from(bucket:"my-bucket") |> range(start: -10m)') - - # Serialize to values - output = tables.to_values(columns=['location', '_time', '_value']) - print(output) - - .. code-block:: python - - [ - ['New York', datetime.datetime(2022, 6, 7, 11, 3, 22, 917593, tzinfo=tzutc()), 24.3], - ['Prague', datetime.datetime(2022, 6, 7, 11, 3, 22, 917593, tzinfo=tzutc()), 25.3], - ... - ] - - Serialization the query results to JSON via :func:`~influxdb_client.client.flux_table.TableList.to_json`: - - .. code-block:: python - - from influxdb_client.client.influxdb_client_async import InfluxDBClientAsync - - async with InfluxDBClientAsync(url="http://localhost:8086", token="my-token", org="my-org") as client: - # Query: using Table structure - tables = await client.query_api().query('from(bucket:"my-bucket") |> range(start: -10m)') - - # Serialize to JSON - output = tables.to_json(indent=5) - print(output) - - .. code-block:: javascript - - [ - { - "_measurement": "mem", - "_start": "2021-06-23T06:50:11.897825+00:00", - "_stop": "2021-06-25T06:50:11.897825+00:00", - "_time": "2020-02-27T16:20:00.897825+00:00", - "region": "north", - "_field": "usage", - "_value": 15 - }, - { - "_measurement": "mem", - "_start": "2021-06-23T06:50:11.897825+00:00", - "_stop": "2021-06-25T06:50:11.897825+00:00", - "_time": "2020-02-27T16:20:01.897825+00:00", - "region": "west", - "_field": "usage", - "_value": 10 - }, - ... - ] - """ # noqa: E501 - org = self._org_param(org) - - response = await self._post_query(org=org, query=self._create_query(query, self.default_dialect, params)) - - return await self._to_tables_async(response, query_options=self._get_query_options()) - - async def query_stream(self, query: str, org=None, params: dict = None) -> AsyncGenerator['FluxRecord', None]: - """ - Execute asynchronous Flux query and return stream of :class:`~influxdb_client.client.flux_table.FluxRecord` as an AsyncGenerator[:class:`~influxdb_client.client.flux_table.FluxRecord`]. - - :param query: the Flux query - :param str, Organization org: specifies the organization for executing the query; - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClientAsync.org`` is used. - :param params: bind parameters - :return: AsyncGenerator[:class:`~influxdb_client.client.flux_table.FluxRecord`] - """ # noqa: E501 - org = self._org_param(org) - - response = await self._post_query(org=org, query=self._create_query(query, self.default_dialect, params)) - - return await self._to_flux_record_stream_async(response, query_options=self._get_query_options()) - - async def query_data_frame(self, query: str, org=None, data_frame_index: List[str] = None, params: dict = None, - use_extension_dtypes: bool = False): - """ - Execute asynchronous Flux query and return :class:`~pandas.core.frame.DataFrame`. - - .. note:: If the ``query`` returns tables with differing schemas than the client generates a :class:`~DataFrame` for each of them. - - :param query: the Flux query - :param str, Organization org: specifies the organization for executing the query; - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClientAsync.org`` is used. - :param data_frame_index: the list of columns that are used as DataFrame index - :param params: bind parameters - :param use_extension_dtypes: set to ``True`` to use panda's extension data types. - Useful for queries with ``pivot`` function. - When data has missing values, column data type may change (to ``object`` or ``float64``). - Nullable extension types (``Int64``, ``Float64``, ``boolean``) support ``panda.NA`` value. - For more info, see https://pandas.pydata.org/docs/user_guide/missing_data.html. - :return: :class:`~DataFrame` or :class:`~List[DataFrame]` - - .. warning:: For the optimal processing of the query results use the ``pivot() function`` which align results as a table. - - .. code-block:: text - - from(bucket:"my-bucket") - |> range(start: -5m, stop: now()) - |> filter(fn: (r) => r._measurement == "mem") - |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") - - For more info see: - - https://docs.influxdata.com/resources/videos/pivots-in-flux/ - - https://docs.influxdata.com/flux/latest/stdlib/universe/pivot/ - - https://docs.influxdata.com/flux/latest/stdlib/influxdata/influxdb/schema/fieldsascols/ - """ # noqa: E501 - _generator = await self.query_data_frame_stream(query, org=org, data_frame_index=data_frame_index, - params=params, use_extension_dtypes=use_extension_dtypes) - - dataframes = [] - async for dataframe in _generator: - dataframes.append(dataframe) - - return self._to_data_frames(dataframes) - - async def query_data_frame_stream(self, query: str, org=None, data_frame_index: List[str] = None, - params: dict = None, use_extension_dtypes: bool = False): - """ - Execute asynchronous Flux query and return stream of :class:`~pandas.core.frame.DataFrame` as an AsyncGenerator[:class:`~pandas.core.frame.DataFrame`]. - - .. note:: If the ``query`` returns tables with differing schemas than the client generates a :class:`~DataFrame` for each of them. - - :param query: the Flux query - :param str, Organization org: specifies the organization for executing the query; - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClientAsync.org`` is used. - :param data_frame_index: the list of columns that are used as DataFrame index - :param params: bind parameters - :param use_extension_dtypes: set to ``True`` to use panda's extension data types. - Useful for queries with ``pivot`` function. - When data has missing values, column data type may change (to ``object`` or ``float64``). - Nullable extension types (``Int64``, ``Float64``, ``boolean``) support ``panda.NA`` value. - For more info, see https://pandas.pydata.org/docs/user_guide/missing_data.html. - :return: :class:`AsyncGenerator[:class:`DataFrame`]` - - .. warning:: For the optimal processing of the query results use the ``pivot() function`` which align results as a table. - - .. code-block:: text - - from(bucket:"my-bucket") - |> range(start: -5m, stop: now()) - |> filter(fn: (r) => r._measurement == "mem") - |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") - - For more info see: - - https://docs.influxdata.com/resources/videos/pivots-in-flux/ - - https://docs.influxdata.com/flux/latest/stdlib/universe/pivot/ - - https://docs.influxdata.com/flux/latest/stdlib/influxdata/influxdb/schema/fieldsascols/ - """ # noqa: E501 - org = self._org_param(org) - - response = await self._post_query(org=org, query=self._create_query(query, self.default_dialect, params, - dataframe_query=True)) - - return await self._to_data_frame_stream_async(data_frame_index=data_frame_index, response=response, - query_options=self._get_query_options(), - use_extension_dtypes=use_extension_dtypes) - - async def query_raw(self, query: str, org=None, dialect=_BaseQueryApi.default_dialect, params: dict = None): - """ - Execute asynchronous Flux query and return result as raw unprocessed result as a str. - - :param query: a Flux query - :param str, Organization org: specifies the organization for executing the query; - Take the ``ID``, ``Name`` or ``Organization``. - If not specified the default value from ``InfluxDBClientAsync.org`` is used. - :param dialect: csv dialect format - :param params: bind parameters - :return: :class:`~str` - """ - org = self._org_param(org) - result = await self._post_query(org=org, query=self._create_query(query, dialect, params)) - raw_bytes = await result.read() - return raw_bytes.decode(_UTF_8_encoding) - - async def _post_query(self, org, query): - response = await self._query_api.post_query_async(org=org, - query=query, - async_req=False, - _preload_content=False, - _return_http_data_only=True) - if not 200 <= response.status <= 299: - data = await response.read() - raise ApiException(http_resp=RESTResponseAsync(response, data)) - - return response diff --git a/frogpilot/third_party/influxdb_client/client/tasks_api.py b/frogpilot/third_party/influxdb_client/client/tasks_api.py deleted file mode 100644 index 5ca18fbdd..000000000 --- a/frogpilot/third_party/influxdb_client/client/tasks_api.py +++ /dev/null @@ -1,226 +0,0 @@ -""" -Process and analyze your data with tasks in the InfluxDB task engine. - -Use tasks (scheduled Flux queries) to input a data stream and then analyze, modify, and act on the data accordingly. -""" - -import datetime -from typing import List - -from influxdb_client import TasksService, Task, TaskCreateRequest, TaskUpdateRequest, LabelResponse, LabelMapping, \ - AddResourceMemberRequestBody, RunManually, Run, LogEvent -from influxdb_client.client._pages import _Paginated - - -class TasksApi(object): - """Implementation for '/api/v2/tasks' endpoint.""" - - def __init__(self, influxdb_client): - """Initialize defaults.""" - self._influxdb_client = influxdb_client - self._service = TasksService(influxdb_client.api_client) - - def find_task_by_id(self, task_id) -> Task: - """Retrieve a task.""" - task = self._service.get_tasks_id(task_id) - return task - - def find_tasks(self, **kwargs): - """List all tasks up to set limit (max 500). - - :key str name: only returns tasks with the specified name - :key str after: returns tasks after specified ID - :key str user: filter tasks to a specific user ID - :key str org: filter tasks to a specific organization name - :key str org_id: filter tasks to a specific organization ID - :key int limit: the number of tasks to return - :return: Tasks - """ - return self._service.get_tasks(**kwargs).tasks - - def find_tasks_iter(self, **kwargs): - """Iterate over all tasks with pagination. - - :key str name: only returns tasks with the specified name - :key str after: returns tasks after specified ID - :key str user: filter tasks to a specific user ID - :key str org: filter tasks to a specific organization name - :key str org_id: filter tasks to a specific organization ID - :key int limit: the number of tasks in one page - :return: Tasks iterator - """ - return _Paginated(self._service.get_tasks, lambda response: response.tasks).find_iter(**kwargs) - - def create_task(self, task: Task = None, task_create_request: TaskCreateRequest = None) -> Task: - """Create a new task.""" - if task_create_request is not None: - return self._service.post_tasks(task_create_request) - - if task is not None: - request = TaskCreateRequest(flux=task.flux, org_id=task.org_id, org=task.org, description=task.description, - status=task.status) - - return self.create_task(task_create_request=request) - - raise ValueError("task or task_create_request must be not None") - - @staticmethod - def _create_task(name: str, flux: str, every, cron, org_id: str) -> Task: - - task = Task(id=0, name=name, org_id=org_id, status="active", flux=flux) - - repetition = "" - if every is not None: - repetition += "every: " - repetition += every - - if cron is not None: - repetition += "cron: " - repetition += '"' + cron + '"' - - flux_with_options = '{} \n\noption task = {{name: "{}", {}}}'.format(flux, name, repetition) - task.flux = flux_with_options - - return task - - def create_task_every(self, name, flux, every, organization) -> Task: - """Create a new task with every repetition schedule.""" - task = self._create_task(name, flux, every, None, organization.id) - return self.create_task(task) - - def create_task_cron(self, name: str, flux: str, cron: str, org_id: str) -> Task: - """Create a new task with cron repetition schedule.""" - task = self._create_task(name=name, flux=flux, cron=cron, org_id=org_id, every=None) - return self.create_task(task) - - def delete_task(self, task_id: str): - """Delete a task.""" - if task_id is not None: - return self._service.delete_tasks_id(task_id=task_id) - - def update_task(self, task: Task) -> Task: - """Update a task.""" - req = TaskUpdateRequest(flux=task.flux, description=task.description, every=task.every, cron=task.cron, - status=task.status, offset=task.offset) - - return self.update_task_request(task_id=task.id, task_update_request=req) - - def update_task_request(self, task_id, task_update_request: TaskUpdateRequest) -> Task: - """Update a task.""" - return self._service.patch_tasks_id(task_id=task_id, task_update_request=task_update_request) - - def clone_task(self, task: Task) -> Task: - """Clone a task.""" - cloned = Task(id=0, name=task.name, org_id=task.org_id, org=task.org, flux=task.flux, status="active") - - created = self.create_task(cloned) - if task.id: - labels = self.get_labels(task.id) - for label in labels.labels: - self.add_label(label.id, created.id) - return created - - def get_labels(self, task_id): - """List all labels for a task.""" - return self._service.get_tasks_id_labels(task_id=task_id) - - def add_label(self, label_id: str, task_id: str) -> LabelResponse: - """Add a label to a task.""" - label_mapping = LabelMapping(label_id=label_id) - return self._service.post_tasks_id_labels(task_id=task_id, label_mapping=label_mapping) - - def delete_label(self, label_id: str, task_id: str): - """Delete a label from a task.""" - return self._service.delete_tasks_id_labels_id(task_id=task_id, label_id=label_id) - - def get_members(self, task_id: str): - """List all task members.""" - return self._service.get_tasks_id_members(task_id=task_id).users - - def add_member(self, member_id, task_id): - """Add a member to a task.""" - user = AddResourceMemberRequestBody(id=member_id) - return self._service.post_tasks_id_members(task_id=task_id, add_resource_member_request_body=user) - - def delete_member(self, member_id, task_id): - """Remove a member from a task.""" - return self._service.delete_tasks_id_members_id(user_id=member_id, task_id=task_id) - - def get_owners(self, task_id): - """List all owners of a task.""" - return self._service.get_tasks_id_owners(task_id=task_id).users - - def add_owner(self, owner_id, task_id): - """Add an owner to a task.""" - user = AddResourceMemberRequestBody(id=owner_id) - return self._service.post_tasks_id_owners(task_id=task_id, add_resource_member_request_body=user) - - def delete_owner(self, owner_id, task_id): - """Remove an owner from a task.""" - return self._service.delete_tasks_id_owners_id(user_id=owner_id, task_id=task_id) - - def get_runs(self, task_id, **kwargs) -> List['Run']: - """ - Retrieve list of run records for a task. - - :param task_id: task id - :key str after: returns runs after specified ID - :key int limit: the number of runs to return - :key datetime after_time: filter runs to those scheduled after this time, RFC3339 - :key datetime before_time: filter runs to those scheduled before this time, RFC3339 - """ - return self._service.get_tasks_id_runs(task_id=task_id, **kwargs).runs - - def get_run(self, task_id: str, run_id: str) -> Run: - """ - Get run record for specific task and run id. - - :param task_id: task id - :param run_id: run id - :return: Run for specified task and run id - """ - return self._service.get_tasks_id_runs_id(task_id=task_id, run_id=run_id) - - def get_run_logs(self, task_id: str, run_id: str) -> List['LogEvent']: - """Retrieve all logs for a run.""" - return self._service.get_tasks_id_runs_id_logs(task_id=task_id, run_id=run_id).events - - def run_manually(self, task_id: str, scheduled_for: datetime = None): - """ - Manually start a run of the task now overriding the current schedule. - - :param task_id: - :param scheduled_for: planned execution - """ - r = RunManually(scheduled_for=scheduled_for) - return self._service.post_tasks_id_runs(task_id=task_id, run_manually=r) - - def retry_run(self, task_id: str, run_id: str): - """ - Retry a task run. - - :param task_id: task id - :param run_id: run id - """ - return self._service.post_tasks_id_runs_id_retry(task_id=task_id, run_id=run_id) - - def cancel_run(self, task_id: str, run_id: str): - """ - Cancel a currently running run. - - :param task_id: - :param run_id: - """ - return self._service.delete_tasks_id_runs_id(task_id=task_id, run_id=run_id) - - def get_logs(self, task_id: str) -> List['LogEvent']: - """ - Retrieve all logs for a task. - - :param task_id: task id - """ - return self._service.get_tasks_id_logs(task_id=task_id).events - - def find_tasks_by_user(self, task_user_id): - """List all tasks by user.""" - return self.find_tasks(user=task_user_id) diff --git a/frogpilot/third_party/influxdb_client/client/users_api.py b/frogpilot/third_party/influxdb_client/client/users_api.py deleted file mode 100644 index dbaca7ad6..000000000 --- a/frogpilot/third_party/influxdb_client/client/users_api.py +++ /dev/null @@ -1,80 +0,0 @@ -""" -Users are those with access to InfluxDB. - -To grant a user permission to access data, add them as a member of an organization -and provide them with an authentication token. -""" - -from typing import Union -from influxdb_client import UsersService, User, Users, UserResponse, PasswordResetBody - - -class UsersApi(object): - """Implementation for '/api/v2/users' endpoint.""" - - def __init__(self, influxdb_client): - """Initialize defaults.""" - self._influxdb_client = influxdb_client - self._service = UsersService(influxdb_client.api_client) - - def me(self) -> User: - """Return the current authenticated user.""" - user = self._service.get_me() - return user - - def create_user(self, name: str) -> User: - """Create a user.""" - user = User(name=name) - - return self._service.post_users(user=user) - - def update_user(self, user: User) -> UserResponse: - """Update a user. - - :param user: User update to apply (required) - :return: User - """ - return self._service.patch_users_id(user_id=user.id, user=user) - - def update_password(self, user: Union[str, User, UserResponse], password: str) -> None: - """Update a password. - - :param user: User to update password (required) - :param password: New password (required) - :return: None - """ - user_id = self._user_id(user) - - return self._service.post_users_id_password(user_id=user_id, password_reset_body=PasswordResetBody(password)) - - def delete_user(self, user: Union[str, User, UserResponse]) -> None: - """Delete a user. - - :param user: user id or User - :return: None - """ - user_id = self._user_id(user) - - return self._service.delete_users_id(user_id=user_id) - - def find_users(self, **kwargs) -> Users: - """List all users. - - :key int offset: The offset for pagination. The number of records to skip. - :key int limit: Limits the number of records returned. Default is `20`. - :key str after: The last resource ID from which to seek from (but not including). - This is to be used instead of `offset`. - :key str name: The user name. - :key str id: The user ID. - :return: Buckets - """ - return self._service.get_users(**kwargs) - - def _user_id(self, user: Union[str, User, UserResponse]): - if isinstance(user, User): - user_id = user.id - elif isinstance(user, UserResponse): - user_id = user.id - else: - user_id = user - return user_id diff --git a/frogpilot/third_party/influxdb_client/client/util/__init__.py b/frogpilot/third_party/influxdb_client/client/util/__init__.py deleted file mode 100644 index f9a83206c..000000000 --- a/frogpilot/third_party/influxdb_client/client/util/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Utils package.""" diff --git a/frogpilot/third_party/influxdb_client/client/util/date_utils.py b/frogpilot/third_party/influxdb_client/client/util/date_utils.py deleted file mode 100644 index 7b6750c87..000000000 --- a/frogpilot/third_party/influxdb_client/client/util/date_utils.py +++ /dev/null @@ -1,101 +0,0 @@ -"""Utils to get right Date parsing function.""" -import datetime -from sys import version_info -import threading -from datetime import timezone as tz - -from dateutil import parser - -date_helper = None - -lock_ = threading.Lock() - - -class DateHelper: - """ - DateHelper to groups different implementations of date operations. - - If you would like to serialize the query results to custom timezone, you can use following code: - - .. code-block:: python - - from influxdb_client.client.util import date_utils - from influxdb_client.client.util.date_utils import DateHelper - import dateutil.parser - from dateutil import tz - - def parse_date(date_string: str): - return dateutil.parser.parse(date_string).astimezone(tz.gettz('ETC/GMT+2')) - - date_utils.date_helper = DateHelper() - date_utils.date_helper.parse_date = parse_date - """ - - def __init__(self, timezone: datetime.tzinfo = tz.utc) -> None: - """ - Initialize defaults. - - :param timezone: Default timezone used for serialization "datetime" without "tzinfo". - Default value is "UTC". - """ - self.timezone = timezone - - def parse_date(self, date_string: str): - """ - Parse string into Date or Timestamp. - - :return: Returns a :class:`datetime.datetime` object or compliant implementation - like :class:`class 'pandas._libs.tslibs.timestamps.Timestamp` - """ - pass - - def to_nanoseconds(self, delta): - """ - Get number of nanoseconds in timedelta. - - Solution comes from v1 client. Thx. - https://github.com/influxdata/influxdb-python/pull/811 - """ - nanoseconds_in_days = delta.days * 86400 * 10 ** 9 - nanoseconds_in_seconds = delta.seconds * 10 ** 9 - nanoseconds_in_micros = delta.microseconds * 10 ** 3 - - return nanoseconds_in_days + nanoseconds_in_seconds + nanoseconds_in_micros - - def to_utc(self, value: datetime): - """ - Convert datetime to UTC timezone. - - :param value: datetime - :return: datetime in UTC - """ - if not value.tzinfo: - return self.to_utc(value.replace(tzinfo=self.timezone)) - else: - return value.astimezone(tz.utc) - - -def get_date_helper() -> DateHelper: - """ - Return DateHelper with proper implementation. - - If there is a 'ciso8601' than use 'ciso8601.parse_datetime' else - use 'datetime.fromisoformat' (Python >= 3.11) or 'dateutil.parse' (Python < 3.11). - """ - global date_helper - if date_helper is None: - with lock_: - # avoid duplicate initialization - if date_helper is None: - _date_helper = DateHelper() - try: - import ciso8601 - _date_helper.parse_date = ciso8601.parse_datetime - except ModuleNotFoundError: - if (version_info.major, version_info.minor) >= (3, 11): - _date_helper.parse_date = datetime.datetime.fromisoformat - else: - _date_helper.parse_date = parser.parse - date_helper = _date_helper - - return date_helper diff --git a/frogpilot/third_party/influxdb_client/client/util/date_utils_pandas.py b/frogpilot/third_party/influxdb_client/client/util/date_utils_pandas.py deleted file mode 100644 index 9a87c6abd..000000000 --- a/frogpilot/third_party/influxdb_client/client/util/date_utils_pandas.py +++ /dev/null @@ -1,15 +0,0 @@ -"""Pandas date utils.""" -from influxdb_client.client.util.date_utils import DateHelper -from influxdb_client.extras import pd - - -class PandasDateTimeHelper(DateHelper): - """DateHelper that use Pandas library with nanosecond precision.""" - - def parse_date(self, date_string: str): - """Parse date string into `class 'pandas._libs.tslibs.timestamps.Timestamp`.""" - return pd.to_datetime(date_string) - - def to_nanoseconds(self, delta): - """Get number of nanoseconds with nanos precision.""" - return super().to_nanoseconds(delta) + (delta.nanoseconds if hasattr(delta, 'nanoseconds') else 0) diff --git a/frogpilot/third_party/influxdb_client/client/util/helpers.py b/frogpilot/third_party/influxdb_client/client/util/helpers.py deleted file mode 100644 index e1fdce909..000000000 --- a/frogpilot/third_party/influxdb_client/client/util/helpers.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Functions to share utility across client classes.""" -from influxdb_client.rest import ApiException - - -def _is_id(value): - """ - Check if the value is valid InfluxDB ID. - - :param value: to check - :return: True if provided parameter is valid InfluxDB ID. - """ - if value and len(value) == 16: - try: - int(value, 16) - return True - except ValueError: - return False - return False - - -def get_org_query_param(org, client, required_id=False): - """ - Get required type of Org query parameter. - - :param str, Organization org: value provided as a parameter into API (optional) - :param InfluxDBClient client: with default value for Org parameter - :param bool required_id: true if the query param has to be a ID - :return: request type of org query parameter or None - """ - _org = client.org if org is None else org - if 'Organization' in type(_org).__name__: - _org = _org.id - if required_id and _org and not _is_id(_org): - try: - organizations = client.organizations_api().find_organizations(org=_org) - if len(organizations) < 1: - from influxdb_client.client.exceptions import InfluxDBError - message = f"The client cannot find organization with name: '{_org}' " \ - "to determine their ID. Are you using token with sufficient permission?" - raise InfluxDBError(response=None, message=message) - return organizations[0].id - except ApiException as e: - if e.status == 404: - from influxdb_client.client.exceptions import InfluxDBError - message = f"The client cannot find organization with name: '{_org}' " \ - "to determine their ID." - raise InfluxDBError(response=None, message=message) - raise e - - return _org diff --git a/frogpilot/third_party/influxdb_client/client/util/multiprocessing_helper.py b/frogpilot/third_party/influxdb_client/client/util/multiprocessing_helper.py deleted file mode 100644 index 41530a237..000000000 --- a/frogpilot/third_party/influxdb_client/client/util/multiprocessing_helper.py +++ /dev/null @@ -1,205 +0,0 @@ -""" -Helpers classes to make easier use the client in multiprocessing environment. - -For more information how the multiprocessing works see Python's -`reference docs `_. -""" -import logging -import multiprocessing - -from influxdb_client import InfluxDBClient, WriteOptions -from influxdb_client.client.exceptions import InfluxDBError - -logger = logging.getLogger('influxdb_client.client.util.multiprocessing_helper') - - -def _success_callback(conf: (str, str, str), data: str): - """Successfully writen batch.""" - logger.debug(f"Written batch: {conf}, data: {data}") - - -def _error_callback(conf: (str, str, str), data: str, exception: InfluxDBError): - """Unsuccessfully writen batch.""" - logger.debug(f"Cannot write batch: {conf}, data: {data} due: {exception}") - - -def _retry_callback(conf: (str, str, str), data: str, exception: InfluxDBError): - """Retryable error.""" - logger.debug(f"Retryable error occurs for batch: {conf}, data: {data} retry: {exception}") - - -class _PoisonPill: - """To notify process to terminate.""" - - pass - - -class MultiprocessingWriter(multiprocessing.Process): - """ - The Helper class to write data into InfluxDB in independent OS process. - - Example: - .. code-block:: python - - from influxdb_client import WriteOptions - from influxdb_client.client.util.multiprocessing_helper import MultiprocessingWriter - - - def main(): - writer = MultiprocessingWriter(url="http://localhost:8086", token="my-token", org="my-org", - write_options=WriteOptions(batch_size=100)) - writer.start() - - for x in range(1, 1000): - writer.write(bucket="my-bucket", record=f"mem,tag=a value={x}i {x}") - - writer.__del__() - - - if __name__ == '__main__': - main() - - - How to use with context_manager: - .. code-block:: python - - from influxdb_client import WriteOptions - from influxdb_client.client.util.multiprocessing_helper import MultiprocessingWriter - - - def main(): - with MultiprocessingWriter(url="http://localhost:8086", token="my-token", org="my-org", - write_options=WriteOptions(batch_size=100)) as writer: - for x in range(1, 1000): - writer.write(bucket="my-bucket", record=f"mem,tag=a value={x}i {x}") - - - if __name__ == '__main__': - main() - - - How to handle batch events: - .. code-block:: python - - from influxdb_client import WriteOptions - from influxdb_client.client.exceptions import InfluxDBError - from influxdb_client.client.util.multiprocessing_helper import MultiprocessingWriter - - - class BatchingCallback(object): - - def success(self, conf: (str, str, str), data: str): - print(f"Written batch: {conf}, data: {data}") - - def error(self, conf: (str, str, str), data: str, exception: InfluxDBError): - print(f"Cannot write batch: {conf}, data: {data} due: {exception}") - - def retry(self, conf: (str, str, str), data: str, exception: InfluxDBError): - print(f"Retryable error occurs for batch: {conf}, data: {data} retry: {exception}") - - - def main(): - callback = BatchingCallback() - with MultiprocessingWriter(url="http://localhost:8086", token="my-token", org="my-org", - success_callback=callback.success, - error_callback=callback.error, - retry_callback=callback.retry) as writer: - - for x in range(1, 1000): - writer.write(bucket="my-bucket", record=f"mem,tag=a value={x}i {x}") - - - if __name__ == '__main__': - main() - - - """ - - __started__ = False - __disposed__ = False - - def __init__(self, **kwargs) -> None: - """ - Initialize defaults. - - For more information how to initialize the writer see the examples above. - - :param kwargs: arguments are passed into ``__init__`` function of ``InfluxDBClient`` and ``write_api``. - """ - multiprocessing.Process.__init__(self) - self.kwargs = kwargs - self.client = None - self.write_api = None - self.queue_ = multiprocessing.Manager().Queue() - - def write(self, **kwargs) -> None: - """ - Append time-series data into underlying queue. - - For more information how to pass arguments see the examples above. - - :param kwargs: arguments are passed into ``write`` function of ``WriteApi`` - :return: None - """ - assert self.__disposed__ is False, 'Cannot write data: the writer is closed.' - assert self.__started__ is True, 'Cannot write data: the writer is not started.' - self.queue_.put(kwargs) - - def run(self): - """Initialize ``InfluxDBClient`` and waits for data to writes into InfluxDB.""" - # Initialize Client and Write API - self.client = InfluxDBClient(**self.kwargs) - self.write_api = self.client.write_api(write_options=self.kwargs.get('write_options', WriteOptions()), - success_callback=self.kwargs.get('success_callback', _success_callback), - error_callback=self.kwargs.get('error_callback', _error_callback), - retry_callback=self.kwargs.get('retry_callback', _retry_callback)) - # Infinite loop - until poison pill - while True: - next_record = self.queue_.get() - if type(next_record) is _PoisonPill: - # Poison pill means break the loop - self.terminate() - self.queue_.task_done() - break - self.write_api.write(**next_record) - self.queue_.task_done() - - def start(self) -> None: - """Start independent process for writing data into InfluxDB.""" - super().start() - self.__started__ = True - - def terminate(self) -> None: - """ - Cleanup resources in independent process. - - This function **cannot be used** to terminate the ``MultiprocessingWriter``. - If you want to finish your writes please call: ``__del__``. - """ - if self.write_api: - logger.info("flushing data...") - self.write_api.__del__() - self.write_api = None - if self.client: - self.client.__del__() - self.client = None - logger.info("closed") - - def __enter__(self): - """Enter the runtime context related to this object.""" - self.start() - return self - - def __exit__(self, exc_type, exc_value, traceback): - """Exit the runtime context related to this object.""" - self.__del__() - - def __del__(self): - """Dispose the client and write_api.""" - if self.__started__: - self.queue_.put(_PoisonPill()) - self.queue_.join() - self.join() - self.queue_ = None - self.__started__ = False - self.__disposed__ = True diff --git a/frogpilot/third_party/influxdb_client/client/warnings.py b/frogpilot/third_party/influxdb_client/client/warnings.py deleted file mode 100644 index b682ff865..000000000 --- a/frogpilot/third_party/influxdb_client/client/warnings.py +++ /dev/null @@ -1,52 +0,0 @@ -"""The warnings message definition.""" -import warnings - - -class MissingPivotFunction(UserWarning): - """User warning about missing pivot() function.""" - - @staticmethod - def print_warning(query: str): - """Print warning about missing pivot() function and how to deal with that.""" - if 'fieldsAsCols' in query or 'pivot' in query: - return - - message = f"""The query doesn't contains the pivot() function. - -The result will not be shaped to optimal processing by pandas.DataFrame. Use the pivot() function by: - - {query} |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") - -You can disable this warning by: - import warnings - from influxdb_client.client.warnings import MissingPivotFunction - - warnings.simplefilter("ignore", MissingPivotFunction) - -For more info see: - - https://docs.influxdata.com/resources/videos/pivots-in-flux/ - - https://docs.influxdata.com/flux/latest/stdlib/universe/pivot/ - - https://docs.influxdata.com/flux/latest/stdlib/influxdata/influxdb/schema/fieldsascols/ -""" - warnings.warn(message, MissingPivotFunction) - - -class CloudOnlyWarning(UserWarning): - """User warning about availability only on the InfluxDB Cloud.""" - - @staticmethod - def print_warning(api_name: str, doc_url: str): - """Print warning about availability only on the InfluxDB Cloud.""" - message = f"""The '{api_name}' is available only on the InfluxDB Cloud. - -For more info see: - - {doc_url} - - https://docs.influxdata.com/influxdb/cloud/ - -You can disable this warning by: - import warnings - from influxdb_client.client.warnings import CloudOnlyWarning - - warnings.simplefilter("ignore", CloudOnlyWarning) -""" - warnings.warn(message, CloudOnlyWarning) diff --git a/frogpilot/third_party/influxdb_client/client/write/__init__.py b/frogpilot/third_party/influxdb_client/client/write/__init__.py deleted file mode 100644 index 0d21a4384..000000000 --- a/frogpilot/third_party/influxdb_client/client/write/__init__.py +++ /dev/null @@ -1,56 +0,0 @@ -# flake8: noqa - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -# import apis into api package -from influxdb_client.service.authorizations_service import AuthorizationsService -from influxdb_client.service.backup_service import BackupService -from influxdb_client.service.bucket_schemas_service import BucketSchemasService -from influxdb_client.service.buckets_service import BucketsService -from influxdb_client.service.cells_service import CellsService -from influxdb_client.service.checks_service import ChecksService -from influxdb_client.service.config_service import ConfigService -from influxdb_client.service.dbr_ps_service import DBRPsService -from influxdb_client.service.dashboards_service import DashboardsService -from influxdb_client.service.delete_service import DeleteService -from influxdb_client.service.health_service import HealthService -from influxdb_client.service.invokable_scripts_service import InvokableScriptsService -from influxdb_client.service.labels_service import LabelsService -from influxdb_client.service.legacy_authorizations_service import LegacyAuthorizationsService -from influxdb_client.service.metrics_service import MetricsService -from influxdb_client.service.notification_endpoints_service import NotificationEndpointsService -from influxdb_client.service.notification_rules_service import NotificationRulesService -from influxdb_client.service.organizations_service import OrganizationsService -from influxdb_client.service.ping_service import PingService -from influxdb_client.service.query_service import QueryService -from influxdb_client.service.ready_service import ReadyService -from influxdb_client.service.remote_connections_service import RemoteConnectionsService -from influxdb_client.service.replications_service import ReplicationsService -from influxdb_client.service.resources_service import ResourcesService -from influxdb_client.service.restore_service import RestoreService -from influxdb_client.service.routes_service import RoutesService -from influxdb_client.service.rules_service import RulesService -from influxdb_client.service.scraper_targets_service import ScraperTargetsService -from influxdb_client.service.secrets_service import SecretsService -from influxdb_client.service.setup_service import SetupService -from influxdb_client.service.signin_service import SigninService -from influxdb_client.service.signout_service import SignoutService -from influxdb_client.service.sources_service import SourcesService -from influxdb_client.service.tasks_service import TasksService -from influxdb_client.service.telegraf_plugins_service import TelegrafPluginsService -from influxdb_client.service.telegrafs_service import TelegrafsService -from influxdb_client.service.templates_service import TemplatesService -from influxdb_client.service.users_service import UsersService -from influxdb_client.service.variables_service import VariablesService -from influxdb_client.service.views_service import ViewsService -from influxdb_client.service.write_service import WriteService diff --git a/frogpilot/third_party/influxdb_client/client/write/dataframe_serializer.py b/frogpilot/third_party/influxdb_client/client/write/dataframe_serializer.py deleted file mode 100644 index ccc198ac3..000000000 --- a/frogpilot/third_party/influxdb_client/client/write/dataframe_serializer.py +++ /dev/null @@ -1,290 +0,0 @@ -""" -Functions for serialize Pandas DataFrame. - -Much of the code here is inspired by that in the aioinflux packet found here: https://github.com/gusutabopb/aioinflux -""" - -import logging -import math -import re - -from influxdb_client import WritePrecision -from influxdb_client.client.write.point import _ESCAPE_KEY, _ESCAPE_STRING, _ESCAPE_MEASUREMENT, DEFAULT_WRITE_PRECISION - -logger = logging.getLogger('influxdb_client.client.write.dataframe_serializer') - - -def _itertuples(data_frame): - cols = [data_frame.iloc[:, k] for k in range(len(data_frame.columns))] - return zip(data_frame.index, *cols) - - -class DataframeSerializer: - """Serialize DataFrame into LineProtocols.""" - - def __init__(self, data_frame, point_settings, precision=DEFAULT_WRITE_PRECISION, chunk_size: int = None, - **kwargs) -> None: - """ - Init serializer. - - :param data_frame: Pandas DataFrame to serialize - :param point_settings: Default Tags - :param precision: The precision for the unix timestamps within the body line-protocol. - :param chunk_size: The size of chunk for serializing into chunks. - :key data_frame_measurement_name: name of measurement for writing Pandas DataFrame - :key data_frame_tag_columns: list of DataFrame columns which are tags, rest columns will be fields - :key data_frame_timestamp_column: name of DataFrame column which contains a timestamp. The column can be defined as a :class:`~str` value - formatted as `2018-10-26`, `2018-10-26 12:00`, `2018-10-26 12:00:00-05:00` - or other formats and types supported by `pandas.to_datetime `_ - ``DataFrame`` - :key data_frame_timestamp_timezone: name of the timezone which is used for timestamp column - ``DataFrame`` - """ # noqa: E501 - # This function is hard to understand but for good reason: - # the approach used here is considerably more efficient - # than the alternatives. - # - # We build up a Python expression that efficiently converts a data point - # tuple into line-protocol entry, and then evaluate the expression - # as a lambda so that we can call it. This avoids the overhead of - # invoking a function on every data value - we only have one function - # call per row instead. The expression consists of exactly - # one f-string, so we build up the parts of it as segments - # that are concatenated together to make the full f-string inside - # the lambda. - # - # Things are made a little more complex because fields and tags with NaN - # values and empty tags are omitted from the generated line-protocol - # output. - # - # As an example, say we have a data frame with two value columns: - # a float - # b int - # - # This will generate a lambda expression to be evaluated that looks like - # this: - # - # lambda p: f"""{measurement_name} {keys[0]}={p[1]},{keys[1]}={p[2]}i {p[0].value}""" - # - # This lambda is then executed for each row p. - # - # When NaNs are present, the expression looks like this (split - # across two lines to satisfy the code-style checker) - # - # lambda p: f"""{measurement_name} {"" if pd.isna(p[1]) - # else f"{keys[0]}={p[1]}"},{keys[1]}={p[2]}i {p[0].value}""" - # - # When there's a NaN value in column a, we'll end up with a comma at the start of the - # fields, so we run a regexp substitution after generating the line-protocol entries - # to remove this. - # - # We're careful to run these potentially costly extra steps only when NaN values actually - # exist in the data. - - from ...extras import pd, np - if not isinstance(data_frame, pd.DataFrame): - raise TypeError('Must be DataFrame, but type was: {0}.' - .format(type(data_frame))) - - data_frame_measurement_name = kwargs.get('data_frame_measurement_name') - if data_frame_measurement_name is None: - raise TypeError('"data_frame_measurement_name" is a Required Argument') - - timestamp_column = kwargs.get('data_frame_timestamp_column', None) - timestamp_timezone = kwargs.get('data_frame_timestamp_timezone', None) - data_frame = data_frame.copy(deep=False) - data_frame_timestamp = data_frame.index if timestamp_column is None else data_frame[timestamp_column] - if isinstance(data_frame_timestamp, pd.PeriodIndex): - data_frame_timestamp = data_frame_timestamp.to_timestamp() - else: - # TODO: this is almost certainly not what you want - # when the index is the default RangeIndex. - # Instead, it would probably be better to leave - # out the timestamp unless a time column is explicitly - # enabled. - data_frame_timestamp = pd.to_datetime(data_frame_timestamp, unit=precision) - - if timestamp_timezone: - if isinstance(data_frame_timestamp, pd.DatetimeIndex): - data_frame_timestamp = data_frame_timestamp.tz_localize(timestamp_timezone) - else: - data_frame_timestamp = data_frame_timestamp.dt.tz_localize(timestamp_timezone) - - if hasattr(data_frame_timestamp, 'tzinfo') and data_frame_timestamp.tzinfo is None: - data_frame_timestamp = data_frame_timestamp.tz_localize('UTC') - if timestamp_column is None: - data_frame.index = data_frame_timestamp - else: - data_frame[timestamp_column] = data_frame_timestamp - - data_frame_tag_columns = kwargs.get('data_frame_tag_columns') - data_frame_tag_columns = set(data_frame_tag_columns or []) - - # keys holds a list of string keys. - keys = [] - # tags holds a list of tag f-string segments ordered alphabetically by tag key. - tags = [] - # fields holds a list of field f-string segments ordered alphebetically by field key - fields = [] - # field_indexes holds the index into each row of all the fields. - field_indexes = [] - - if point_settings.defaultTags: - for key, value in point_settings.defaultTags.items(): - # Avoid overwriting existing data if there's a column - # that already exists with the default tag's name. - # Note: when a new column is added, the old DataFrame - # that we've made a shallow copy of is unaffected. - # TODO: when there are NaN or empty values in - # the column, we could make a deep copy of the - # data and fill in those values with the default tag value. - if key not in data_frame.columns: - data_frame[key] = value - data_frame_tag_columns.add(key) - - # Get a list of all the columns sorted by field/tag key. - # We want to iterate through the columns in sorted order - # so that we know when we're on the first field so we - # can know whether a comma is needed for that - # field. - columns = sorted(enumerate(data_frame.dtypes.items()), key=lambda col: col[1][0]) - - # null_columns has a bool value for each column holding - # whether that column contains any null (NaN or None) values. - null_columns = data_frame.isnull().any() - timestamp_index = 0 - - # Iterate through the columns building up the expression for each column. - for index, (key, value) in columns: - key = str(key) - key_format = f'{{keys[{len(keys)}]}}' - keys.append(key.translate(_ESCAPE_KEY)) - # The field index is one more than the column index because the - # time index is at column zero in the finally zipped-together - # result columns. - field_index = index + 1 - val_format = f'p[{field_index}]' - - if key in data_frame_tag_columns: - # This column is a tag column. - if null_columns.iloc[index]: - key_value = f"""{{ - '' if {val_format} == '' or pd.isna({val_format}) else - f',{key_format}={{str({val_format}).translate(_ESCAPE_STRING)}}' - }}""" - else: - key_value = f',{key_format}={{str({val_format}).translate(_ESCAPE_KEY)}}' - tags.append(key_value) - continue - elif timestamp_column is not None and key in timestamp_column: - timestamp_index = field_index - continue - - # This column is a field column. - # Note: no comma separator is needed for the first field. - # It's important to omit it because when the first - # field column has no nulls, we don't run the comma-removal - # regexp substitution step. - sep = '' if len(field_indexes) == 0 else ',' - if issubclass(value.type, np.integer) or issubclass(value.type, np.floating) or issubclass(value.type, np.bool_): # noqa: E501 - suffix = 'i' if issubclass(value.type, np.integer) else '' - if null_columns.iloc[index]: - field_value = f"""{{"" if pd.isna({val_format}) else f"{sep}{key_format}={{{val_format}}}{suffix}"}}""" # noqa: E501 - else: - field_value = f"{sep}{key_format}={{{val_format}}}{suffix}" - else: - if null_columns.iloc[index]: - field_value = f"""{{ - '' if pd.isna({val_format}) else - f'{sep}{key_format}="{{str({val_format}).translate(_ESCAPE_STRING)}}"' - }}""" - else: - field_value = f'''{sep}{key_format}="{{str({val_format}).translate(_ESCAPE_STRING)}}"''' - field_indexes.append(field_index) - fields.append(field_value) - - measurement_name = str(data_frame_measurement_name).translate(_ESCAPE_MEASUREMENT) - - tags = ''.join(tags) - fields = ''.join(fields) - timestamp = '{p[%s].value}' % timestamp_index - if precision == WritePrecision.US: - timestamp = '{int(p[%s].value / 1e3)}' % timestamp_index - elif precision == WritePrecision.MS: - timestamp = '{int(p[%s].value / 1e6)}' % timestamp_index - elif precision == WritePrecision.S: - timestamp = '{int(p[%s].value / 1e9)}' % timestamp_index - - f = eval(f'lambda p: f"""{{measurement_name}}{tags} {fields} {timestamp}"""', { - 'measurement_name': measurement_name, - '_ESCAPE_KEY': _ESCAPE_KEY, - '_ESCAPE_STRING': _ESCAPE_STRING, - 'keys': keys, - 'pd': pd, - }) - - for k, v in dict(data_frame.dtypes).items(): - if k in data_frame_tag_columns: - data_frame = data_frame.replace({k: ''}, np.nan) - - def _any_not_nan(p, indexes): - return any(map(lambda x: not pd.isna(p[x]), indexes)) - - self.data_frame = data_frame - self.f = f - self.field_indexes = field_indexes - self.first_field_maybe_null = null_columns.iloc[field_indexes[0] - 1] - self._any_not_nan = _any_not_nan - - # - # prepare chunks - # - if chunk_size is not None: - self.number_of_chunks = int(math.ceil(len(data_frame) / float(chunk_size))) - self.chunk_size = chunk_size - else: - self.number_of_chunks = None - - def serialize(self, chunk_idx: int = None): - """ - Serialize chunk into LineProtocols. - - :param chunk_idx: The index of chunk to serialize. If `None` then serialize whole dataframe. - """ - if chunk_idx is None: - chunk = self.data_frame - else: - logger.debug("Serialize chunk %s/%s ...", chunk_idx + 1, self.number_of_chunks) - chunk = self.data_frame[chunk_idx * self.chunk_size:(chunk_idx + 1) * self.chunk_size] - - if self.first_field_maybe_null: - # When the first field is null (None/NaN), we'll have - # a spurious leading comma which needs to be removed. - lp = (re.sub('^(( |[^ ])* ),([a-zA-Z0-9])(.*)', '\\1\\3\\4', self.f(p)) - for p in filter(lambda x: self._any_not_nan(x, self.field_indexes), _itertuples(chunk))) - return list(lp) - else: - return list(map(self.f, _itertuples(chunk))) - - def number_of_chunks(self): - """ - Return the number of chunks. - - :return: number of chunks or None if chunk_size is not specified. - """ - return self.number_of_chunks - - -def data_frame_to_list_of_points(data_frame, point_settings, precision=DEFAULT_WRITE_PRECISION, **kwargs): - """ - Serialize DataFrame into LineProtocols. - - :param data_frame: Pandas DataFrame to serialize - :param point_settings: Default Tags - :param precision: The precision for the unix timestamps within the body line-protocol. - :key data_frame_measurement_name: name of measurement for writing Pandas DataFrame - :key data_frame_tag_columns: list of DataFrame columns which are tags, rest columns will be fields - :key data_frame_timestamp_column: name of DataFrame column which contains a timestamp. The column can be defined as a :class:`~str` value - formatted as `2018-10-26`, `2018-10-26 12:00`, `2018-10-26 12:00:00-05:00` - or other formats and types supported by `pandas.to_datetime `_ - ``DataFrame`` - :key data_frame_timestamp_timezone: name of the timezone which is used for timestamp column - ``DataFrame`` - """ # noqa: E501 - return DataframeSerializer(data_frame, point_settings, precision, **kwargs).serialize() diff --git a/frogpilot/third_party/influxdb_client/client/write/point.py b/frogpilot/third_party/influxdb_client/client/write/point.py deleted file mode 100644 index cc95d2045..000000000 --- a/frogpilot/third_party/influxdb_client/client/write/point.py +++ /dev/null @@ -1,371 +0,0 @@ -"""Point data structure to represent LineProtocol.""" - -import math -import warnings -from builtins import int -from datetime import datetime, timedelta, timezone -from decimal import Decimal -from numbers import Integral - -from influxdb_client.client.util.date_utils import get_date_helper -from influxdb_client.domain.write_precision import WritePrecision - -EPOCH = datetime.fromtimestamp(0, tz=timezone.utc) - -DEFAULT_WRITE_PRECISION = WritePrecision.NS - -_ESCAPE_MEASUREMENT = str.maketrans({ - ',': r'\,', - ' ': r'\ ', - '\n': r'\n', - '\t': r'\t', - '\r': r'\r', -}) - -_ESCAPE_KEY = str.maketrans({ - ',': r'\,', - '=': r'\=', - ' ': r'\ ', - '\n': r'\n', - '\t': r'\t', - '\r': r'\r', -}) - -_ESCAPE_STRING = str.maketrans({ - '"': r'\"', - '\\': r'\\', -}) - -try: - import numpy as np - - _HAS_NUMPY = True -except ModuleNotFoundError: - _HAS_NUMPY = False - - -class Point(object): - """ - Point defines the values that will be written to the database. - - Ref: https://docs.influxdata.com/influxdb/latest/reference/key-concepts/data-elements/#point - """ - - @staticmethod - def measurement(measurement): - """Create a new Point with specified measurement name.""" - p = Point(measurement) - return p - - @staticmethod - def from_dict(dictionary: dict, write_precision: WritePrecision = DEFAULT_WRITE_PRECISION, **kwargs): - """ - Initialize point from 'dict' structure. - - The expected dict structure is: - - measurement - - tags - - fields - - time - - Example: - .. code-block:: python - - # Use default dictionary structure - dict_structure = { - "measurement": "h2o_feet", - "tags": {"location": "coyote_creek"}, - "fields": {"water_level": 1.0}, - "time": 1 - } - point = Point.from_dict(dict_structure, WritePrecision.NS) - - Example: - .. code-block:: python - - # Use custom dictionary structure - dictionary = { - "name": "sensor_pt859", - "location": "warehouse_125", - "version": "2021.06.05.5874", - "pressure": 125, - "temperature": 10, - "created": 1632208639, - } - point = Point.from_dict(dictionary, - write_precision=WritePrecision.S, - record_measurement_key="name", - record_time_key="created", - record_tag_keys=["location", "version"], - record_field_keys=["pressure", "temperature"]) - - Int Types: - The following example shows how to configure the types of integers fields. - It is useful when you want to serialize integers always as ``float`` to avoid ``field type conflict`` - or use ``unsigned 64-bit integer`` as the type for serialization. - - .. code-block:: python - - # Use custom dictionary structure - dict_structure = { - "measurement": "h2o_feet", - "tags": {"location": "coyote_creek"}, - "fields": { - "water_level": 1.0, - "some_counter": 108913123234 - }, - "time": 1 - } - - point = Point.from_dict(dict_structure, field_types={"some_counter": "uint"}) - - :param dictionary: dictionary for serialize into data Point - :param write_precision: sets the precision for the supplied time values - :key record_measurement_key: key of dictionary with specified measurement - :key record_measurement_name: static measurement name for data Point - :key record_time_key: key of dictionary with specified timestamp - :key record_tag_keys: list of dictionary keys to use as a tag - :key record_field_keys: list of dictionary keys to use as a field - :key field_types: optional dictionary to specify types of serialized fields. Currently, is supported customization for integer types. - Possible integers types: - - ``int`` - serialize integers as "**Signed 64-bit integers**" - ``9223372036854775807i`` (default behaviour) - - ``uint`` - serialize integers as "**Unsigned 64-bit integers**" - ``9223372036854775807u`` - - ``float`` - serialize integers as "**IEEE-754 64-bit floating-point numbers**". Useful for unify number types in your pipeline to avoid field type conflict - ``9223372036854775807`` - The ``field_types`` can be also specified as part of incoming dictionary. For more info see an example above. - :return: new data point - """ # noqa: E501 - measurement_ = kwargs.get('record_measurement_name', None) - if measurement_ is None: - measurement_ = dictionary[kwargs.get('record_measurement_key', 'measurement')] - point = Point(measurement_) - - record_tag_keys = kwargs.get('record_tag_keys', None) - if record_tag_keys is not None: - for tag_key in record_tag_keys: - if tag_key in dictionary: - point.tag(tag_key, dictionary[tag_key]) - elif 'tags' in dictionary: - for tag_key, tag_value in dictionary['tags'].items(): - point.tag(tag_key, tag_value) - - record_field_keys = kwargs.get('record_field_keys', None) - if record_field_keys is not None: - for field_key in record_field_keys: - if field_key in dictionary: - point.field(field_key, dictionary[field_key]) - else: - for field_key, field_value in dictionary['fields'].items(): - point.field(field_key, field_value) - - record_time_key = kwargs.get('record_time_key', 'time') - if record_time_key in dictionary: - point.time(dictionary[record_time_key], write_precision=write_precision) - - _field_types = kwargs.get('field_types', {}) - if 'field_types' in dictionary: - _field_types = dictionary['field_types'] - # Map API fields types to Line Protocol types postfix: - # - int: 'i' - # - uint: 'u' - # - float: '' - point._field_types = dict(map( - lambda item: (item[0], 'i' if item[1] == 'int' else 'u' if item[1] == 'uint' else ''), - _field_types.items() - )) - - return point - - def __init__(self, measurement_name): - """Initialize defaults.""" - self._tags = {} - self._fields = {} - self._name = measurement_name - self._time = None - self._write_precision = DEFAULT_WRITE_PRECISION - self._field_types = {} - - def time(self, time, write_precision=DEFAULT_WRITE_PRECISION): - """ - Specify timestamp for DataPoint with declared precision. - - If time doesn't have specified timezone we assume that timezone is UTC. - - Examples:: - Point.measurement("h2o").field("val", 1).time("2009-11-10T23:00:00.123456Z") - Point.measurement("h2o").field("val", 1).time(1257894000123456000) - Point.measurement("h2o").field("val", 1).time(datetime(2009, 11, 10, 23, 0, 0, 123456)) - Point.measurement("h2o").field("val", 1).time(1257894000123456000, write_precision=WritePrecision.NS) - - - :param time: the timestamp for your data - :param write_precision: sets the precision for the supplied time values - :return: this point - """ - self._write_precision = write_precision - self._time = time - return self - - def tag(self, key, value): - """Add tag with key and value.""" - self._tags[key] = value - return self - - def field(self, field, value): - """Add field with key and value.""" - self._fields[field] = value - return self - - def to_line_protocol(self, precision=None): - """ - Create LineProtocol. - - :param precision: required precision of LineProtocol. If it's not set then use the precision from ``Point``. - """ - _measurement = _escape_key(self._name, _ESCAPE_MEASUREMENT) - if _measurement.startswith("#"): - message = f"""The measurement name '{_measurement}' start with '#'. - -The output Line protocol will be interpret as a comment by InfluxDB. For more info see: - - https://docs.influxdata.com/influxdb/latest/reference/syntax/line-protocol/#comments -""" - warnings.warn(message, SyntaxWarning) - _tags = _append_tags(self._tags) - _fields = _append_fields(self._fields, self._field_types) - if not _fields: - return "" - _time = _append_time(self._time, self._write_precision if precision is None else precision) - - return f"{_measurement}{_tags}{_fields}{_time}" - - @property - def write_precision(self): - """Get precision.""" - return self._write_precision - - @classmethod - def set_str_rep(cls, rep_function): - """Set the string representation for all Points.""" - cls.__str___rep = rep_function - - def __str__(self): - """Create string representation of this Point.""" - return self.to_line_protocol() - - def __eq__(self, other): - """Return true iff other is equal to self.""" - if not isinstance(other, Point): - return False - # assume points are equal iff their instance fields are equal - return (self._tags == other._tags and - self._fields == other._fields and - self._name == other._name and - self._time == other._time and - self._write_precision == other._write_precision and - self._field_types == other._field_types) - - -def _append_tags(tags): - _return = [] - for tag_key, tag_value in sorted(tags.items()): - - if tag_value is None: - continue - - tag = _escape_key(tag_key) - value = _escape_tag_value(tag_value) - if tag != '' and value != '': - _return.append(f'{tag}={value}') - - return f"{',' if _return else ''}{','.join(_return)} " - - -def _append_fields(fields, field_types): - _return = [] - - for field, value in sorted(fields.items()): - if value is None: - continue - - if isinstance(value, float) or isinstance(value, Decimal) or _np_is_subtype(value, 'float'): - if not math.isfinite(value): - continue - s = str(value) - # It's common to represent whole numbers as floats - # and the trailing ".0" that Python produces is unnecessary - # in line-protocol, inconsistent with other line-protocol encoders, - # and takes more space than needed, so trim it off. - if s.endswith('.0'): - s = s[:-2] - _return.append(f'{_escape_key(field)}={s}') - elif (isinstance(value, int) or _np_is_subtype(value, 'int')) and not isinstance(value, bool): - _type = field_types.get(field, "i") - _return.append(f'{_escape_key(field)}={str(value)}{_type}') - elif isinstance(value, bool): - _return.append(f'{_escape_key(field)}={str(value).lower()}') - elif isinstance(value, str): - _return.append(f'{_escape_key(field)}="{_escape_string(value)}"') - else: - raise ValueError(f'Type: "{type(value)}" of field: "{field}" is not supported.') - - return f"{','.join(_return)}" - - -def _append_time(time, write_precision) -> str: - if time is None: - return '' - return f" {int(_convert_timestamp(time, write_precision))}" - - -def _escape_key(tag, escape_list=None) -> str: - if escape_list is None: - escape_list = _ESCAPE_KEY - return str(tag).translate(escape_list) - - -def _escape_tag_value(value) -> str: - ret = _escape_key(value) - if ret.endswith('\\'): - ret += ' ' - return ret - - -def _escape_string(value) -> str: - return str(value).translate(_ESCAPE_STRING) - - -def _convert_timestamp(timestamp, precision=DEFAULT_WRITE_PRECISION): - date_helper = get_date_helper() - if isinstance(timestamp, Integral): - return timestamp # assume precision is correct if timestamp is int - - if isinstance(timestamp, str): - timestamp = date_helper.parse_date(timestamp) - - if isinstance(timestamp, timedelta) or isinstance(timestamp, datetime): - - if isinstance(timestamp, datetime): - timestamp = date_helper.to_utc(timestamp) - EPOCH - - ns = date_helper.to_nanoseconds(timestamp) - - if precision is None or precision == WritePrecision.NS: - return ns - elif precision == WritePrecision.US: - return ns / 1e3 - elif precision == WritePrecision.MS: - return ns / 1e6 - elif precision == WritePrecision.S: - return ns / 1e9 - - raise ValueError(timestamp) - - -def _np_is_subtype(value, np_type): - if not _HAS_NUMPY or not hasattr(value, 'dtype'): - return False - - if np_type == 'float': - return np.issubdtype(value, np.floating) - elif np_type == 'int': - return np.issubdtype(value, np.integer) - return False diff --git a/frogpilot/third_party/influxdb_client/client/write/retry.py b/frogpilot/third_party/influxdb_client/client/write/retry.py deleted file mode 100644 index 2c4b359ec..000000000 --- a/frogpilot/third_party/influxdb_client/client/write/retry.py +++ /dev/null @@ -1,148 +0,0 @@ -"""Implementation for Retry strategy during HTTP requests.""" - -import logging -from datetime import datetime, timedelta -from itertools import takewhile -from random import random -from typing import Callable - -from urllib3 import Retry -from urllib3.exceptions import MaxRetryError, ResponseError - -from influxdb_client.client.exceptions import InfluxDBError - -logger = logging.getLogger('influxdb_client.client.write.retry') - - -class WritesRetry(Retry): - """ - Writes retry configuration. - - The next delay is computed as random value between range - `retry_interval * exponential_base^(attempts-1)` and `retry_interval * exponential_base^(attempts) - - Example: - for retry_interval=5, exponential_base=2, max_retry_delay=125, total=5 - retry delays are random distributed values within the ranges of - [5-10, 10-20, 20-40, 40-80, 80-125] - """ - - def __init__(self, jitter_interval=0, max_retry_delay=125, exponential_base=2, max_retry_time=180, total=5, - retry_interval=5, retry_callback: Callable[[Exception], int] = None, **kw): - """ - Initialize defaults. - - :param int jitter_interval: random milliseconds when retrying writes - :param num max_retry_delay: maximum delay when retrying write in seconds - :param int max_retry_time: maximum total retry timeout in seconds, - attempt after this timout throws MaxRetryError - :param int total: maximum number of retries - :param num retry_interval: initial first retry delay range in seconds - :param int exponential_base: base for the exponential retry delay, - :param Callable[[Exception], int] retry_callback: the callable ``callback`` to run after retryable - error occurred. - The callable must accept one argument: - - `Exception`: an retryable error - """ - super().__init__(**kw) - self.jitter_interval = jitter_interval - self.total = total - self.retry_interval = retry_interval - self.max_retry_delay = max_retry_delay - self.max_retry_time = max_retry_time - self.exponential_base = exponential_base - self.retry_timeout = datetime.now() + timedelta(seconds=max_retry_time) - self.retry_callback = retry_callback - - def new(self, **kw): - """Initialize defaults.""" - if 'jitter_interval' not in kw: - kw['jitter_interval'] = self.jitter_interval - if 'retry_interval' not in kw: - kw['retry_interval'] = self.retry_interval - if 'max_retry_delay' not in kw: - kw['max_retry_delay'] = self.max_retry_delay - if 'max_retry_time' not in kw: - kw['max_retry_time'] = self.max_retry_time - if 'exponential_base' not in kw: - kw['exponential_base'] = self.exponential_base - if 'retry_callback' not in kw: - kw['retry_callback'] = self.retry_callback - - new = super().new(**kw) - new.retry_timeout = self.retry_timeout - return new - - def is_retry(self, method, status_code, has_retry_after=False): - """is_retry doesn't require retry_after header. If there is not Retry-After we will use backoff.""" - if not self._is_method_retryable(method): - return False - - return self.total and (status_code >= 429) - - def get_backoff_time(self): - """Variant of exponential backoff with initial and max delay and a random jitter delay.""" - # We want to consider only the last consecutive errors sequence (Ignore redirects). - consecutive_errors_len = len( - list( - takewhile(lambda x: x.redirect_location is None, reversed(self.history)) - ) - ) - # First fail doesn't increase backoff - consecutive_errors_len -= 1 - if consecutive_errors_len < 0: - return 0 - - range_start = self.retry_interval - range_stop = self.retry_interval * self.exponential_base - - i = 1 - while i <= consecutive_errors_len: - i += 1 - range_start = range_stop - range_stop = range_stop * self.exponential_base - if range_stop > self.max_retry_delay: - break - - if range_stop > self.max_retry_delay: - range_stop = self.max_retry_delay - - return range_start + (range_stop - range_start) * self._random() - - def get_retry_after(self, response): - """Get the value of Retry-After header and append random jitter delay.""" - retry_after = super().get_retry_after(response) - if retry_after: - retry_after += self._jitter_delay() - return retry_after - - def increment(self, method=None, url=None, response=None, error=None, _pool=None, _stacktrace=None): - """Return a new Retry object with incremented retry counters.""" - if self.retry_timeout < datetime.now(): - raise MaxRetryError(_pool, url, error or ResponseError("max_retry_time exceeded")) - - new_retry = super().increment(method, url, response, error, _pool, _stacktrace) - - if response is not None: - parsed_error = InfluxDBError(response=response) - elif error is not None: - parsed_error = error - else: - parsed_error = f"Failed request to: {url}" - - message = f"The retriable error occurred during request. Reason: '{parsed_error}'." - if isinstance(parsed_error, InfluxDBError): - message += f" Retry in {parsed_error.retry_after}s." - - if self.retry_callback: - self.retry_callback(parsed_error) - - logger.warning(message) - - return new_retry - - def _jitter_delay(self): - return self.jitter_interval * random() - - def _random(self): - return random() diff --git a/frogpilot/third_party/influxdb_client/client/write_api.py b/frogpilot/third_party/influxdb_client/client/write_api.py deleted file mode 100644 index 3b3db68fe..000000000 --- a/frogpilot/third_party/influxdb_client/client/write_api.py +++ /dev/null @@ -1,587 +0,0 @@ -"""Collect and write time series data to InfluxDB Cloud or InfluxDB OSS.""" - -# coding: utf-8 -import logging -import os -import warnings -from collections import defaultdict -from datetime import timedelta -from enum import Enum -from random import random -from time import sleep -from typing import Union, Any, Iterable, NamedTuple - -import reactivex as rx -from reactivex import operators as ops, Observable -from reactivex.scheduler import ThreadPoolScheduler -from reactivex.subject import Subject - -from influxdb_client import WritePrecision -from influxdb_client.client._base import _BaseWriteApi, _HAS_DATACLASS -from influxdb_client.client.util.helpers import get_org_query_param -from influxdb_client.client.write.dataframe_serializer import DataframeSerializer -from influxdb_client.client.write.point import Point, DEFAULT_WRITE_PRECISION -from influxdb_client.client.write.retry import WritesRetry -from influxdb_client.rest import _UTF_8_encoding - -logger = logging.getLogger('influxdb_client.client.write_api') - - -if _HAS_DATACLASS: - import dataclasses - from dataclasses import dataclass - - -class WriteType(Enum): - """Configuration which type of writes will client use.""" - - batching = 1 - asynchronous = 2 - synchronous = 3 - - -class WriteOptions(object): - """Write configuration.""" - - def __init__(self, write_type: WriteType = WriteType.batching, - batch_size=1_000, flush_interval=1_000, - jitter_interval=0, - retry_interval=5_000, - max_retries=5, - max_retry_delay=125_000, - max_retry_time=180_000, - exponential_base=2, - max_close_wait=300_000, - write_scheduler=ThreadPoolScheduler(max_workers=1)) -> None: - """ - Create write api configuration. - - :param write_type: methods of write (batching, asynchronous, synchronous) - :param batch_size: the number of data point to collect in batch - :param flush_interval: flush data at least in this interval (milliseconds) - :param jitter_interval: this is primarily to avoid large write spikes for users running a large number of - client instances ie, a jitter of 5s and flush duration 10s means flushes will happen every 10-15s - (milliseconds) - :param retry_interval: the time to wait before retry unsuccessful write (milliseconds) - :param max_retries: the number of max retries when write fails, 0 means retry is disabled - :param max_retry_delay: the maximum delay between each retry attempt in milliseconds - :param max_retry_time: total timeout for all retry attempts in milliseconds, if 0 retry is disabled - :param exponential_base: base for the exponential retry delay - :parama max_close_wait: the maximum time to wait for writes to be flushed if close() is called - :param write_scheduler: - """ - self.write_type = write_type - self.batch_size = batch_size - self.flush_interval = flush_interval - self.jitter_interval = jitter_interval - self.retry_interval = retry_interval - self.max_retries = max_retries - self.max_retry_delay = max_retry_delay - self.max_retry_time = max_retry_time - self.exponential_base = exponential_base - self.write_scheduler = write_scheduler - self.max_close_wait = max_close_wait - - def to_retry_strategy(self, **kwargs): - """ - Create a Retry strategy from write options. - - :key retry_callback: The callable ``callback`` to run after retryable error occurred. - The callable must accept one argument: - - `Exception`: an retryable error - """ - return WritesRetry( - total=self.max_retries, - retry_interval=self.retry_interval / 1_000, - jitter_interval=self.jitter_interval / 1_000, - max_retry_delay=self.max_retry_delay / 1_000, - max_retry_time=self.max_retry_time / 1_000, - exponential_base=self.exponential_base, - retry_callback=kwargs.get("retry_callback", None), - allowed_methods=["POST"]) - - def __getstate__(self): - """Return a dict of attributes that you want to pickle.""" - state = self.__dict__.copy() - # Remove write scheduler - del state['write_scheduler'] - return state - - def __setstate__(self, state): - """Set your object with the provided dict.""" - self.__dict__.update(state) - # Init default write Scheduler - self.write_scheduler = ThreadPoolScheduler(max_workers=1) - - -SYNCHRONOUS = WriteOptions(write_type=WriteType.synchronous) -ASYNCHRONOUS = WriteOptions(write_type=WriteType.asynchronous) - - -class PointSettings(object): - """Settings to store default tags.""" - - def __init__(self, **default_tags) -> None: - """ - Create point settings for write api. - - :param default_tags: Default tags which will be added to each point written by api. - """ - self.defaultTags = dict() - - for key, val in default_tags.items(): - self.add_default_tag(key, val) - - @staticmethod - def _get_value(value): - - if value.startswith("${env."): - return os.environ.get(value[6:-1]) - - return value - - def add_default_tag(self, key, value) -> None: - """Add new default tag with key and value.""" - self.defaultTags[key] = self._get_value(value) - - -class _BatchItemKey(object): - def __init__(self, bucket, org, precision=DEFAULT_WRITE_PRECISION) -> None: - self.bucket = bucket - self.org = org - self.precision = precision - pass - - def __hash__(self) -> int: - return hash((self.bucket, self.org, self.precision)) - - def __eq__(self, o: object) -> bool: - return isinstance(o, self.__class__) \ - and self.bucket == o.bucket and self.org == o.org and self.precision == o.precision - - def __str__(self) -> str: - return '_BatchItemKey[bucket:\'{}\', org:\'{}\', precision:\'{}\']' \ - .format(str(self.bucket), str(self.org), str(self.precision)) - - -class _BatchItem(object): - def __init__(self, key: _BatchItemKey, data, size=1) -> None: - self.key = key - self.data = data - self.size = size - pass - - def to_key_tuple(self) -> (str, str, str): - return self.key.bucket, self.key.org, self.key.precision - - def __str__(self) -> str: - return '_BatchItem[key:\'{}\', size: \'{}\']' \ - .format(str(self.key), str(self.size)) - - -class _BatchResponse(object): - def __init__(self, data: _BatchItem, exception: Exception = None): - self.data = data - self.exception = exception - pass - - def __str__(self) -> str: - return '_BatchResponse[status:\'{}\', \'{}\']' \ - .format("failed" if self.exception else "success", str(self.data)) - - -def _body_reduce(batch_items): - return b'\n'.join(map(lambda batch_item: batch_item.data, batch_items)) - - -class WriteApi(_BaseWriteApi): - """ - Implementation for '/api/v2/write' endpoint. - - Example: - .. code-block:: python - - from influxdb_client import InfluxDBClient - from influxdb_client.client.write_api import SYNCHRONOUS - - - # Initialize SYNCHRONOUS instance of WriteApi - with InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org") as client: - write_api = client.write_api(write_options=SYNCHRONOUS) - """ - - def __init__(self, - influxdb_client, - write_options: WriteOptions = WriteOptions(), - point_settings: PointSettings = PointSettings(), - **kwargs) -> None: - """ - Initialize defaults. - - :param influxdb_client: with default settings (organization) - :param write_options: write api configuration - :param point_settings: settings to store default tags. - :key success_callback: The callable ``callback`` to run after successfully writen a batch. - - The callable must accept two arguments: - - `Tuple`: ``(bucket, organization, precision)`` - - `str`: written data - - **[batching mode]** - :key error_callback: The callable ``callback`` to run after unsuccessfully writen a batch. - - The callable must accept three arguments: - - `Tuple`: ``(bucket, organization, precision)`` - - `str`: written data - - `Exception`: an occurred error - - **[batching mode]** - :key retry_callback: The callable ``callback`` to run after retryable error occurred. - - The callable must accept three arguments: - - `Tuple`: ``(bucket, organization, precision)`` - - `str`: written data - - `Exception`: an retryable error - - **[batching mode]** - """ - super().__init__(influxdb_client=influxdb_client, point_settings=point_settings) - self._write_options = write_options - self._success_callback = kwargs.get('success_callback', None) - self._error_callback = kwargs.get('error_callback', None) - self._retry_callback = kwargs.get('retry_callback', None) - self._window_scheduler = None - - if self._write_options.write_type is WriteType.batching: - # Define Subject that listen incoming data and produces writes into InfluxDB - self._subject = Subject() - - self._window_scheduler = ThreadPoolScheduler(1) - self._disposable = self._subject.pipe( - # Split incoming data to windows by batch_size or flush_interval - ops.window_with_time_or_count(count=write_options.batch_size, - timespan=timedelta(milliseconds=write_options.flush_interval), - scheduler=self._window_scheduler), - # Map window into groups defined by 'organization', 'bucket' and 'precision' - ops.flat_map(lambda window: window.pipe( - # Group window by 'organization', 'bucket' and 'precision' - ops.group_by(lambda batch_item: batch_item.key), - # Create batch (concatenation line protocols by \n) - ops.map(lambda group: group.pipe( - ops.to_iterable(), - ops.map(lambda xs: _BatchItem(key=group.key, data=_body_reduce(xs), size=len(xs))))), - ops.merge_all())), - # Write data into InfluxDB (possibility to retry if its fail) - ops.filter(lambda batch: batch.size > 0), - ops.map(mapper=lambda batch: self._to_response(data=batch, delay=self._jitter_delay())), - ops.merge_all()) \ - .subscribe(self._on_next, self._on_error, self._on_complete) - - else: - self._subject = None - self._disposable = None - - if self._write_options.write_type is WriteType.asynchronous: - message = """The 'WriteType.asynchronous' is deprecated and will be removed in future major version. - -You can use native asynchronous version of the client: -- https://influxdb-client.readthedocs.io/en/stable/usage.html#how-to-use-asyncio - """ - warnings.warn(message, DeprecationWarning) - - def write(self, bucket: str, org: str = None, - record: Union[ - str, Iterable['str'], Point, Iterable['Point'], dict, Iterable['dict'], bytes, Iterable['bytes'], - Observable, NamedTuple, Iterable['NamedTuple'], 'dataclass', Iterable['dataclass'] - ] = None, - write_precision: WritePrecision = DEFAULT_WRITE_PRECISION, **kwargs) -> Any: - """ - Write time-series data into InfluxDB. - - :param str bucket: specifies the destination bucket for writes (required) - :param str, Organization org: specifies the destination organization for writes; - take the ID, Name or Organization. - If not specified the default value from ``InfluxDBClient.org`` is used. - :param WritePrecision write_precision: specifies the precision for the unix timestamps within - the body line-protocol. The precision specified on a Point has precedes - and is use for write. - :param record: Point, Line Protocol, Dictionary, NamedTuple, Data Classes, Pandas DataFrame or - RxPY Observable to write - :key data_frame_measurement_name: name of measurement for writing Pandas DataFrame - ``DataFrame`` - :key data_frame_tag_columns: list of DataFrame columns which are tags, - rest columns will be fields - ``DataFrame`` - :key data_frame_timestamp_column: name of DataFrame column which contains a timestamp. The column can be defined as a :class:`~str` value - formatted as `2018-10-26`, `2018-10-26 12:00`, `2018-10-26 12:00:00-05:00` - or other formats and types supported by `pandas.to_datetime `_ - ``DataFrame`` - :key data_frame_timestamp_timezone: name of the timezone which is used for timestamp column - ``DataFrame`` - :key record_measurement_key: key of record with specified measurement - - ``dictionary``, ``NamedTuple``, ``dataclass`` - :key record_measurement_name: static measurement name - ``dictionary``, ``NamedTuple``, ``dataclass`` - :key record_time_key: key of record with specified timestamp - ``dictionary``, ``NamedTuple``, ``dataclass`` - :key record_tag_keys: list of record keys to use as a tag - ``dictionary``, ``NamedTuple``, ``dataclass`` - :key record_field_keys: list of record keys to use as a field - ``dictionary``, ``NamedTuple``, ``dataclass`` - - Example: - .. code-block:: python - - # Record as Line Protocol - write_api.write("my-bucket", "my-org", "h2o_feet,location=us-west level=125i 1") - - # Record as Dictionary - dictionary = { - "measurement": "h2o_feet", - "tags": {"location": "us-west"}, - "fields": {"level": 125}, - "time": 1 - } - write_api.write("my-bucket", "my-org", dictionary) - - # Record as Point - from influxdb_client import Point - point = Point("h2o_feet").tag("location", "us-west").field("level", 125).time(1) - write_api.write("my-bucket", "my-org", point) - - DataFrame: - If the ``data_frame_timestamp_column`` is not specified the index of `Pandas DataFrame `_ - is used as a ``timestamp`` for written data. The index can be `PeriodIndex `_ - or its must be transformable to ``datetime`` by - `pandas.to_datetime `_. - - If you would like to transform a column to ``PeriodIndex``, you can use something like: - - .. code-block:: python - - import pandas as pd - - # DataFrame - data_frame = ... - # Set column as Index - data_frame.set_index('column_name', inplace=True) - # Transform index to PeriodIndex - data_frame.index = pd.to_datetime(data_frame.index, unit='s') - - """ # noqa: E501 - org = get_org_query_param(org=org, client=self._influxdb_client) - - self._append_default_tags(record) - - if self._write_options.write_type is WriteType.batching: - return self._write_batching(bucket, org, record, - write_precision, **kwargs) - - payloads = defaultdict(list) - self._serialize(record, write_precision, payloads, **kwargs) - - _async_req = True if self._write_options.write_type == WriteType.asynchronous else False - - def write_payload(payload): - final_string = b'\n'.join(payload[1]) - return self._post_write(_async_req, bucket, org, final_string, payload[0]) - - results = list(map(write_payload, payloads.items())) - if not _async_req: - return None - elif len(results) == 1: - return results[0] - return results - - def flush(self): - """Flush data.""" - # TODO - pass - - def close(self): - """Flush data and dispose a batching buffer.""" - self.__del__() - - def __enter__(self): - """ - Enter the runtime context related to this object. - - It will bind this method’s return value to the target(s) - specified in the `as` clause of the statement. - - return: self instance - """ - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - """Exit the runtime context related to this object and close the WriteApi.""" - self.close() - - def __del__(self): - """Close WriteApi.""" - if self._subject: - self._subject.on_completed() - self._subject.dispose() - self._subject = None - - """ - We impose a maximum wait time to ensure that we do not cause a deadlock if the - background thread has exited abnormally - - Each iteration waits 100ms, but sleep expects the unit to be seconds so convert - the maximum wait time to seconds. - - We keep a counter of how long we've waited - """ - max_wait_time = self._write_options.max_close_wait / 1000 - waited = 0 - sleep_period = 0.1 - - # Wait for writing to finish - while not self._disposable.is_disposed: - sleep(sleep_period) - waited += sleep_period - - # Have we reached the upper limit? - if waited >= max_wait_time: - logger.warning( - "Reached max_close_wait (%s seconds) waiting for batches to finish writing. Force closing", - max_wait_time - ) - break - - if self._window_scheduler: - self._window_scheduler.executor.shutdown(wait=False) - self._window_scheduler = None - - if self._disposable: - self._disposable = None - pass - - def _write_batching(self, bucket, org, data, - precision=DEFAULT_WRITE_PRECISION, - **kwargs): - if isinstance(data, bytes): - _key = _BatchItemKey(bucket, org, precision) - self._subject.on_next(_BatchItem(key=_key, data=data)) - - elif isinstance(data, str): - self._write_batching(bucket, org, data.encode(_UTF_8_encoding), - precision, **kwargs) - - elif isinstance(data, Point): - self._write_batching(bucket, org, data.to_line_protocol(), data.write_precision, **kwargs) - - elif isinstance(data, dict): - self._write_batching(bucket, org, Point.from_dict(data, write_precision=precision, **kwargs), - precision, **kwargs) - - elif 'DataFrame' in type(data).__name__: - serializer = DataframeSerializer(data, self._point_settings, precision, self._write_options.batch_size, - **kwargs) - for chunk_idx in range(serializer.number_of_chunks): - self._write_batching(bucket, org, - serializer.serialize(chunk_idx), - precision, **kwargs) - elif hasattr(data, "_asdict"): - # noinspection PyProtectedMember - self._write_batching(bucket, org, data._asdict(), precision, **kwargs) - - elif _HAS_DATACLASS and dataclasses.is_dataclass(data): - self._write_batching(bucket, org, dataclasses.asdict(data), precision, **kwargs) - - elif isinstance(data, Iterable): - for item in data: - self._write_batching(bucket, org, item, precision, **kwargs) - - elif isinstance(data, Observable): - data.subscribe(lambda it: self._write_batching(bucket, org, it, precision, **kwargs)) - pass - - return None - - def _http(self, batch_item: _BatchItem): - - logger.debug("Write time series data into InfluxDB: %s", batch_item) - - if self._retry_callback: - def _retry_callback_delegate(exception): - return self._retry_callback(batch_item.to_key_tuple(), batch_item.data, exception) - else: - _retry_callback_delegate = None - - retry = self._write_options.to_retry_strategy(retry_callback=_retry_callback_delegate) - - self._post_write(False, batch_item.key.bucket, batch_item.key.org, batch_item.data, - batch_item.key.precision, urlopen_kw={'retries': retry}) - - logger.debug("Write request finished %s", batch_item) - - return _BatchResponse(data=batch_item) - - def _post_write(self, _async_req, bucket, org, body, precision, **kwargs): - - return self._write_service.post_write(org=org, bucket=bucket, body=body, precision=precision, - async_req=_async_req, - content_type="text/plain; charset=utf-8", - **kwargs) - - def _to_response(self, data: _BatchItem, delay: timedelta): - - return rx.of(data).pipe( - ops.subscribe_on(self._write_options.write_scheduler), - # use delay if its specified - ops.delay(duetime=delay, scheduler=self._write_options.write_scheduler), - # invoke http call - ops.map(lambda x: self._http(x)), - # catch exception to fail batch response - ops.catch(handler=lambda exception, source: rx.just(_BatchResponse(exception=exception, data=data))), - ) - - def _jitter_delay(self): - return timedelta(milliseconds=random() * self._write_options.jitter_interval) - - def _on_next(self, response: _BatchResponse): - if response.exception: - logger.error("The batch item wasn't processed successfully because: %s", response.exception) - if self._error_callback: - try: - self._error_callback(response.data.to_key_tuple(), response.data.data, response.exception) - except Exception as e: - """ - Unfortunately, because callbacks are user-provided generic code, exceptions can be entirely - arbitrary - - We trap it, log that it occurred and then proceed - there's not much more that we can - really do. - """ - logger.error("The configured error callback threw an exception: %s", e) - - else: - logger.debug("The batch item: %s was processed successfully.", response) - if self._success_callback: - try: - self._success_callback(response.data.to_key_tuple(), response.data.data) - except Exception as e: - logger.error("The configured success callback threw an exception: %s", e) - - @staticmethod - def _on_error(ex): - logger.error("unexpected error during batching: %s", ex) - - def _on_complete(self): - self._disposable.dispose() - logger.info("the batching processor was disposed") - - def __getstate__(self): - """Return a dict of attributes that you want to pickle.""" - state = self.__dict__.copy() - # Remove rx - del state['_subject'] - del state['_disposable'] - del state['_window_scheduler'] - del state['_write_service'] - return state - - def __setstate__(self, state): - """Set your object with the provided dict.""" - self.__dict__.update(state) - # Init Rx - self.__init__(self._influxdb_client, - self._write_options, - self._point_settings, - success_callback=self._success_callback, - error_callback=self._error_callback, - retry_callback=self._retry_callback) diff --git a/frogpilot/third_party/influxdb_client/client/write_api_async.py b/frogpilot/third_party/influxdb_client/client/write_api_async.py deleted file mode 100644 index 38937ecad..000000000 --- a/frogpilot/third_party/influxdb_client/client/write_api_async.py +++ /dev/null @@ -1,134 +0,0 @@ -"""Collect and async write time series data to InfluxDB Cloud or InfluxDB OSS.""" -import logging -from asyncio import ensure_future, gather -from collections import defaultdict -from typing import Union, Iterable, NamedTuple - -from influxdb_client import Point, WritePrecision -from influxdb_client.client._base import _BaseWriteApi, _HAS_DATACLASS -from influxdb_client.client.util.helpers import get_org_query_param -from influxdb_client.client.write.point import DEFAULT_WRITE_PRECISION -from influxdb_client.client.write_api import PointSettings - -logger = logging.getLogger('influxdb_client.client.write_api_async') - -if _HAS_DATACLASS: - from dataclasses import dataclass - - -class WriteApiAsync(_BaseWriteApi): - """ - Implementation for '/api/v2/write' endpoint. - - Example: - .. code-block:: python - - from influxdb_client_async import InfluxDBClientAsync - - - # Initialize async/await instance of Write API - async with InfluxDBClientAsync(url="http://localhost:8086", token="my-token", org="my-org") as client: - write_api = client.write_api() - """ - - def __init__(self, influxdb_client, point_settings: PointSettings = PointSettings()) -> None: - """ - Initialize defaults. - - :param influxdb_client: with default settings (organization) - :param point_settings: settings to store default tags. - """ - super().__init__(influxdb_client=influxdb_client, point_settings=point_settings) - - async def write(self, bucket: str, org: str = None, - record: Union[str, Iterable['str'], Point, Iterable['Point'], dict, Iterable['dict'], bytes, - Iterable['bytes'], NamedTuple, Iterable['NamedTuple'], 'dataclass', - Iterable['dataclass']] = None, - write_precision: WritePrecision = DEFAULT_WRITE_PRECISION, **kwargs) -> bool: - """ - Write time-series data into InfluxDB. - - :param str bucket: specifies the destination bucket for writes (required) - :param str, Organization org: specifies the destination organization for writes; - take the ID, Name or Organization. - If not specified the default value from ``InfluxDBClientAsync.org`` is used. - :param WritePrecision write_precision: specifies the precision for the unix timestamps within - the body line-protocol. The precision specified on a Point has precedes - and is use for write. - :param record: Point, Line Protocol, Dictionary, NamedTuple, Data Classes, Pandas DataFrame - :key data_frame_measurement_name: name of measurement for writing Pandas DataFrame - ``DataFrame`` - :key data_frame_tag_columns: list of DataFrame columns which are tags, - rest columns will be fields - ``DataFrame`` - :key data_frame_timestamp_column: name of DataFrame column which contains a timestamp. The column can be defined as a :class:`~str` value - formatted as `2018-10-26`, `2018-10-26 12:00`, `2018-10-26 12:00:00-05:00` - or other formats and types supported by `pandas.to_datetime `_ - ``DataFrame`` - :key data_frame_timestamp_timezone: name of the timezone which is used for timestamp column - ``DataFrame`` - :key record_measurement_key: key of record with specified measurement - - ``dictionary``, ``NamedTuple``, ``dataclass`` - :key record_measurement_name: static measurement name - ``dictionary``, ``NamedTuple``, ``dataclass`` - :key record_time_key: key of record with specified timestamp - ``dictionary``, ``NamedTuple``, ``dataclass`` - :key record_tag_keys: list of record keys to use as a tag - ``dictionary``, ``NamedTuple``, ``dataclass`` - :key record_field_keys: list of record keys to use as a field - ``dictionary``, ``NamedTuple``, ``dataclass`` - :return: ``True`` for successfully accepted data, otherwise raise an exception - - Example: - .. code-block:: python - - # Record as Line Protocol - await write_api.write("my-bucket", "my-org", "h2o_feet,location=us-west level=125i 1") - - # Record as Dictionary - dictionary = { - "measurement": "h2o_feet", - "tags": {"location": "us-west"}, - "fields": {"level": 125}, - "time": 1 - } - await write_api.write("my-bucket", "my-org", dictionary) - - # Record as Point - from influxdb_client import Point - point = Point("h2o_feet").tag("location", "us-west").field("level", 125).time(1) - await write_api.write("my-bucket", "my-org", point) - - DataFrame: - If the ``data_frame_timestamp_column`` is not specified the index of `Pandas DataFrame `_ - is used as a ``timestamp`` for written data. The index can be `PeriodIndex `_ - or its must be transformable to ``datetime`` by - `pandas.to_datetime `_. - - If you would like to transform a column to ``PeriodIndex``, you can use something like: - - .. code-block:: python - - import pandas as pd - - # DataFrame - data_frame = ... - # Set column as Index - data_frame.set_index('column_name', inplace=True) - # Transform index to PeriodIndex - data_frame.index = pd.to_datetime(data_frame.index, unit='s') - - """ # noqa: E501 - org = get_org_query_param(org=org, client=self._influxdb_client) - self._append_default_tags(record) - - payloads = defaultdict(list) - self._serialize(record, write_precision, payloads, precision_from_point=True, **kwargs) - - futures = [] - for payload_precision, payload_line in payloads.items(): - futures.append(ensure_future - (self._write_service.post_write_async(org=org, bucket=bucket, - body=b'\n'.join(payload_line), - precision=payload_precision, async_req=False, - _return_http_data_only=False, - content_type="text/plain; charset=utf-8"))) - - results = await gather(*futures, return_exceptions=True) - for result in results: - if isinstance(result, Exception): - raise result - - return False not in [re[1] in (201, 204) for re in results] diff --git a/frogpilot/third_party/influxdb_client/configuration.py b/frogpilot/third_party/influxdb_client/configuration.py deleted file mode 100644 index 96b103016..000000000 --- a/frogpilot/third_party/influxdb_client/configuration.py +++ /dev/null @@ -1,283 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import copy -import logging -import multiprocessing -import sys - -import urllib3 - - -class TypeWithDefault(type): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - Do not edit the class manually. - """ - - def __init__(cls, name, bases, dct): - """Initialize with defaults.""" - super(TypeWithDefault, cls).__init__(name, bases, dct) - cls._default = None - - def __call__(cls): - """Call self as a function.""" - if cls._default is None: - cls._default = type.__call__(cls) - return copy.copy(cls._default) - - def set_default(cls, default): - """Set dafaults.""" - cls._default = copy.copy(default) - - -class Configuration(object, metaclass=TypeWithDefault): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - Do not edit the class manually. - """ - - def __init__(self): - """Initialize configuration.""" - # Default Base url - self.host = "http://localhost/api/v2" - # Temp file folder for downloading files - self.temp_folder_path = None - - # Authentication Settings - # dict to store API key(s) - self.api_key = {} - # dict to store API prefix (e.g. Bearer) - self.api_key_prefix = {} - # Username for HTTP basic authentication - self.username = "" - # Password for HTTP basic authentication - self.password = "" - - # Logging Settings - self.loggers = {} - # Log format - self.logger_format = '%(asctime)s %(levelname)s %(message)s' - # Log stream handler - self.logger_stream_handler = None - # Log file handler - self.logger_file_handler = None - # Debug file location - self.logger_file = None - # Debug switch - self.debug = False - - # SSL/TLS verification - # Set this to false to skip verifying SSL certificate when calling API - # from https server. - self.verify_ssl = True - # Set this to customize the certificate file to verify the peer. - self.ssl_ca_cert = None - # client certificate file - self.cert_file = None - # client key file - self.cert_key_file = None - # client key file password - self.cert_key_password = None - # Set this to True/False to enable/disable SSL hostname verification. - self.assert_hostname = None - - # Set this to specify a custom ssl context to inject this context inside the urllib3 connection pool. - self.ssl_context = None - - # urllib3 connection pool's maximum number of connections saved - # per pool. urllib3 uses 1 connection as default value, but this is - # not the best value when you are making a lot of possibly parallel - # requests to the same host, which is often the case here. - # cpu_count * 5 is used as default value to increase performance. - self.connection_pool_maxsize = multiprocessing.cpu_count() * 5 - # Timeout setting for a request. If one number provided, it will be total request timeout. - # It can also be a pair (tuple) of (connection, read) timeouts. - self.timeout = None - - # Set to True/False to enable basic authentication when using proxied InfluxDB 1.8.x with no auth-enabled - self.auth_basic = False - - # Proxy URL - self.proxy = None - # A dictionary containing headers that will be sent to the proxy - self.proxy_headers = None - # Safe chars for path_param - self.safe_chars_for_path_param = '' - - @property - def logger_file(self): - """Logger file. - - If the logger_file is None, then add stream handler and remove file - handler. Otherwise, add file handler and remove stream handler. - - :param value: The logger_file path. - :type: str - """ - return self.__logger_file - - @logger_file.setter - def logger_file(self, value): - """Logger file. - - If the logger_file is None, then add stream handler and remove file - handler. Otherwise, add file handler and remove stream handler. - - :param value: The logger_file path. - :type: str - """ - self.__logger_file = value - if self.__logger_file: - # If set logging file, - # then add file handler and remove stream handler. - self.logger_file_handler = logging.FileHandler(self.__logger_file) - self.logger_file_handler.setFormatter(self.logger_formatter) - for _, logger in self.loggers.items(): - logger.addHandler(self.logger_file_handler) - - @property - def debug(self): - """Debug status. - - :param value: The debug status, True or False. - :type: bool - """ - return self.__debug - - @debug.setter - def debug(self, value): - """Debug status. - - :param value: The debug status, True or False. - :type: bool - """ - self.__debug = value - if self.__debug: - # if debug status is True, turn on debug logging - for name, logger in self.loggers.items(): - logger.setLevel(logging.DEBUG) - if name == 'influxdb_client.client.http': - # makes sure to do not duplicate stdout handler - if not any(map(lambda h: isinstance(h, logging.StreamHandler) and h.stream == sys.stdout, - logger.handlers)): - logger.addHandler(logging.StreamHandler(sys.stdout)) - # we use 'influxdb_client.client.http' logger instead of this - # httplib.HTTPConnection.debuglevel = 1 - else: - # if debug status is False, turn off debug logging, - # setting log level to default `logging.WARNING` - for _, logger in self.loggers.items(): - logger.setLevel(logging.WARNING) - # we use 'influxdb_client.client.http' logger instead of this - # httplib.HTTPConnection.debuglevel = 0 - - @property - def logger_format(self): - """Logger format. - - The logger_formatter will be updated when sets logger_format. - - :param value: The format string. - :type: str - """ - return self.__logger_format - - @logger_format.setter - def logger_format(self, value): - """Logger format. - - The logger_formatter will be updated when sets logger_format. - - :param value: The format string. - :type: str - """ - self.__logger_format = value - self.logger_formatter = logging.Formatter(self.__logger_format) - - def get_api_key_with_prefix(self, identifier): - """Get API key (with prefix if set). - - :param identifier: The identifier of apiKey. - :return: The token for api key authentication. - """ - if (self.api_key.get(identifier) and - self.api_key_prefix.get(identifier)): - return self.api_key_prefix[identifier] + ' ' + self.api_key[identifier] # noqa: E501 - elif self.api_key.get(identifier): - return self.api_key[identifier] - - def get_basic_auth_token(self): - """Get HTTP basic authentication header (string). - - :return: The token for basic HTTP authentication. - """ - return urllib3.util.make_headers( - basic_auth=self.username + ':' + self.password - ).get('authorization') - - def auth_settings(self): - """Get Auth Settings dict for api client. - - :return: The Auth Settings information dict. - """ - return { - 'BasicAuthentication': - { - 'type': 'basic', - 'in': 'header', - 'key': 'Authorization', - 'value': self.get_basic_auth_token() - }, - 'TokenAuthentication': - { - 'type': 'api_key', - 'in': 'header', - 'key': 'Authorization', - 'value': self.get_api_key_with_prefix('Authorization') - }, - - } - - def to_debug_report(self): - """Get the essential information for debugging. - - :return: The report for debugging. - """ - from influxdb_client import VERSION - return "Python SDK Debug Report:\n"\ - "OS: {env}\n"\ - "Python Version: {pyversion}\n"\ - "Version of the API: 2.0.0\n"\ - "SDK Package Version: {client_version}".\ - format(env=sys.platform, pyversion=sys.version, client_version=VERSION) - - def update_request_header_params(self, path: str, params: dict): - """Update header params based on custom settings. - - :param path: Resource path - :param params: Header parameters dict to be updated. - """ - pass - - def update_request_body(self, path: str, body): - """Update http body based on custom settings. - - :param path: Resource path - :param body: Request body to be updated. - :return: Updated body - """ - return body diff --git a/frogpilot/third_party/influxdb_client/domain/__init__.py b/frogpilot/third_party/influxdb_client/domain/__init__.py deleted file mode 100644 index e9a69d613..000000000 --- a/frogpilot/third_party/influxdb_client/domain/__init__.py +++ /dev/null @@ -1,335 +0,0 @@ -# coding: utf-8 - -# flake8: noqa -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -# import models into model package -from influxdb_client.domain.ast_response import ASTResponse -from influxdb_client.domain.add_resource_member_request_body import AddResourceMemberRequestBody -from influxdb_client.domain.analyze_query_response import AnalyzeQueryResponse -from influxdb_client.domain.analyze_query_response_errors import AnalyzeQueryResponseErrors -from influxdb_client.domain.array_expression import ArrayExpression -from influxdb_client.domain.authorization import Authorization -from influxdb_client.domain.authorization_post_request import AuthorizationPostRequest -from influxdb_client.domain.authorization_update_request import AuthorizationUpdateRequest -from influxdb_client.domain.authorizations import Authorizations -from influxdb_client.domain.axes import Axes -from influxdb_client.domain.axis import Axis -from influxdb_client.domain.axis_scale import AxisScale -from influxdb_client.domain.bad_statement import BadStatement -from influxdb_client.domain.band_view_properties import BandViewProperties -from influxdb_client.domain.binary_expression import BinaryExpression -from influxdb_client.domain.block import Block -from influxdb_client.domain.boolean_literal import BooleanLiteral -from influxdb_client.domain.bucket import Bucket -from influxdb_client.domain.bucket_links import BucketLinks -from influxdb_client.domain.bucket_metadata_manifest import BucketMetadataManifest -from influxdb_client.domain.bucket_retention_rules import BucketRetentionRules -from influxdb_client.domain.bucket_shard_mapping import BucketShardMapping -from influxdb_client.domain.buckets import Buckets -from influxdb_client.domain.builder_aggregate_function_type import BuilderAggregateFunctionType -from influxdb_client.domain.builder_config import BuilderConfig -from influxdb_client.domain.builder_config_aggregate_window import BuilderConfigAggregateWindow -from influxdb_client.domain.builder_functions_type import BuilderFunctionsType -from influxdb_client.domain.builder_tags_type import BuilderTagsType -from influxdb_client.domain.builtin_statement import BuiltinStatement -from influxdb_client.domain.call_expression import CallExpression -from influxdb_client.domain.cell import Cell -from influxdb_client.domain.cell_links import CellLinks -from influxdb_client.domain.cell_update import CellUpdate -from influxdb_client.domain.cell_with_view_properties import CellWithViewProperties -from influxdb_client.domain.check import Check -from influxdb_client.domain.check_base import CheckBase -from influxdb_client.domain.check_base_links import CheckBaseLinks -from influxdb_client.domain.check_discriminator import CheckDiscriminator -from influxdb_client.domain.check_patch import CheckPatch -from influxdb_client.domain.check_status_level import CheckStatusLevel -from influxdb_client.domain.check_view_properties import CheckViewProperties -from influxdb_client.domain.checks import Checks -from influxdb_client.domain.column_data_type import ColumnDataType -from influxdb_client.domain.column_semantic_type import ColumnSemanticType -from influxdb_client.domain.conditional_expression import ConditionalExpression -from influxdb_client.domain.config import Config -from influxdb_client.domain.constant_variable_properties import ConstantVariableProperties -from influxdb_client.domain.create_cell import CreateCell -from influxdb_client.domain.create_dashboard_request import CreateDashboardRequest -from influxdb_client.domain.custom_check import CustomCheck -from influxdb_client.domain.dbrp import DBRP -from influxdb_client.domain.dbrp_create import DBRPCreate -from influxdb_client.domain.dbrp_get import DBRPGet -from influxdb_client.domain.dbrp_update import DBRPUpdate -from influxdb_client.domain.dbr_ps import DBRPs -from influxdb_client.domain.dashboard import Dashboard -from influxdb_client.domain.dashboard_color import DashboardColor -from influxdb_client.domain.dashboard_query import DashboardQuery -from influxdb_client.domain.dashboard_with_view_properties import DashboardWithViewProperties -from influxdb_client.domain.dashboards import Dashboards -from influxdb_client.domain.date_time_literal import DateTimeLiteral -from influxdb_client.domain.deadman_check import DeadmanCheck -from influxdb_client.domain.decimal_places import DecimalPlaces -from influxdb_client.domain.delete_predicate_request import DeletePredicateRequest -from influxdb_client.domain.dialect import Dialect -from influxdb_client.domain.dict_expression import DictExpression -from influxdb_client.domain.dict_item import DictItem -from influxdb_client.domain.duration import Duration -from influxdb_client.domain.duration_literal import DurationLiteral -from influxdb_client.domain.error import Error -from influxdb_client.domain.expression import Expression -from influxdb_client.domain.expression_statement import ExpressionStatement -from influxdb_client.domain.field import Field -from influxdb_client.domain.file import File -from influxdb_client.domain.float_literal import FloatLiteral -from influxdb_client.domain.flux_response import FluxResponse -from influxdb_client.domain.flux_suggestion import FluxSuggestion -from influxdb_client.domain.flux_suggestions import FluxSuggestions -from influxdb_client.domain.function_expression import FunctionExpression -from influxdb_client.domain.gauge_view_properties import GaugeViewProperties -from influxdb_client.domain.greater_threshold import GreaterThreshold -from influxdb_client.domain.http_notification_endpoint import HTTPNotificationEndpoint -from influxdb_client.domain.http_notification_rule import HTTPNotificationRule -from influxdb_client.domain.http_notification_rule_base import HTTPNotificationRuleBase -from influxdb_client.domain.health_check import HealthCheck -from influxdb_client.domain.heatmap_view_properties import HeatmapViewProperties -from influxdb_client.domain.histogram_view_properties import HistogramViewProperties -from influxdb_client.domain.identifier import Identifier -from influxdb_client.domain.import_declaration import ImportDeclaration -from influxdb_client.domain.index_expression import IndexExpression -from influxdb_client.domain.integer_literal import IntegerLiteral -from influxdb_client.domain.is_onboarding import IsOnboarding -from influxdb_client.domain.label import Label -from influxdb_client.domain.label_create_request import LabelCreateRequest -from influxdb_client.domain.label_mapping import LabelMapping -from influxdb_client.domain.label_response import LabelResponse -from influxdb_client.domain.label_update import LabelUpdate -from influxdb_client.domain.labels_response import LabelsResponse -from influxdb_client.domain.language_request import LanguageRequest -from influxdb_client.domain.legacy_authorization_post_request import LegacyAuthorizationPostRequest -from influxdb_client.domain.lesser_threshold import LesserThreshold -from influxdb_client.domain.line_plus_single_stat_properties import LinePlusSingleStatProperties -from influxdb_client.domain.line_protocol_error import LineProtocolError -from influxdb_client.domain.line_protocol_length_error import LineProtocolLengthError -from influxdb_client.domain.links import Links -from influxdb_client.domain.list_stacks_response import ListStacksResponse -from influxdb_client.domain.log_event import LogEvent -from influxdb_client.domain.logical_expression import LogicalExpression -from influxdb_client.domain.logs import Logs -from influxdb_client.domain.map_variable_properties import MapVariableProperties -from influxdb_client.domain.markdown_view_properties import MarkdownViewProperties -from influxdb_client.domain.measurement_schema import MeasurementSchema -from influxdb_client.domain.measurement_schema_column import MeasurementSchemaColumn -from influxdb_client.domain.measurement_schema_create_request import MeasurementSchemaCreateRequest -from influxdb_client.domain.measurement_schema_list import MeasurementSchemaList -from influxdb_client.domain.measurement_schema_update_request import MeasurementSchemaUpdateRequest -from influxdb_client.domain.member_assignment import MemberAssignment -from influxdb_client.domain.member_expression import MemberExpression -from influxdb_client.domain.metadata_backup import MetadataBackup -from influxdb_client.domain.model_property import ModelProperty -from influxdb_client.domain.mosaic_view_properties import MosaicViewProperties -from influxdb_client.domain.node import Node -from influxdb_client.domain.notification_endpoint import NotificationEndpoint -from influxdb_client.domain.notification_endpoint_base import NotificationEndpointBase -from influxdb_client.domain.notification_endpoint_base_links import NotificationEndpointBaseLinks -from influxdb_client.domain.notification_endpoint_discriminator import NotificationEndpointDiscriminator -from influxdb_client.domain.notification_endpoint_type import NotificationEndpointType -from influxdb_client.domain.notification_endpoint_update import NotificationEndpointUpdate -from influxdb_client.domain.notification_endpoints import NotificationEndpoints -from influxdb_client.domain.notification_rule import NotificationRule -from influxdb_client.domain.notification_rule_base import NotificationRuleBase -from influxdb_client.domain.notification_rule_base_links import NotificationRuleBaseLinks -from influxdb_client.domain.notification_rule_discriminator import NotificationRuleDiscriminator -from influxdb_client.domain.notification_rule_update import NotificationRuleUpdate -from influxdb_client.domain.notification_rules import NotificationRules -from influxdb_client.domain.object_expression import ObjectExpression -from influxdb_client.domain.onboarding_request import OnboardingRequest -from influxdb_client.domain.onboarding_response import OnboardingResponse -from influxdb_client.domain.option_statement import OptionStatement -from influxdb_client.domain.organization import Organization -from influxdb_client.domain.organization_links import OrganizationLinks -from influxdb_client.domain.organizations import Organizations -from influxdb_client.domain.package import Package -from influxdb_client.domain.package_clause import PackageClause -from influxdb_client.domain.pager_duty_notification_endpoint import PagerDutyNotificationEndpoint -from influxdb_client.domain.pager_duty_notification_rule import PagerDutyNotificationRule -from influxdb_client.domain.pager_duty_notification_rule_base import PagerDutyNotificationRuleBase -from influxdb_client.domain.paren_expression import ParenExpression -from influxdb_client.domain.password_reset_body import PasswordResetBody -from influxdb_client.domain.patch_bucket_request import PatchBucketRequest -from influxdb_client.domain.patch_dashboard_request import PatchDashboardRequest -from influxdb_client.domain.patch_organization_request import PatchOrganizationRequest -from influxdb_client.domain.patch_retention_rule import PatchRetentionRule -from influxdb_client.domain.patch_stack_request import PatchStackRequest -from influxdb_client.domain.patch_stack_request_additional_resources import PatchStackRequestAdditionalResources -from influxdb_client.domain.permission import Permission -from influxdb_client.domain.permission_resource import PermissionResource -from influxdb_client.domain.pipe_expression import PipeExpression -from influxdb_client.domain.pipe_literal import PipeLiteral -from influxdb_client.domain.post_bucket_request import PostBucketRequest -from influxdb_client.domain.post_check import PostCheck -from influxdb_client.domain.post_notification_endpoint import PostNotificationEndpoint -from influxdb_client.domain.post_notification_rule import PostNotificationRule -from influxdb_client.domain.post_organization_request import PostOrganizationRequest -from influxdb_client.domain.post_restore_kv_response import PostRestoreKVResponse -from influxdb_client.domain.post_stack_request import PostStackRequest -from influxdb_client.domain.property_key import PropertyKey -from influxdb_client.domain.query import Query -from influxdb_client.domain.query_edit_mode import QueryEditMode -from influxdb_client.domain.query_variable_properties import QueryVariableProperties -from influxdb_client.domain.query_variable_properties_values import QueryVariablePropertiesValues -from influxdb_client.domain.range_threshold import RangeThreshold -from influxdb_client.domain.ready import Ready -from influxdb_client.domain.regexp_literal import RegexpLiteral -from influxdb_client.domain.remote_connection import RemoteConnection -from influxdb_client.domain.remote_connection_creation_request import RemoteConnectionCreationRequest -from influxdb_client.domain.remote_connection_update_request import RemoteConnectionUpdateRequest -from influxdb_client.domain.remote_connections import RemoteConnections -from influxdb_client.domain.renamable_field import RenamableField -from influxdb_client.domain.replication import Replication -from influxdb_client.domain.replication_creation_request import ReplicationCreationRequest -from influxdb_client.domain.replication_update_request import ReplicationUpdateRequest -from influxdb_client.domain.replications import Replications -from influxdb_client.domain.resource_member import ResourceMember -from influxdb_client.domain.resource_members import ResourceMembers -from influxdb_client.domain.resource_members_links import ResourceMembersLinks -from influxdb_client.domain.resource_owner import ResourceOwner -from influxdb_client.domain.resource_owners import ResourceOwners -from influxdb_client.domain.restored_bucket_mappings import RestoredBucketMappings -from influxdb_client.domain.retention_policy_manifest import RetentionPolicyManifest -from influxdb_client.domain.return_statement import ReturnStatement -from influxdb_client.domain.routes import Routes -from influxdb_client.domain.routes_external import RoutesExternal -from influxdb_client.domain.routes_query import RoutesQuery -from influxdb_client.domain.routes_system import RoutesSystem -from influxdb_client.domain.rule_status_level import RuleStatusLevel -from influxdb_client.domain.run import Run -from influxdb_client.domain.run_links import RunLinks -from influxdb_client.domain.run_manually import RunManually -from influxdb_client.domain.runs import Runs -from influxdb_client.domain.smtp_notification_rule import SMTPNotificationRule -from influxdb_client.domain.smtp_notification_rule_base import SMTPNotificationRuleBase -from influxdb_client.domain.scatter_view_properties import ScatterViewProperties -from influxdb_client.domain.schema_type import SchemaType -from influxdb_client.domain.scraper_target_request import ScraperTargetRequest -from influxdb_client.domain.scraper_target_response import ScraperTargetResponse -from influxdb_client.domain.scraper_target_responses import ScraperTargetResponses -from influxdb_client.domain.script import Script -from influxdb_client.domain.script_create_request import ScriptCreateRequest -from influxdb_client.domain.script_invocation_params import ScriptInvocationParams -from influxdb_client.domain.script_language import ScriptLanguage -from influxdb_client.domain.script_update_request import ScriptUpdateRequest -from influxdb_client.domain.scripts import Scripts -from influxdb_client.domain.secret_keys import SecretKeys -from influxdb_client.domain.secret_keys_response import SecretKeysResponse -from influxdb_client.domain.shard_group_manifest import ShardGroupManifest -from influxdb_client.domain.shard_manifest import ShardManifest -from influxdb_client.domain.shard_owner import ShardOwner -from influxdb_client.domain.simple_table_view_properties import SimpleTableViewProperties -from influxdb_client.domain.single_stat_view_properties import SingleStatViewProperties -from influxdb_client.domain.slack_notification_endpoint import SlackNotificationEndpoint -from influxdb_client.domain.slack_notification_rule import SlackNotificationRule -from influxdb_client.domain.slack_notification_rule_base import SlackNotificationRuleBase -from influxdb_client.domain.source import Source -from influxdb_client.domain.source_links import SourceLinks -from influxdb_client.domain.sources import Sources -from influxdb_client.domain.stack import Stack -from influxdb_client.domain.stack_associations import StackAssociations -from influxdb_client.domain.stack_events import StackEvents -from influxdb_client.domain.stack_links import StackLinks -from influxdb_client.domain.stack_resources import StackResources -from influxdb_client.domain.statement import Statement -from influxdb_client.domain.static_legend import StaticLegend -from influxdb_client.domain.status_rule import StatusRule -from influxdb_client.domain.string_literal import StringLiteral -from influxdb_client.domain.subscription_manifest import SubscriptionManifest -from influxdb_client.domain.table_view_properties import TableViewProperties -from influxdb_client.domain.table_view_properties_table_options import TableViewPropertiesTableOptions -from influxdb_client.domain.tag_rule import TagRule -from influxdb_client.domain.task import Task -from influxdb_client.domain.task_create_request import TaskCreateRequest -from influxdb_client.domain.task_links import TaskLinks -from influxdb_client.domain.task_status_type import TaskStatusType -from influxdb_client.domain.task_update_request import TaskUpdateRequest -from influxdb_client.domain.tasks import Tasks -from influxdb_client.domain.telegraf import Telegraf -from influxdb_client.domain.telegraf_plugin import TelegrafPlugin -from influxdb_client.domain.telegraf_plugin_request import TelegrafPluginRequest -from influxdb_client.domain.telegraf_plugin_request_plugins import TelegrafPluginRequestPlugins -from influxdb_client.domain.telegraf_plugins import TelegrafPlugins -from influxdb_client.domain.telegraf_request import TelegrafRequest -from influxdb_client.domain.telegraf_request_metadata import TelegrafRequestMetadata -from influxdb_client.domain.telegrafs import Telegrafs -from influxdb_client.domain.telegram_notification_endpoint import TelegramNotificationEndpoint -from influxdb_client.domain.telegram_notification_rule import TelegramNotificationRule -from influxdb_client.domain.telegram_notification_rule_base import TelegramNotificationRuleBase -from influxdb_client.domain.template_apply import TemplateApply -from influxdb_client.domain.template_apply_remotes import TemplateApplyRemotes -from influxdb_client.domain.template_apply_template import TemplateApplyTemplate -from influxdb_client.domain.template_chart import TemplateChart -from influxdb_client.domain.template_export_by_id import TemplateExportByID -from influxdb_client.domain.template_export_by_id_org_ids import TemplateExportByIDOrgIDs -from influxdb_client.domain.template_export_by_id_resource_filters import TemplateExportByIDResourceFilters -from influxdb_client.domain.template_export_by_id_resources import TemplateExportByIDResources -from influxdb_client.domain.template_export_by_name import TemplateExportByName -from influxdb_client.domain.template_export_by_name_resources import TemplateExportByNameResources -from influxdb_client.domain.template_kind import TemplateKind -from influxdb_client.domain.template_summary import TemplateSummary -from influxdb_client.domain.template_summary_diff import TemplateSummaryDiff -from influxdb_client.domain.template_summary_diff_buckets import TemplateSummaryDiffBuckets -from influxdb_client.domain.template_summary_diff_buckets_new_old import TemplateSummaryDiffBucketsNewOld -from influxdb_client.domain.template_summary_diff_checks import TemplateSummaryDiffChecks -from influxdb_client.domain.template_summary_diff_dashboards import TemplateSummaryDiffDashboards -from influxdb_client.domain.template_summary_diff_dashboards_new_old import TemplateSummaryDiffDashboardsNewOld -from influxdb_client.domain.template_summary_diff_label_mappings import TemplateSummaryDiffLabelMappings -from influxdb_client.domain.template_summary_diff_labels import TemplateSummaryDiffLabels -from influxdb_client.domain.template_summary_diff_labels_new_old import TemplateSummaryDiffLabelsNewOld -from influxdb_client.domain.template_summary_diff_notification_endpoints import TemplateSummaryDiffNotificationEndpoints -from influxdb_client.domain.template_summary_diff_notification_rules import TemplateSummaryDiffNotificationRules -from influxdb_client.domain.template_summary_diff_notification_rules_new_old import TemplateSummaryDiffNotificationRulesNewOld -from influxdb_client.domain.template_summary_diff_tasks import TemplateSummaryDiffTasks -from influxdb_client.domain.template_summary_diff_tasks_new_old import TemplateSummaryDiffTasksNewOld -from influxdb_client.domain.template_summary_diff_telegraf_configs import TemplateSummaryDiffTelegrafConfigs -from influxdb_client.domain.template_summary_diff_variables import TemplateSummaryDiffVariables -from influxdb_client.domain.template_summary_diff_variables_new_old import TemplateSummaryDiffVariablesNewOld -from influxdb_client.domain.template_summary_errors import TemplateSummaryErrors -from influxdb_client.domain.template_summary_label import TemplateSummaryLabel -from influxdb_client.domain.template_summary_label_properties import TemplateSummaryLabelProperties -from influxdb_client.domain.template_summary_summary import TemplateSummarySummary -from influxdb_client.domain.template_summary_summary_buckets import TemplateSummarySummaryBuckets -from influxdb_client.domain.template_summary_summary_dashboards import TemplateSummarySummaryDashboards -from influxdb_client.domain.template_summary_summary_label_mappings import TemplateSummarySummaryLabelMappings -from influxdb_client.domain.template_summary_summary_notification_rules import TemplateSummarySummaryNotificationRules -from influxdb_client.domain.template_summary_summary_status_rules import TemplateSummarySummaryStatusRules -from influxdb_client.domain.template_summary_summary_tag_rules import TemplateSummarySummaryTagRules -from influxdb_client.domain.template_summary_summary_tasks import TemplateSummarySummaryTasks -from influxdb_client.domain.template_summary_summary_variables import TemplateSummarySummaryVariables -from influxdb_client.domain.test_statement import TestStatement -from influxdb_client.domain.threshold import Threshold -from influxdb_client.domain.threshold_base import ThresholdBase -from influxdb_client.domain.threshold_check import ThresholdCheck -from influxdb_client.domain.unary_expression import UnaryExpression -from influxdb_client.domain.unsigned_integer_literal import UnsignedIntegerLiteral -from influxdb_client.domain.user import User -from influxdb_client.domain.user_response import UserResponse -from influxdb_client.domain.user_response_links import UserResponseLinks -from influxdb_client.domain.users import Users -from influxdb_client.domain.variable import Variable -from influxdb_client.domain.variable_assignment import VariableAssignment -from influxdb_client.domain.variable_links import VariableLinks -from influxdb_client.domain.variable_properties import VariableProperties -from influxdb_client.domain.variables import Variables -from influxdb_client.domain.view import View -from influxdb_client.domain.view_links import ViewLinks -from influxdb_client.domain.view_properties import ViewProperties -from influxdb_client.domain.views import Views -from influxdb_client.domain.write_precision import WritePrecision -from influxdb_client.domain.xy_geom import XYGeom -from influxdb_client.domain.xy_view_properties import XYViewProperties diff --git a/frogpilot/third_party/influxdb_client/domain/add_resource_member_request_body.py b/frogpilot/third_party/influxdb_client/domain/add_resource_member_request_body.py deleted file mode 100644 index ffcddd869..000000000 --- a/frogpilot/third_party/influxdb_client/domain/add_resource_member_request_body.py +++ /dev/null @@ -1,139 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class AddResourceMemberRequestBody(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'name': 'str' - } - - attribute_map = { - 'id': 'id', - 'name': 'name' - } - - def __init__(self, id=None, name=None): # noqa: E501,D401,D403 - """AddResourceMemberRequestBody - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._name = None - self.discriminator = None - - self.id = id - if name is not None: - self.name = name - - @property - def id(self): - """Get the id of this AddResourceMemberRequestBody. - - The ID of the user to add to the resource. - - :return: The id of this AddResourceMemberRequestBody. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this AddResourceMemberRequestBody. - - The ID of the user to add to the resource. - - :param id: The id of this AddResourceMemberRequestBody. - :type: str - """ # noqa: E501 - if id is None: - raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 - self._id = id - - @property - def name(self): - """Get the name of this AddResourceMemberRequestBody. - - The name of the user to add to the resource. - - :return: The name of this AddResourceMemberRequestBody. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this AddResourceMemberRequestBody. - - The name of the user to add to the resource. - - :param name: The name of this AddResourceMemberRequestBody. - :type: str - """ # noqa: E501 - self._name = name - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, AddResourceMemberRequestBody): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/analyze_query_response.py b/frogpilot/third_party/influxdb_client/domain/analyze_query_response.py deleted file mode 100644 index ef7d18287..000000000 --- a/frogpilot/third_party/influxdb_client/domain/analyze_query_response.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class AnalyzeQueryResponse(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'errors': 'list[AnalyzeQueryResponseErrors]' - } - - attribute_map = { - 'errors': 'errors' - } - - def __init__(self, errors=None): # noqa: E501,D401,D403 - """AnalyzeQueryResponse - a model defined in OpenAPI.""" # noqa: E501 - self._errors = None - self.discriminator = None - - if errors is not None: - self.errors = errors - - @property - def errors(self): - """Get the errors of this AnalyzeQueryResponse. - - :return: The errors of this AnalyzeQueryResponse. - :rtype: list[AnalyzeQueryResponseErrors] - """ # noqa: E501 - return self._errors - - @errors.setter - def errors(self, errors): - """Set the errors of this AnalyzeQueryResponse. - - :param errors: The errors of this AnalyzeQueryResponse. - :type: list[AnalyzeQueryResponseErrors] - """ # noqa: E501 - self._errors = errors - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, AnalyzeQueryResponse): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/analyze_query_response_errors.py b/frogpilot/third_party/influxdb_client/domain/analyze_query_response_errors.py deleted file mode 100644 index 7a35dc68b..000000000 --- a/frogpilot/third_party/influxdb_client/domain/analyze_query_response_errors.py +++ /dev/null @@ -1,176 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class AnalyzeQueryResponseErrors(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'line': 'int', - 'column': 'int', - 'character': 'int', - 'message': 'str' - } - - attribute_map = { - 'line': 'line', - 'column': 'column', - 'character': 'character', - 'message': 'message' - } - - def __init__(self, line=None, column=None, character=None, message=None): # noqa: E501,D401,D403 - """AnalyzeQueryResponseErrors - a model defined in OpenAPI.""" # noqa: E501 - self._line = None - self._column = None - self._character = None - self._message = None - self.discriminator = None - - if line is not None: - self.line = line - if column is not None: - self.column = column - if character is not None: - self.character = character - if message is not None: - self.message = message - - @property - def line(self): - """Get the line of this AnalyzeQueryResponseErrors. - - :return: The line of this AnalyzeQueryResponseErrors. - :rtype: int - """ # noqa: E501 - return self._line - - @line.setter - def line(self, line): - """Set the line of this AnalyzeQueryResponseErrors. - - :param line: The line of this AnalyzeQueryResponseErrors. - :type: int - """ # noqa: E501 - self._line = line - - @property - def column(self): - """Get the column of this AnalyzeQueryResponseErrors. - - :return: The column of this AnalyzeQueryResponseErrors. - :rtype: int - """ # noqa: E501 - return self._column - - @column.setter - def column(self, column): - """Set the column of this AnalyzeQueryResponseErrors. - - :param column: The column of this AnalyzeQueryResponseErrors. - :type: int - """ # noqa: E501 - self._column = column - - @property - def character(self): - """Get the character of this AnalyzeQueryResponseErrors. - - :return: The character of this AnalyzeQueryResponseErrors. - :rtype: int - """ # noqa: E501 - return self._character - - @character.setter - def character(self, character): - """Set the character of this AnalyzeQueryResponseErrors. - - :param character: The character of this AnalyzeQueryResponseErrors. - :type: int - """ # noqa: E501 - self._character = character - - @property - def message(self): - """Get the message of this AnalyzeQueryResponseErrors. - - :return: The message of this AnalyzeQueryResponseErrors. - :rtype: str - """ # noqa: E501 - return self._message - - @message.setter - def message(self, message): - """Set the message of this AnalyzeQueryResponseErrors. - - :param message: The message of this AnalyzeQueryResponseErrors. - :type: str - """ # noqa: E501 - self._message = message - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, AnalyzeQueryResponseErrors): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/array_expression.py b/frogpilot/third_party/influxdb_client/domain/array_expression.py deleted file mode 100644 index 0c2853171..000000000 --- a/frogpilot/third_party/influxdb_client/domain/array_expression.py +++ /dev/null @@ -1,142 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class ArrayExpression(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'elements': 'list[Expression]' - } - - attribute_map = { - 'type': 'type', - 'elements': 'elements' - } - - def __init__(self, type=None, elements=None): # noqa: E501,D401,D403 - """ArrayExpression - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._elements = None - self.discriminator = None - - if type is not None: - self.type = type - if elements is not None: - self.elements = elements - - @property - def type(self): - """Get the type of this ArrayExpression. - - Type of AST node - - :return: The type of this ArrayExpression. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this ArrayExpression. - - Type of AST node - - :param type: The type of this ArrayExpression. - :type: str - """ # noqa: E501 - self._type = type - - @property - def elements(self): - """Get the elements of this ArrayExpression. - - Elements of the array - - :return: The elements of this ArrayExpression. - :rtype: list[Expression] - """ # noqa: E501 - return self._elements - - @elements.setter - def elements(self, elements): - """Set the elements of this ArrayExpression. - - Elements of the array - - :param elements: The elements of this ArrayExpression. - :type: list[Expression] - """ # noqa: E501 - self._elements = elements - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ArrayExpression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/ast_response.py b/frogpilot/third_party/influxdb_client/domain/ast_response.py deleted file mode 100644 index 227cfddd2..000000000 --- a/frogpilot/third_party/influxdb_client/domain/ast_response.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ASTResponse(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'ast': 'Package' - } - - attribute_map = { - 'ast': 'ast' - } - - def __init__(self, ast=None): # noqa: E501,D401,D403 - """ASTResponse - a model defined in OpenAPI.""" # noqa: E501 - self._ast = None - self.discriminator = None - - if ast is not None: - self.ast = ast - - @property - def ast(self): - """Get the ast of this ASTResponse. - - :return: The ast of this ASTResponse. - :rtype: Package - """ # noqa: E501 - return self._ast - - @ast.setter - def ast(self, ast): - """Set the ast of this ASTResponse. - - :param ast: The ast of this ASTResponse. - :type: Package - """ # noqa: E501 - self._ast = ast - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ASTResponse): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/authorization.py b/frogpilot/third_party/influxdb_client/domain/authorization.py deleted file mode 100644 index aef38d9c0..000000000 --- a/frogpilot/third_party/influxdb_client/domain/authorization.py +++ /dev/null @@ -1,354 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.authorization_update_request import AuthorizationUpdateRequest - - -class Authorization(AuthorizationUpdateRequest): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'org_id': 'str', - 'permissions': 'list[Permission]', - 'id': 'str', - 'token': 'str', - 'user_id': 'str', - 'user': 'str', - 'org': 'str', - 'links': 'object', - 'status': 'str', - 'description': 'str' - } - - attribute_map = { - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'org_id': 'orgID', - 'permissions': 'permissions', - 'id': 'id', - 'token': 'token', - 'user_id': 'userID', - 'user': 'user', - 'org': 'org', - 'links': 'links', - 'status': 'status', - 'description': 'description' - } - - def __init__(self, created_at=None, updated_at=None, org_id=None, permissions=None, id=None, token=None, user_id=None, user=None, org=None, links=None, status='active', description=None): # noqa: E501,D401,D403 - """Authorization - a model defined in OpenAPI.""" # noqa: E501 - AuthorizationUpdateRequest.__init__(self, status=status, description=description) # noqa: E501 - - self._created_at = None - self._updated_at = None - self._org_id = None - self._permissions = None - self._id = None - self._token = None - self._user_id = None - self._user = None - self._org = None - self._links = None - self.discriminator = None - - if created_at is not None: - self.created_at = created_at - if updated_at is not None: - self.updated_at = updated_at - if org_id is not None: - if not isinstance(org_id, str): - raise TypeError("org_id must be a string.") - self.org_id = org_id - if permissions is not None: - if not isinstance(permissions, list): - raise TypeError("permissions must be a list.") - self.permissions = permissions - if id is not None: - self.id = id - if token is not None: - self.token = token - if user_id is not None: - self.user_id = user_id - if user is not None: - self.user = user - if org is not None: - self.org = org - if links is not None: - self.links = links - - @property - def created_at(self): - """Get the created_at of this Authorization. - - :return: The created_at of this Authorization. - :rtype: datetime - """ # noqa: E501 - return self._created_at - - @created_at.setter - def created_at(self, created_at): - """Set the created_at of this Authorization. - - :param created_at: The created_at of this Authorization. - :type: datetime - """ # noqa: E501 - self._created_at = created_at - - @property - def updated_at(self): - """Get the updated_at of this Authorization. - - :return: The updated_at of this Authorization. - :rtype: datetime - """ # noqa: E501 - return self._updated_at - - @updated_at.setter - def updated_at(self, updated_at): - """Set the updated_at of this Authorization. - - :param updated_at: The updated_at of this Authorization. - :type: datetime - """ # noqa: E501 - self._updated_at = updated_at - - @property - def org_id(self): - """Get the org_id of this Authorization. - - The organization ID. Specifies the [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) that the authorization is scoped to. - - :return: The org_id of this Authorization. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this Authorization. - - The organization ID. Specifies the [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) that the authorization is scoped to. - - :param org_id: The org_id of this Authorization. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def permissions(self): - """Get the permissions of this Authorization. - - The list of permissions. An authorization must have at least one permission. - - :return: The permissions of this Authorization. - :rtype: list[Permission] - """ # noqa: E501 - return self._permissions - - @permissions.setter - def permissions(self, permissions): - """Set the permissions of this Authorization. - - The list of permissions. An authorization must have at least one permission. - - :param permissions: The permissions of this Authorization. - :type: list[Permission] - """ # noqa: E501 - self._permissions = permissions - - @property - def id(self): - """Get the id of this Authorization. - - The authorization ID. - - :return: The id of this Authorization. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Authorization. - - The authorization ID. - - :param id: The id of this Authorization. - :type: str - """ # noqa: E501 - self._id = id - - @property - def token(self): - """Get the token of this Authorization. - - The API token. The token value is unique to the authorization. [API tokens](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token) are used to authenticate and authorize InfluxDB API requests and `influx` CLI commands--after receiving the request, InfluxDB checks that the token is valid and that the `permissions` allow the requested action(s). - - :return: The token of this Authorization. - :rtype: str - """ # noqa: E501 - return self._token - - @token.setter - def token(self, token): - """Set the token of this Authorization. - - The API token. The token value is unique to the authorization. [API tokens](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token) are used to authenticate and authorize InfluxDB API requests and `influx` CLI commands--after receiving the request, InfluxDB checks that the token is valid and that the `permissions` allow the requested action(s). - - :param token: The token of this Authorization. - :type: str - """ # noqa: E501 - self._token = token - - @property - def user_id(self): - """Get the user_id of this Authorization. - - The user ID. Specifies the [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) that owns the authorization. If _scoped_, the user that the authorization is scoped to; otherwise, the creator of the authorization. - - :return: The user_id of this Authorization. - :rtype: str - """ # noqa: E501 - return self._user_id - - @user_id.setter - def user_id(self, user_id): - """Set the user_id of this Authorization. - - The user ID. Specifies the [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) that owns the authorization. If _scoped_, the user that the authorization is scoped to; otherwise, the creator of the authorization. - - :param user_id: The user_id of this Authorization. - :type: str - """ # noqa: E501 - self._user_id = user_id - - @property - def user(self): - """Get the user of this Authorization. - - The user name. Specifies the [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) that owns the authorization. If the authorization is _scoped_ to a user, the user; otherwise, the creator of the authorization. - - :return: The user of this Authorization. - :rtype: str - """ # noqa: E501 - return self._user - - @user.setter - def user(self, user): - """Set the user of this Authorization. - - The user name. Specifies the [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) that owns the authorization. If the authorization is _scoped_ to a user, the user; otherwise, the creator of the authorization. - - :param user: The user of this Authorization. - :type: str - """ # noqa: E501 - self._user = user - - @property - def org(self): - """Get the org of this Authorization. - - The organization name. Specifies the [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) that the token is scoped to. - - :return: The org of this Authorization. - :rtype: str - """ # noqa: E501 - return self._org - - @org.setter - def org(self, org): - """Set the org of this Authorization. - - The organization name. Specifies the [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) that the token is scoped to. - - :param org: The org of this Authorization. - :type: str - """ # noqa: E501 - self._org = org - - @property - def links(self): - """Get the links of this Authorization. - - :return: The links of this Authorization. - :rtype: object - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Authorization. - - :param links: The links of this Authorization. - :type: object - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Authorization): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/authorization_post_request.py b/frogpilot/third_party/influxdb_client/domain/authorization_post_request.py deleted file mode 100644 index 94bcd96f3..000000000 --- a/frogpilot/third_party/influxdb_client/domain/authorization_post_request.py +++ /dev/null @@ -1,173 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.authorization_update_request import AuthorizationUpdateRequest - - -class AuthorizationPostRequest(AuthorizationUpdateRequest): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'org_id': 'str', - 'user_id': 'str', - 'permissions': 'list[Permission]', - 'status': 'str', - 'description': 'str' - } - - attribute_map = { - 'org_id': 'orgID', - 'user_id': 'userID', - 'permissions': 'permissions', - 'status': 'status', - 'description': 'description' - } - - def __init__(self, org_id=None, user_id=None, permissions=None, status='active', description=None): # noqa: E501,D401,D403 - """AuthorizationPostRequest - a model defined in OpenAPI.""" # noqa: E501 - AuthorizationUpdateRequest.__init__(self, status=status, description=description) # noqa: E501 - - self._org_id = None - self._user_id = None - self._permissions = None - self.discriminator = None - - if org_id is not None: - self.org_id = org_id - if user_id is not None: - self.user_id = user_id - if permissions is not None: - self.permissions = permissions - - @property - def org_id(self): - """Get the org_id of this AuthorizationPostRequest. - - An organization ID. Specifies the organization that owns the authorization. - - :return: The org_id of this AuthorizationPostRequest. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this AuthorizationPostRequest. - - An organization ID. Specifies the organization that owns the authorization. - - :param org_id: The org_id of this AuthorizationPostRequest. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def user_id(self): - """Get the user_id of this AuthorizationPostRequest. - - A user ID. Specifies the user that the authorization is scoped to. When a user authenticates with username and password, InfluxDB generates a _user session_ with all the permissions specified by all the user's authorizations. - - :return: The user_id of this AuthorizationPostRequest. - :rtype: str - """ # noqa: E501 - return self._user_id - - @user_id.setter - def user_id(self, user_id): - """Set the user_id of this AuthorizationPostRequest. - - A user ID. Specifies the user that the authorization is scoped to. When a user authenticates with username and password, InfluxDB generates a _user session_ with all the permissions specified by all the user's authorizations. - - :param user_id: The user_id of this AuthorizationPostRequest. - :type: str - """ # noqa: E501 - self._user_id = user_id - - @property - def permissions(self): - """Get the permissions of this AuthorizationPostRequest. - - A list of permissions for an authorization. In the list, provide at least one `permission` object. In a `permission`, the `resource.type` property grants access to all resources of the specified type. To grant access to only a specific resource, specify the `resource.id` property. - - :return: The permissions of this AuthorizationPostRequest. - :rtype: list[Permission] - """ # noqa: E501 - return self._permissions - - @permissions.setter - def permissions(self, permissions): - """Set the permissions of this AuthorizationPostRequest. - - A list of permissions for an authorization. In the list, provide at least one `permission` object. In a `permission`, the `resource.type` property grants access to all resources of the specified type. To grant access to only a specific resource, specify the `resource.id` property. - - :param permissions: The permissions of this AuthorizationPostRequest. - :type: list[Permission] - """ # noqa: E501 - self._permissions = permissions - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, AuthorizationPostRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/authorization_update_request.py b/frogpilot/third_party/influxdb_client/domain/authorization_update_request.py deleted file mode 100644 index 097d9654e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/authorization_update_request.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class AuthorizationUpdateRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'status': 'str', - 'description': 'str' - } - - attribute_map = { - 'status': 'status', - 'description': 'description' - } - - def __init__(self, status='active', description=None): # noqa: E501,D401,D403 - """AuthorizationUpdateRequest - a model defined in OpenAPI.""" # noqa: E501 - self._status = None - self._description = None - self.discriminator = None - - if status is not None: - self.status = status - if description is not None: - self.description = description - - @property - def status(self): - """Get the status of this AuthorizationUpdateRequest. - - Status of the token. If `inactive`, InfluxDB rejects requests that use the token. - - :return: The status of this AuthorizationUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this AuthorizationUpdateRequest. - - Status of the token. If `inactive`, InfluxDB rejects requests that use the token. - - :param status: The status of this AuthorizationUpdateRequest. - :type: str - """ # noqa: E501 - self._status = status - - @property - def description(self): - """Get the description of this AuthorizationUpdateRequest. - - A description of the token. - - :return: The description of this AuthorizationUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this AuthorizationUpdateRequest. - - A description of the token. - - :param description: The description of this AuthorizationUpdateRequest. - :type: str - """ # noqa: E501 - self._description = description - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, AuthorizationUpdateRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/authorizations.py b/frogpilot/third_party/influxdb_client/domain/authorizations.py deleted file mode 100644 index ad3a4d092..000000000 --- a/frogpilot/third_party/influxdb_client/domain/authorizations.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Authorizations(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'Links', - 'authorizations': 'list[Authorization]' - } - - attribute_map = { - 'links': 'links', - 'authorizations': 'authorizations' - } - - def __init__(self, links=None, authorizations=None): # noqa: E501,D401,D403 - """Authorizations - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._authorizations = None - self.discriminator = None - - if links is not None: - self.links = links - if authorizations is not None: - self.authorizations = authorizations - - @property - def links(self): - """Get the links of this Authorizations. - - :return: The links of this Authorizations. - :rtype: Links - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Authorizations. - - :param links: The links of this Authorizations. - :type: Links - """ # noqa: E501 - self._links = links - - @property - def authorizations(self): - """Get the authorizations of this Authorizations. - - :return: The authorizations of this Authorizations. - :rtype: list[Authorization] - """ # noqa: E501 - return self._authorizations - - @authorizations.setter - def authorizations(self, authorizations): - """Set the authorizations of this Authorizations. - - :param authorizations: The authorizations of this Authorizations. - :type: list[Authorization] - """ # noqa: E501 - self._authorizations = authorizations - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Authorizations): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/axes.py b/frogpilot/third_party/influxdb_client/domain/axes.py deleted file mode 100644 index 738e3b3b0..000000000 --- a/frogpilot/third_party/influxdb_client/domain/axes.py +++ /dev/null @@ -1,132 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Axes(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'x': 'Axis', - 'y': 'Axis' - } - - attribute_map = { - 'x': 'x', - 'y': 'y' - } - - def __init__(self, x=None, y=None): # noqa: E501,D401,D403 - """Axes - a model defined in OpenAPI.""" # noqa: E501 - self._x = None - self._y = None - self.discriminator = None - - self.x = x - self.y = y - - @property - def x(self): - """Get the x of this Axes. - - :return: The x of this Axes. - :rtype: Axis - """ # noqa: E501 - return self._x - - @x.setter - def x(self, x): - """Set the x of this Axes. - - :param x: The x of this Axes. - :type: Axis - """ # noqa: E501 - if x is None: - raise ValueError("Invalid value for `x`, must not be `None`") # noqa: E501 - self._x = x - - @property - def y(self): - """Get the y of this Axes. - - :return: The y of this Axes. - :rtype: Axis - """ # noqa: E501 - return self._y - - @y.setter - def y(self, y): - """Set the y of this Axes. - - :param y: The y of this Axes. - :type: Axis - """ # noqa: E501 - if y is None: - raise ValueError("Invalid value for `y`, must not be `None`") # noqa: E501 - self._y = y - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Axes): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/axis.py b/frogpilot/third_party/influxdb_client/domain/axis.py deleted file mode 100644 index 444207530..000000000 --- a/frogpilot/third_party/influxdb_client/domain/axis.py +++ /dev/null @@ -1,242 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Axis(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'bounds': 'list[str]', - 'label': 'str', - 'prefix': 'str', - 'suffix': 'str', - 'base': 'str', - 'scale': 'AxisScale' - } - - attribute_map = { - 'bounds': 'bounds', - 'label': 'label', - 'prefix': 'prefix', - 'suffix': 'suffix', - 'base': 'base', - 'scale': 'scale' - } - - def __init__(self, bounds=None, label=None, prefix=None, suffix=None, base=None, scale=None): # noqa: E501,D401,D403 - """Axis - a model defined in OpenAPI.""" # noqa: E501 - self._bounds = None - self._label = None - self._prefix = None - self._suffix = None - self._base = None - self._scale = None - self.discriminator = None - - if bounds is not None: - self.bounds = bounds - if label is not None: - self.label = label - if prefix is not None: - self.prefix = prefix - if suffix is not None: - self.suffix = suffix - if base is not None: - self.base = base - if scale is not None: - self.scale = scale - - @property - def bounds(self): - """Get the bounds of this Axis. - - The extents of the axis in the form [lower, upper]. Clients determine whether bounds are inclusive or exclusive of their limits. - - :return: The bounds of this Axis. - :rtype: list[str] - """ # noqa: E501 - return self._bounds - - @bounds.setter - def bounds(self, bounds): - """Set the bounds of this Axis. - - The extents of the axis in the form [lower, upper]. Clients determine whether bounds are inclusive or exclusive of their limits. - - :param bounds: The bounds of this Axis. - :type: list[str] - """ # noqa: E501 - self._bounds = bounds - - @property - def label(self): - """Get the label of this Axis. - - Description of the axis. - - :return: The label of this Axis. - :rtype: str - """ # noqa: E501 - return self._label - - @label.setter - def label(self, label): - """Set the label of this Axis. - - Description of the axis. - - :param label: The label of this Axis. - :type: str - """ # noqa: E501 - self._label = label - - @property - def prefix(self): - """Get the prefix of this Axis. - - Label prefix for formatting axis values. - - :return: The prefix of this Axis. - :rtype: str - """ # noqa: E501 - return self._prefix - - @prefix.setter - def prefix(self, prefix): - """Set the prefix of this Axis. - - Label prefix for formatting axis values. - - :param prefix: The prefix of this Axis. - :type: str - """ # noqa: E501 - self._prefix = prefix - - @property - def suffix(self): - """Get the suffix of this Axis. - - Label suffix for formatting axis values. - - :return: The suffix of this Axis. - :rtype: str - """ # noqa: E501 - return self._suffix - - @suffix.setter - def suffix(self, suffix): - """Set the suffix of this Axis. - - Label suffix for formatting axis values. - - :param suffix: The suffix of this Axis. - :type: str - """ # noqa: E501 - self._suffix = suffix - - @property - def base(self): - """Get the base of this Axis. - - Radix for formatting axis values. - - :return: The base of this Axis. - :rtype: str - """ # noqa: E501 - return self._base - - @base.setter - def base(self, base): - """Set the base of this Axis. - - Radix for formatting axis values. - - :param base: The base of this Axis. - :type: str - """ # noqa: E501 - self._base = base - - @property - def scale(self): - """Get the scale of this Axis. - - :return: The scale of this Axis. - :rtype: AxisScale - """ # noqa: E501 - return self._scale - - @scale.setter - def scale(self, scale): - """Set the scale of this Axis. - - :param scale: The scale of this Axis. - :type: AxisScale - """ # noqa: E501 - self._scale = scale - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Axis): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/axis_scale.py b/frogpilot/third_party/influxdb_client/domain/axis_scale.py deleted file mode 100644 index a678feff5..000000000 --- a/frogpilot/third_party/influxdb_client/domain/axis_scale.py +++ /dev/null @@ -1,88 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class AxisScale(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - LOG = "log" - LINEAR = "linear" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """AxisScale - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, AxisScale): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/bad_statement.py b/frogpilot/third_party/influxdb_client/domain/bad_statement.py deleted file mode 100644 index d1f455e6c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/bad_statement.py +++ /dev/null @@ -1,142 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.statement import Statement - - -class BadStatement(Statement): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'text': 'str' - } - - attribute_map = { - 'type': 'type', - 'text': 'text' - } - - def __init__(self, type=None, text=None): # noqa: E501,D401,D403 - """BadStatement - a model defined in OpenAPI.""" # noqa: E501 - Statement.__init__(self) # noqa: E501 - - self._type = None - self._text = None - self.discriminator = None - - if type is not None: - self.type = type - if text is not None: - self.text = text - - @property - def type(self): - """Get the type of this BadStatement. - - Type of AST node - - :return: The type of this BadStatement. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this BadStatement. - - Type of AST node - - :param type: The type of this BadStatement. - :type: str - """ # noqa: E501 - self._type = type - - @property - def text(self): - """Get the text of this BadStatement. - - Raw source text - - :return: The text of this BadStatement. - :rtype: str - """ # noqa: E501 - return self._text - - @text.setter - def text(self, text): - """Set the text of this BadStatement. - - Raw source text - - :param text: The text of this BadStatement. - :type: str - """ # noqa: E501 - self._text = text - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BadStatement): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/band_view_properties.py b/frogpilot/third_party/influxdb_client/domain/band_view_properties.py deleted file mode 100644 index 1b03b7b4d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/band_view_properties.py +++ /dev/null @@ -1,771 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.view_properties import ViewProperties - - -class BandViewProperties(ViewProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'adaptive_zoom_hide': 'bool', - 'time_format': 'str', - 'type': 'str', - 'queries': 'list[DashboardQuery]', - 'colors': 'list[DashboardColor]', - 'shape': 'str', - 'note': 'str', - 'show_note_when_empty': 'bool', - 'axes': 'Axes', - 'static_legend': 'StaticLegend', - 'x_column': 'str', - 'generate_x_axis_ticks': 'list[str]', - 'x_total_ticks': 'int', - 'x_tick_start': 'float', - 'x_tick_step': 'float', - 'y_column': 'str', - 'generate_y_axis_ticks': 'list[str]', - 'y_total_ticks': 'int', - 'y_tick_start': 'float', - 'y_tick_step': 'float', - 'upper_column': 'str', - 'main_column': 'str', - 'lower_column': 'str', - 'hover_dimension': 'str', - 'geom': 'XYGeom', - 'legend_colorize_rows': 'bool', - 'legend_hide': 'bool', - 'legend_opacity': 'float', - 'legend_orientation_threshold': 'int' - } - - attribute_map = { - 'adaptive_zoom_hide': 'adaptiveZoomHide', - 'time_format': 'timeFormat', - 'type': 'type', - 'queries': 'queries', - 'colors': 'colors', - 'shape': 'shape', - 'note': 'note', - 'show_note_when_empty': 'showNoteWhenEmpty', - 'axes': 'axes', - 'static_legend': 'staticLegend', - 'x_column': 'xColumn', - 'generate_x_axis_ticks': 'generateXAxisTicks', - 'x_total_ticks': 'xTotalTicks', - 'x_tick_start': 'xTickStart', - 'x_tick_step': 'xTickStep', - 'y_column': 'yColumn', - 'generate_y_axis_ticks': 'generateYAxisTicks', - 'y_total_ticks': 'yTotalTicks', - 'y_tick_start': 'yTickStart', - 'y_tick_step': 'yTickStep', - 'upper_column': 'upperColumn', - 'main_column': 'mainColumn', - 'lower_column': 'lowerColumn', - 'hover_dimension': 'hoverDimension', - 'geom': 'geom', - 'legend_colorize_rows': 'legendColorizeRows', - 'legend_hide': 'legendHide', - 'legend_opacity': 'legendOpacity', - 'legend_orientation_threshold': 'legendOrientationThreshold' - } - - def __init__(self, adaptive_zoom_hide=None, time_format=None, type=None, queries=None, colors=None, shape=None, note=None, show_note_when_empty=None, axes=None, static_legend=None, x_column=None, generate_x_axis_ticks=None, x_total_ticks=None, x_tick_start=None, x_tick_step=None, y_column=None, generate_y_axis_ticks=None, y_total_ticks=None, y_tick_start=None, y_tick_step=None, upper_column=None, main_column=None, lower_column=None, hover_dimension=None, geom=None, legend_colorize_rows=None, legend_hide=None, legend_opacity=None, legend_orientation_threshold=None): # noqa: E501,D401,D403 - """BandViewProperties - a model defined in OpenAPI.""" # noqa: E501 - ViewProperties.__init__(self) # noqa: E501 - - self._adaptive_zoom_hide = None - self._time_format = None - self._type = None - self._queries = None - self._colors = None - self._shape = None - self._note = None - self._show_note_when_empty = None - self._axes = None - self._static_legend = None - self._x_column = None - self._generate_x_axis_ticks = None - self._x_total_ticks = None - self._x_tick_start = None - self._x_tick_step = None - self._y_column = None - self._generate_y_axis_ticks = None - self._y_total_ticks = None - self._y_tick_start = None - self._y_tick_step = None - self._upper_column = None - self._main_column = None - self._lower_column = None - self._hover_dimension = None - self._geom = None - self._legend_colorize_rows = None - self._legend_hide = None - self._legend_opacity = None - self._legend_orientation_threshold = None - self.discriminator = None - - if adaptive_zoom_hide is not None: - self.adaptive_zoom_hide = adaptive_zoom_hide - if time_format is not None: - self.time_format = time_format - self.type = type - self.queries = queries - self.colors = colors - self.shape = shape - self.note = note - self.show_note_when_empty = show_note_when_empty - self.axes = axes - if static_legend is not None: - self.static_legend = static_legend - if x_column is not None: - self.x_column = x_column - if generate_x_axis_ticks is not None: - self.generate_x_axis_ticks = generate_x_axis_ticks - if x_total_ticks is not None: - self.x_total_ticks = x_total_ticks - if x_tick_start is not None: - self.x_tick_start = x_tick_start - if x_tick_step is not None: - self.x_tick_step = x_tick_step - if y_column is not None: - self.y_column = y_column - if generate_y_axis_ticks is not None: - self.generate_y_axis_ticks = generate_y_axis_ticks - if y_total_ticks is not None: - self.y_total_ticks = y_total_ticks - if y_tick_start is not None: - self.y_tick_start = y_tick_start - if y_tick_step is not None: - self.y_tick_step = y_tick_step - if upper_column is not None: - self.upper_column = upper_column - if main_column is not None: - self.main_column = main_column - if lower_column is not None: - self.lower_column = lower_column - if hover_dimension is not None: - self.hover_dimension = hover_dimension - self.geom = geom - if legend_colorize_rows is not None: - self.legend_colorize_rows = legend_colorize_rows - if legend_hide is not None: - self.legend_hide = legend_hide - if legend_opacity is not None: - self.legend_opacity = legend_opacity - if legend_orientation_threshold is not None: - self.legend_orientation_threshold = legend_orientation_threshold - - @property - def adaptive_zoom_hide(self): - """Get the adaptive_zoom_hide of this BandViewProperties. - - :return: The adaptive_zoom_hide of this BandViewProperties. - :rtype: bool - """ # noqa: E501 - return self._adaptive_zoom_hide - - @adaptive_zoom_hide.setter - def adaptive_zoom_hide(self, adaptive_zoom_hide): - """Set the adaptive_zoom_hide of this BandViewProperties. - - :param adaptive_zoom_hide: The adaptive_zoom_hide of this BandViewProperties. - :type: bool - """ # noqa: E501 - self._adaptive_zoom_hide = adaptive_zoom_hide - - @property - def time_format(self): - """Get the time_format of this BandViewProperties. - - :return: The time_format of this BandViewProperties. - :rtype: str - """ # noqa: E501 - return self._time_format - - @time_format.setter - def time_format(self, time_format): - """Set the time_format of this BandViewProperties. - - :param time_format: The time_format of this BandViewProperties. - :type: str - """ # noqa: E501 - self._time_format = time_format - - @property - def type(self): - """Get the type of this BandViewProperties. - - :return: The type of this BandViewProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this BandViewProperties. - - :param type: The type of this BandViewProperties. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def queries(self): - """Get the queries of this BandViewProperties. - - :return: The queries of this BandViewProperties. - :rtype: list[DashboardQuery] - """ # noqa: E501 - return self._queries - - @queries.setter - def queries(self, queries): - """Set the queries of this BandViewProperties. - - :param queries: The queries of this BandViewProperties. - :type: list[DashboardQuery] - """ # noqa: E501 - if queries is None: - raise ValueError("Invalid value for `queries`, must not be `None`") # noqa: E501 - self._queries = queries - - @property - def colors(self): - """Get the colors of this BandViewProperties. - - Colors define color encoding of data into a visualization - - :return: The colors of this BandViewProperties. - :rtype: list[DashboardColor] - """ # noqa: E501 - return self._colors - - @colors.setter - def colors(self, colors): - """Set the colors of this BandViewProperties. - - Colors define color encoding of data into a visualization - - :param colors: The colors of this BandViewProperties. - :type: list[DashboardColor] - """ # noqa: E501 - if colors is None: - raise ValueError("Invalid value for `colors`, must not be `None`") # noqa: E501 - self._colors = colors - - @property - def shape(self): - """Get the shape of this BandViewProperties. - - :return: The shape of this BandViewProperties. - :rtype: str - """ # noqa: E501 - return self._shape - - @shape.setter - def shape(self, shape): - """Set the shape of this BandViewProperties. - - :param shape: The shape of this BandViewProperties. - :type: str - """ # noqa: E501 - if shape is None: - raise ValueError("Invalid value for `shape`, must not be `None`") # noqa: E501 - self._shape = shape - - @property - def note(self): - """Get the note of this BandViewProperties. - - :return: The note of this BandViewProperties. - :rtype: str - """ # noqa: E501 - return self._note - - @note.setter - def note(self, note): - """Set the note of this BandViewProperties. - - :param note: The note of this BandViewProperties. - :type: str - """ # noqa: E501 - if note is None: - raise ValueError("Invalid value for `note`, must not be `None`") # noqa: E501 - self._note = note - - @property - def show_note_when_empty(self): - """Get the show_note_when_empty of this BandViewProperties. - - If true, will display note when empty - - :return: The show_note_when_empty of this BandViewProperties. - :rtype: bool - """ # noqa: E501 - return self._show_note_when_empty - - @show_note_when_empty.setter - def show_note_when_empty(self, show_note_when_empty): - """Set the show_note_when_empty of this BandViewProperties. - - If true, will display note when empty - - :param show_note_when_empty: The show_note_when_empty of this BandViewProperties. - :type: bool - """ # noqa: E501 - if show_note_when_empty is None: - raise ValueError("Invalid value for `show_note_when_empty`, must not be `None`") # noqa: E501 - self._show_note_when_empty = show_note_when_empty - - @property - def axes(self): - """Get the axes of this BandViewProperties. - - :return: The axes of this BandViewProperties. - :rtype: Axes - """ # noqa: E501 - return self._axes - - @axes.setter - def axes(self, axes): - """Set the axes of this BandViewProperties. - - :param axes: The axes of this BandViewProperties. - :type: Axes - """ # noqa: E501 - if axes is None: - raise ValueError("Invalid value for `axes`, must not be `None`") # noqa: E501 - self._axes = axes - - @property - def static_legend(self): - """Get the static_legend of this BandViewProperties. - - :return: The static_legend of this BandViewProperties. - :rtype: StaticLegend - """ # noqa: E501 - return self._static_legend - - @static_legend.setter - def static_legend(self, static_legend): - """Set the static_legend of this BandViewProperties. - - :param static_legend: The static_legend of this BandViewProperties. - :type: StaticLegend - """ # noqa: E501 - self._static_legend = static_legend - - @property - def x_column(self): - """Get the x_column of this BandViewProperties. - - :return: The x_column of this BandViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_column - - @x_column.setter - def x_column(self, x_column): - """Set the x_column of this BandViewProperties. - - :param x_column: The x_column of this BandViewProperties. - :type: str - """ # noqa: E501 - self._x_column = x_column - - @property - def generate_x_axis_ticks(self): - """Get the generate_x_axis_ticks of this BandViewProperties. - - :return: The generate_x_axis_ticks of this BandViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._generate_x_axis_ticks - - @generate_x_axis_ticks.setter - def generate_x_axis_ticks(self, generate_x_axis_ticks): - """Set the generate_x_axis_ticks of this BandViewProperties. - - :param generate_x_axis_ticks: The generate_x_axis_ticks of this BandViewProperties. - :type: list[str] - """ # noqa: E501 - self._generate_x_axis_ticks = generate_x_axis_ticks - - @property - def x_total_ticks(self): - """Get the x_total_ticks of this BandViewProperties. - - :return: The x_total_ticks of this BandViewProperties. - :rtype: int - """ # noqa: E501 - return self._x_total_ticks - - @x_total_ticks.setter - def x_total_ticks(self, x_total_ticks): - """Set the x_total_ticks of this BandViewProperties. - - :param x_total_ticks: The x_total_ticks of this BandViewProperties. - :type: int - """ # noqa: E501 - self._x_total_ticks = x_total_ticks - - @property - def x_tick_start(self): - """Get the x_tick_start of this BandViewProperties. - - :return: The x_tick_start of this BandViewProperties. - :rtype: float - """ # noqa: E501 - return self._x_tick_start - - @x_tick_start.setter - def x_tick_start(self, x_tick_start): - """Set the x_tick_start of this BandViewProperties. - - :param x_tick_start: The x_tick_start of this BandViewProperties. - :type: float - """ # noqa: E501 - self._x_tick_start = x_tick_start - - @property - def x_tick_step(self): - """Get the x_tick_step of this BandViewProperties. - - :return: The x_tick_step of this BandViewProperties. - :rtype: float - """ # noqa: E501 - return self._x_tick_step - - @x_tick_step.setter - def x_tick_step(self, x_tick_step): - """Set the x_tick_step of this BandViewProperties. - - :param x_tick_step: The x_tick_step of this BandViewProperties. - :type: float - """ # noqa: E501 - self._x_tick_step = x_tick_step - - @property - def y_column(self): - """Get the y_column of this BandViewProperties. - - :return: The y_column of this BandViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_column - - @y_column.setter - def y_column(self, y_column): - """Set the y_column of this BandViewProperties. - - :param y_column: The y_column of this BandViewProperties. - :type: str - """ # noqa: E501 - self._y_column = y_column - - @property - def generate_y_axis_ticks(self): - """Get the generate_y_axis_ticks of this BandViewProperties. - - :return: The generate_y_axis_ticks of this BandViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._generate_y_axis_ticks - - @generate_y_axis_ticks.setter - def generate_y_axis_ticks(self, generate_y_axis_ticks): - """Set the generate_y_axis_ticks of this BandViewProperties. - - :param generate_y_axis_ticks: The generate_y_axis_ticks of this BandViewProperties. - :type: list[str] - """ # noqa: E501 - self._generate_y_axis_ticks = generate_y_axis_ticks - - @property - def y_total_ticks(self): - """Get the y_total_ticks of this BandViewProperties. - - :return: The y_total_ticks of this BandViewProperties. - :rtype: int - """ # noqa: E501 - return self._y_total_ticks - - @y_total_ticks.setter - def y_total_ticks(self, y_total_ticks): - """Set the y_total_ticks of this BandViewProperties. - - :param y_total_ticks: The y_total_ticks of this BandViewProperties. - :type: int - """ # noqa: E501 - self._y_total_ticks = y_total_ticks - - @property - def y_tick_start(self): - """Get the y_tick_start of this BandViewProperties. - - :return: The y_tick_start of this BandViewProperties. - :rtype: float - """ # noqa: E501 - return self._y_tick_start - - @y_tick_start.setter - def y_tick_start(self, y_tick_start): - """Set the y_tick_start of this BandViewProperties. - - :param y_tick_start: The y_tick_start of this BandViewProperties. - :type: float - """ # noqa: E501 - self._y_tick_start = y_tick_start - - @property - def y_tick_step(self): - """Get the y_tick_step of this BandViewProperties. - - :return: The y_tick_step of this BandViewProperties. - :rtype: float - """ # noqa: E501 - return self._y_tick_step - - @y_tick_step.setter - def y_tick_step(self, y_tick_step): - """Set the y_tick_step of this BandViewProperties. - - :param y_tick_step: The y_tick_step of this BandViewProperties. - :type: float - """ # noqa: E501 - self._y_tick_step = y_tick_step - - @property - def upper_column(self): - """Get the upper_column of this BandViewProperties. - - :return: The upper_column of this BandViewProperties. - :rtype: str - """ # noqa: E501 - return self._upper_column - - @upper_column.setter - def upper_column(self, upper_column): - """Set the upper_column of this BandViewProperties. - - :param upper_column: The upper_column of this BandViewProperties. - :type: str - """ # noqa: E501 - self._upper_column = upper_column - - @property - def main_column(self): - """Get the main_column of this BandViewProperties. - - :return: The main_column of this BandViewProperties. - :rtype: str - """ # noqa: E501 - return self._main_column - - @main_column.setter - def main_column(self, main_column): - """Set the main_column of this BandViewProperties. - - :param main_column: The main_column of this BandViewProperties. - :type: str - """ # noqa: E501 - self._main_column = main_column - - @property - def lower_column(self): - """Get the lower_column of this BandViewProperties. - - :return: The lower_column of this BandViewProperties. - :rtype: str - """ # noqa: E501 - return self._lower_column - - @lower_column.setter - def lower_column(self, lower_column): - """Set the lower_column of this BandViewProperties. - - :param lower_column: The lower_column of this BandViewProperties. - :type: str - """ # noqa: E501 - self._lower_column = lower_column - - @property - def hover_dimension(self): - """Get the hover_dimension of this BandViewProperties. - - :return: The hover_dimension of this BandViewProperties. - :rtype: str - """ # noqa: E501 - return self._hover_dimension - - @hover_dimension.setter - def hover_dimension(self, hover_dimension): - """Set the hover_dimension of this BandViewProperties. - - :param hover_dimension: The hover_dimension of this BandViewProperties. - :type: str - """ # noqa: E501 - self._hover_dimension = hover_dimension - - @property - def geom(self): - """Get the geom of this BandViewProperties. - - :return: The geom of this BandViewProperties. - :rtype: XYGeom - """ # noqa: E501 - return self._geom - - @geom.setter - def geom(self, geom): - """Set the geom of this BandViewProperties. - - :param geom: The geom of this BandViewProperties. - :type: XYGeom - """ # noqa: E501 - if geom is None: - raise ValueError("Invalid value for `geom`, must not be `None`") # noqa: E501 - self._geom = geom - - @property - def legend_colorize_rows(self): - """Get the legend_colorize_rows of this BandViewProperties. - - :return: The legend_colorize_rows of this BandViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_colorize_rows - - @legend_colorize_rows.setter - def legend_colorize_rows(self, legend_colorize_rows): - """Set the legend_colorize_rows of this BandViewProperties. - - :param legend_colorize_rows: The legend_colorize_rows of this BandViewProperties. - :type: bool - """ # noqa: E501 - self._legend_colorize_rows = legend_colorize_rows - - @property - def legend_hide(self): - """Get the legend_hide of this BandViewProperties. - - :return: The legend_hide of this BandViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_hide - - @legend_hide.setter - def legend_hide(self, legend_hide): - """Set the legend_hide of this BandViewProperties. - - :param legend_hide: The legend_hide of this BandViewProperties. - :type: bool - """ # noqa: E501 - self._legend_hide = legend_hide - - @property - def legend_opacity(self): - """Get the legend_opacity of this BandViewProperties. - - :return: The legend_opacity of this BandViewProperties. - :rtype: float - """ # noqa: E501 - return self._legend_opacity - - @legend_opacity.setter - def legend_opacity(self, legend_opacity): - """Set the legend_opacity of this BandViewProperties. - - :param legend_opacity: The legend_opacity of this BandViewProperties. - :type: float - """ # noqa: E501 - self._legend_opacity = legend_opacity - - @property - def legend_orientation_threshold(self): - """Get the legend_orientation_threshold of this BandViewProperties. - - :return: The legend_orientation_threshold of this BandViewProperties. - :rtype: int - """ # noqa: E501 - return self._legend_orientation_threshold - - @legend_orientation_threshold.setter - def legend_orientation_threshold(self, legend_orientation_threshold): - """Set the legend_orientation_threshold of this BandViewProperties. - - :param legend_orientation_threshold: The legend_orientation_threshold of this BandViewProperties. - :type: int - """ # noqa: E501 - self._legend_orientation_threshold = legend_orientation_threshold - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BandViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/binary_expression.py b/frogpilot/third_party/influxdb_client/domain/binary_expression.py deleted file mode 100644 index 858d4e110..000000000 --- a/frogpilot/third_party/influxdb_client/domain/binary_expression.py +++ /dev/null @@ -1,184 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class BinaryExpression(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'operator': 'str', - 'left': 'Expression', - 'right': 'Expression' - } - - attribute_map = { - 'type': 'type', - 'operator': 'operator', - 'left': 'left', - 'right': 'right' - } - - def __init__(self, type=None, operator=None, left=None, right=None): # noqa: E501,D401,D403 - """BinaryExpression - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._operator = None - self._left = None - self._right = None - self.discriminator = None - - if type is not None: - self.type = type - if operator is not None: - self.operator = operator - if left is not None: - self.left = left - if right is not None: - self.right = right - - @property - def type(self): - """Get the type of this BinaryExpression. - - Type of AST node - - :return: The type of this BinaryExpression. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this BinaryExpression. - - Type of AST node - - :param type: The type of this BinaryExpression. - :type: str - """ # noqa: E501 - self._type = type - - @property - def operator(self): - """Get the operator of this BinaryExpression. - - :return: The operator of this BinaryExpression. - :rtype: str - """ # noqa: E501 - return self._operator - - @operator.setter - def operator(self, operator): - """Set the operator of this BinaryExpression. - - :param operator: The operator of this BinaryExpression. - :type: str - """ # noqa: E501 - self._operator = operator - - @property - def left(self): - """Get the left of this BinaryExpression. - - :return: The left of this BinaryExpression. - :rtype: Expression - """ # noqa: E501 - return self._left - - @left.setter - def left(self, left): - """Set the left of this BinaryExpression. - - :param left: The left of this BinaryExpression. - :type: Expression - """ # noqa: E501 - self._left = left - - @property - def right(self): - """Get the right of this BinaryExpression. - - :return: The right of this BinaryExpression. - :rtype: Expression - """ # noqa: E501 - return self._right - - @right.setter - def right(self, right): - """Set the right of this BinaryExpression. - - :param right: The right of this BinaryExpression. - :type: Expression - """ # noqa: E501 - self._right = right - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BinaryExpression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/block.py b/frogpilot/third_party/influxdb_client/domain/block.py deleted file mode 100644 index b2ddc3660..000000000 --- a/frogpilot/third_party/influxdb_client/domain/block.py +++ /dev/null @@ -1,142 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.node import Node - - -class Block(Node): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'body': 'list[Statement]' - } - - attribute_map = { - 'type': 'type', - 'body': 'body' - } - - def __init__(self, type=None, body=None): # noqa: E501,D401,D403 - """Block - a model defined in OpenAPI.""" # noqa: E501 - Node.__init__(self) # noqa: E501 - - self._type = None - self._body = None - self.discriminator = None - - if type is not None: - self.type = type - if body is not None: - self.body = body - - @property - def type(self): - """Get the type of this Block. - - Type of AST node - - :return: The type of this Block. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this Block. - - Type of AST node - - :param type: The type of this Block. - :type: str - """ # noqa: E501 - self._type = type - - @property - def body(self): - """Get the body of this Block. - - Block body - - :return: The body of this Block. - :rtype: list[Statement] - """ # noqa: E501 - return self._body - - @body.setter - def body(self, body): - """Set the body of this Block. - - Block body - - :param body: The body of this Block. - :type: list[Statement] - """ # noqa: E501 - self._body = body - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Block): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/boolean_literal.py b/frogpilot/third_party/influxdb_client/domain/boolean_literal.py deleted file mode 100644 index 693d7be1a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/boolean_literal.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class BooleanLiteral(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'value': 'bool' - } - - attribute_map = { - 'type': 'type', - 'value': 'value' - } - - def __init__(self, type=None, value=None): # noqa: E501,D401,D403 - """BooleanLiteral - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._value = None - self.discriminator = None - - if type is not None: - self.type = type - if value is not None: - self.value = value - - @property - def type(self): - """Get the type of this BooleanLiteral. - - Type of AST node - - :return: The type of this BooleanLiteral. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this BooleanLiteral. - - Type of AST node - - :param type: The type of this BooleanLiteral. - :type: str - """ # noqa: E501 - self._type = type - - @property - def value(self): - """Get the value of this BooleanLiteral. - - :return: The value of this BooleanLiteral. - :rtype: bool - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this BooleanLiteral. - - :param value: The value of this BooleanLiteral. - :type: bool - """ # noqa: E501 - self._value = value - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BooleanLiteral): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/bucket.py b/frogpilot/third_party/influxdb_client/domain/bucket.py deleted file mode 100644 index fe7d3d6b5..000000000 --- a/frogpilot/third_party/influxdb_client/domain/bucket.py +++ /dev/null @@ -1,366 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Bucket(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'BucketLinks', - 'id': 'str', - 'type': 'str', - 'name': 'str', - 'description': 'str', - 'org_id': 'str', - 'rp': 'str', - 'schema_type': 'SchemaType', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'retention_rules': 'list[BucketRetentionRules]', - 'labels': 'list[Label]' - } - - attribute_map = { - 'links': 'links', - 'id': 'id', - 'type': 'type', - 'name': 'name', - 'description': 'description', - 'org_id': 'orgID', - 'rp': 'rp', - 'schema_type': 'schemaType', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'retention_rules': 'retentionRules', - 'labels': 'labels' - } - - def __init__(self, links=None, id=None, type='user', name=None, description=None, org_id=None, rp=None, schema_type=None, created_at=None, updated_at=None, retention_rules=None, labels=None): # noqa: E501,D401,D403 - """Bucket - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._id = None - self._type = None - self._name = None - self._description = None - self._org_id = None - self._rp = None - self._schema_type = None - self._created_at = None - self._updated_at = None - self._retention_rules = None - self._labels = None - self.discriminator = None - - if links is not None: - self.links = links - if id is not None: - self.id = id - if type is not None: - self.type = type - self.name = name - if description is not None: - self.description = description - if org_id is not None: - self.org_id = org_id - if rp is not None: - self.rp = rp - if schema_type is not None: - self.schema_type = schema_type - if created_at is not None: - self.created_at = created_at - if updated_at is not None: - self.updated_at = updated_at - self.retention_rules = retention_rules - if labels is not None: - self.labels = labels - - @property - def links(self): - """Get the links of this Bucket. - - :return: The links of this Bucket. - :rtype: BucketLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Bucket. - - :param links: The links of this Bucket. - :type: BucketLinks - """ # noqa: E501 - self._links = links - - @property - def id(self): - """Get the id of this Bucket. - - :return: The id of this Bucket. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Bucket. - - :param id: The id of this Bucket. - :type: str - """ # noqa: E501 - self._id = id - - @property - def type(self): - """Get the type of this Bucket. - - :return: The type of this Bucket. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this Bucket. - - :param type: The type of this Bucket. - :type: str - """ # noqa: E501 - self._type = type - - @property - def name(self): - """Get the name of this Bucket. - - :return: The name of this Bucket. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this Bucket. - - :param name: The name of this Bucket. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this Bucket. - - :return: The description of this Bucket. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this Bucket. - - :param description: The description of this Bucket. - :type: str - """ # noqa: E501 - self._description = description - - @property - def org_id(self): - """Get the org_id of this Bucket. - - :return: The org_id of this Bucket. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this Bucket. - - :param org_id: The org_id of this Bucket. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def rp(self): - """Get the rp of this Bucket. - - :return: The rp of this Bucket. - :rtype: str - """ # noqa: E501 - return self._rp - - @rp.setter - def rp(self, rp): - """Set the rp of this Bucket. - - :param rp: The rp of this Bucket. - :type: str - """ # noqa: E501 - self._rp = rp - - @property - def schema_type(self): - """Get the schema_type of this Bucket. - - :return: The schema_type of this Bucket. - :rtype: SchemaType - """ # noqa: E501 - return self._schema_type - - @schema_type.setter - def schema_type(self, schema_type): - """Set the schema_type of this Bucket. - - :param schema_type: The schema_type of this Bucket. - :type: SchemaType - """ # noqa: E501 - self._schema_type = schema_type - - @property - def created_at(self): - """Get the created_at of this Bucket. - - :return: The created_at of this Bucket. - :rtype: datetime - """ # noqa: E501 - return self._created_at - - @created_at.setter - def created_at(self, created_at): - """Set the created_at of this Bucket. - - :param created_at: The created_at of this Bucket. - :type: datetime - """ # noqa: E501 - self._created_at = created_at - - @property - def updated_at(self): - """Get the updated_at of this Bucket. - - :return: The updated_at of this Bucket. - :rtype: datetime - """ # noqa: E501 - return self._updated_at - - @updated_at.setter - def updated_at(self, updated_at): - """Set the updated_at of this Bucket. - - :param updated_at: The updated_at of this Bucket. - :type: datetime - """ # noqa: E501 - self._updated_at = updated_at - - @property - def retention_rules(self): - """Get the retention_rules of this Bucket. - - Retention rules to expire or retain data. The InfluxDB `/api/v2` API uses `RetentionRules` to configure the [retention period](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-period). #### InfluxDB Cloud - `retentionRules` is required. #### InfluxDB OSS - `retentionRules` isn't required. - - :return: The retention_rules of this Bucket. - :rtype: list[BucketRetentionRules] - """ # noqa: E501 - return self._retention_rules - - @retention_rules.setter - def retention_rules(self, retention_rules): - """Set the retention_rules of this Bucket. - - Retention rules to expire or retain data. The InfluxDB `/api/v2` API uses `RetentionRules` to configure the [retention period](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-period). #### InfluxDB Cloud - `retentionRules` is required. #### InfluxDB OSS - `retentionRules` isn't required. - - :param retention_rules: The retention_rules of this Bucket. - :type: list[BucketRetentionRules] - """ # noqa: E501 - if retention_rules is None: - raise ValueError("Invalid value for `retention_rules`, must not be `None`") # noqa: E501 - self._retention_rules = retention_rules - - @property - def labels(self): - """Get the labels of this Bucket. - - :return: The labels of this Bucket. - :rtype: list[Label] - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this Bucket. - - :param labels: The labels of this Bucket. - :type: list[Label] - """ # noqa: E501 - self._labels = labels - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Bucket): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/bucket_links.py b/frogpilot/third_party/influxdb_client/domain/bucket_links.py deleted file mode 100644 index a4cef1aae..000000000 --- a/frogpilot/third_party/influxdb_client/domain/bucket_links.py +++ /dev/null @@ -1,246 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class BucketLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'labels': 'str', - 'members': 'str', - 'org': 'str', - 'owners': 'str', - '_self': 'str', - 'write': 'str' - } - - attribute_map = { - 'labels': 'labels', - 'members': 'members', - 'org': 'org', - 'owners': 'owners', - '_self': 'self', - 'write': 'write' - } - - def __init__(self, labels=None, members=None, org=None, owners=None, _self=None, write=None): # noqa: E501,D401,D403 - """BucketLinks - a model defined in OpenAPI.""" # noqa: E501 - self._labels = None - self._members = None - self._org = None - self._owners = None - self.__self = None - self._write = None - self.discriminator = None - - if labels is not None: - self.labels = labels - if members is not None: - self.members = members - if org is not None: - self.org = org - if owners is not None: - self.owners = owners - if _self is not None: - self._self = _self - if write is not None: - self.write = write - - @property - def labels(self): - """Get the labels of this BucketLinks. - - URI of resource. - - :return: The labels of this BucketLinks. - :rtype: str - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this BucketLinks. - - URI of resource. - - :param labels: The labels of this BucketLinks. - :type: str - """ # noqa: E501 - self._labels = labels - - @property - def members(self): - """Get the members of this BucketLinks. - - URI of resource. - - :return: The members of this BucketLinks. - :rtype: str - """ # noqa: E501 - return self._members - - @members.setter - def members(self, members): - """Set the members of this BucketLinks. - - URI of resource. - - :param members: The members of this BucketLinks. - :type: str - """ # noqa: E501 - self._members = members - - @property - def org(self): - """Get the org of this BucketLinks. - - URI of resource. - - :return: The org of this BucketLinks. - :rtype: str - """ # noqa: E501 - return self._org - - @org.setter - def org(self, org): - """Set the org of this BucketLinks. - - URI of resource. - - :param org: The org of this BucketLinks. - :type: str - """ # noqa: E501 - self._org = org - - @property - def owners(self): - """Get the owners of this BucketLinks. - - URI of resource. - - :return: The owners of this BucketLinks. - :rtype: str - """ # noqa: E501 - return self._owners - - @owners.setter - def owners(self, owners): - """Set the owners of this BucketLinks. - - URI of resource. - - :param owners: The owners of this BucketLinks. - :type: str - """ # noqa: E501 - self._owners = owners - - @property - def _self(self): - """Get the _self of this BucketLinks. - - URI of resource. - - :return: The _self of this BucketLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this BucketLinks. - - URI of resource. - - :param _self: The _self of this BucketLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - @property - def write(self): - """Get the write of this BucketLinks. - - URI of resource. - - :return: The write of this BucketLinks. - :rtype: str - """ # noqa: E501 - return self._write - - @write.setter - def write(self, write): - """Set the write of this BucketLinks. - - URI of resource. - - :param write: The write of this BucketLinks. - :type: str - """ # noqa: E501 - self._write = write - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BucketLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/bucket_metadata_manifest.py b/frogpilot/third_party/influxdb_client/domain/bucket_metadata_manifest.py deleted file mode 100644 index c87ec20e1..000000000 --- a/frogpilot/third_party/influxdb_client/domain/bucket_metadata_manifest.py +++ /dev/null @@ -1,251 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class BucketMetadataManifest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'organization_id': 'str', - 'organization_name': 'str', - 'bucket_id': 'str', - 'bucket_name': 'str', - 'description': 'str', - 'default_retention_policy': 'str', - 'retention_policies': 'list[RetentionPolicyManifest]' - } - - attribute_map = { - 'organization_id': 'organizationID', - 'organization_name': 'organizationName', - 'bucket_id': 'bucketID', - 'bucket_name': 'bucketName', - 'description': 'description', - 'default_retention_policy': 'defaultRetentionPolicy', - 'retention_policies': 'retentionPolicies' - } - - def __init__(self, organization_id=None, organization_name=None, bucket_id=None, bucket_name=None, description=None, default_retention_policy=None, retention_policies=None): # noqa: E501,D401,D403 - """BucketMetadataManifest - a model defined in OpenAPI.""" # noqa: E501 - self._organization_id = None - self._organization_name = None - self._bucket_id = None - self._bucket_name = None - self._description = None - self._default_retention_policy = None - self._retention_policies = None - self.discriminator = None - - self.organization_id = organization_id - self.organization_name = organization_name - self.bucket_id = bucket_id - self.bucket_name = bucket_name - if description is not None: - self.description = description - self.default_retention_policy = default_retention_policy - self.retention_policies = retention_policies - - @property - def organization_id(self): - """Get the organization_id of this BucketMetadataManifest. - - :return: The organization_id of this BucketMetadataManifest. - :rtype: str - """ # noqa: E501 - return self._organization_id - - @organization_id.setter - def organization_id(self, organization_id): - """Set the organization_id of this BucketMetadataManifest. - - :param organization_id: The organization_id of this BucketMetadataManifest. - :type: str - """ # noqa: E501 - if organization_id is None: - raise ValueError("Invalid value for `organization_id`, must not be `None`") # noqa: E501 - self._organization_id = organization_id - - @property - def organization_name(self): - """Get the organization_name of this BucketMetadataManifest. - - :return: The organization_name of this BucketMetadataManifest. - :rtype: str - """ # noqa: E501 - return self._organization_name - - @organization_name.setter - def organization_name(self, organization_name): - """Set the organization_name of this BucketMetadataManifest. - - :param organization_name: The organization_name of this BucketMetadataManifest. - :type: str - """ # noqa: E501 - if organization_name is None: - raise ValueError("Invalid value for `organization_name`, must not be `None`") # noqa: E501 - self._organization_name = organization_name - - @property - def bucket_id(self): - """Get the bucket_id of this BucketMetadataManifest. - - :return: The bucket_id of this BucketMetadataManifest. - :rtype: str - """ # noqa: E501 - return self._bucket_id - - @bucket_id.setter - def bucket_id(self, bucket_id): - """Set the bucket_id of this BucketMetadataManifest. - - :param bucket_id: The bucket_id of this BucketMetadataManifest. - :type: str - """ # noqa: E501 - if bucket_id is None: - raise ValueError("Invalid value for `bucket_id`, must not be `None`") # noqa: E501 - self._bucket_id = bucket_id - - @property - def bucket_name(self): - """Get the bucket_name of this BucketMetadataManifest. - - :return: The bucket_name of this BucketMetadataManifest. - :rtype: str - """ # noqa: E501 - return self._bucket_name - - @bucket_name.setter - def bucket_name(self, bucket_name): - """Set the bucket_name of this BucketMetadataManifest. - - :param bucket_name: The bucket_name of this BucketMetadataManifest. - :type: str - """ # noqa: E501 - if bucket_name is None: - raise ValueError("Invalid value for `bucket_name`, must not be `None`") # noqa: E501 - self._bucket_name = bucket_name - - @property - def description(self): - """Get the description of this BucketMetadataManifest. - - :return: The description of this BucketMetadataManifest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this BucketMetadataManifest. - - :param description: The description of this BucketMetadataManifest. - :type: str - """ # noqa: E501 - self._description = description - - @property - def default_retention_policy(self): - """Get the default_retention_policy of this BucketMetadataManifest. - - :return: The default_retention_policy of this BucketMetadataManifest. - :rtype: str - """ # noqa: E501 - return self._default_retention_policy - - @default_retention_policy.setter - def default_retention_policy(self, default_retention_policy): - """Set the default_retention_policy of this BucketMetadataManifest. - - :param default_retention_policy: The default_retention_policy of this BucketMetadataManifest. - :type: str - """ # noqa: E501 - if default_retention_policy is None: - raise ValueError("Invalid value for `default_retention_policy`, must not be `None`") # noqa: E501 - self._default_retention_policy = default_retention_policy - - @property - def retention_policies(self): - """Get the retention_policies of this BucketMetadataManifest. - - :return: The retention_policies of this BucketMetadataManifest. - :rtype: list[RetentionPolicyManifest] - """ # noqa: E501 - return self._retention_policies - - @retention_policies.setter - def retention_policies(self, retention_policies): - """Set the retention_policies of this BucketMetadataManifest. - - :param retention_policies: The retention_policies of this BucketMetadataManifest. - :type: list[RetentionPolicyManifest] - """ # noqa: E501 - if retention_policies is None: - raise ValueError("Invalid value for `retention_policies`, must not be `None`") # noqa: E501 - self._retention_policies = retention_policies - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BucketMetadataManifest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/bucket_retention_rules.py b/frogpilot/third_party/influxdb_client/domain/bucket_retention_rules.py deleted file mode 100644 index 2359eb73e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/bucket_retention_rules.py +++ /dev/null @@ -1,164 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class BucketRetentionRules(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'every_seconds': 'int', - 'shard_group_duration_seconds': 'int' - } - - attribute_map = { - 'type': 'type', - 'every_seconds': 'everySeconds', - 'shard_group_duration_seconds': 'shardGroupDurationSeconds' - } - - def __init__(self, type='expire', every_seconds=2592000, shard_group_duration_seconds=None): # noqa: E501,D401,D403 - """BucketRetentionRules - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self._every_seconds = None - self._shard_group_duration_seconds = None - self.discriminator = None - - if type is not None: - self.type = type - self.every_seconds = every_seconds - if shard_group_duration_seconds is not None: - self.shard_group_duration_seconds = shard_group_duration_seconds - - @property - def type(self): - """Get the type of this BucketRetentionRules. - - :return: The type of this BucketRetentionRules. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this BucketRetentionRules. - - :param type: The type of this BucketRetentionRules. - :type: str - """ # noqa: E501 - self._type = type - - @property - def every_seconds(self): - """Get the every_seconds of this BucketRetentionRules. - - The duration in seconds for how long data will be kept in the database. The default duration is 2592000 (30 days). 0 represents infinite retention. - - :return: The every_seconds of this BucketRetentionRules. - :rtype: int - """ # noqa: E501 - return self._every_seconds - - @every_seconds.setter - def every_seconds(self, every_seconds): - """Set the every_seconds of this BucketRetentionRules. - - The duration in seconds for how long data will be kept in the database. The default duration is 2592000 (30 days). 0 represents infinite retention. - - :param every_seconds: The every_seconds of this BucketRetentionRules. - :type: int - """ # noqa: E501 - if every_seconds is None: - raise ValueError("Invalid value for `every_seconds`, must not be `None`") # noqa: E501 - if every_seconds is not None and every_seconds < 0: # noqa: E501 - raise ValueError("Invalid value for `every_seconds`, must be a value greater than or equal to `0`") # noqa: E501 - self._every_seconds = every_seconds - - @property - def shard_group_duration_seconds(self): - """Get the shard_group_duration_seconds of this BucketRetentionRules. - - The shard group duration. The duration or interval (in seconds) that each shard group covers. #### InfluxDB Cloud - Does not use `shardGroupDurationsSeconds`. #### InfluxDB OSS - Default value depends on the [bucket retention period](https://docs.influxdata.com/influxdb/latest/reference/internals/shards/#shard-group-duration). - - :return: The shard_group_duration_seconds of this BucketRetentionRules. - :rtype: int - """ # noqa: E501 - return self._shard_group_duration_seconds - - @shard_group_duration_seconds.setter - def shard_group_duration_seconds(self, shard_group_duration_seconds): - """Set the shard_group_duration_seconds of this BucketRetentionRules. - - The shard group duration. The duration or interval (in seconds) that each shard group covers. #### InfluxDB Cloud - Does not use `shardGroupDurationsSeconds`. #### InfluxDB OSS - Default value depends on the [bucket retention period](https://docs.influxdata.com/influxdb/latest/reference/internals/shards/#shard-group-duration). - - :param shard_group_duration_seconds: The shard_group_duration_seconds of this BucketRetentionRules. - :type: int - """ # noqa: E501 - self._shard_group_duration_seconds = shard_group_duration_seconds - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BucketRetentionRules): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/bucket_shard_mapping.py b/frogpilot/third_party/influxdb_client/domain/bucket_shard_mapping.py deleted file mode 100644 index 1bf7c277d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/bucket_shard_mapping.py +++ /dev/null @@ -1,132 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class BucketShardMapping(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'old_id': 'int', - 'new_id': 'int' - } - - attribute_map = { - 'old_id': 'oldId', - 'new_id': 'newId' - } - - def __init__(self, old_id=None, new_id=None): # noqa: E501,D401,D403 - """BucketShardMapping - a model defined in OpenAPI.""" # noqa: E501 - self._old_id = None - self._new_id = None - self.discriminator = None - - self.old_id = old_id - self.new_id = new_id - - @property - def old_id(self): - """Get the old_id of this BucketShardMapping. - - :return: The old_id of this BucketShardMapping. - :rtype: int - """ # noqa: E501 - return self._old_id - - @old_id.setter - def old_id(self, old_id): - """Set the old_id of this BucketShardMapping. - - :param old_id: The old_id of this BucketShardMapping. - :type: int - """ # noqa: E501 - if old_id is None: - raise ValueError("Invalid value for `old_id`, must not be `None`") # noqa: E501 - self._old_id = old_id - - @property - def new_id(self): - """Get the new_id of this BucketShardMapping. - - :return: The new_id of this BucketShardMapping. - :rtype: int - """ # noqa: E501 - return self._new_id - - @new_id.setter - def new_id(self, new_id): - """Set the new_id of this BucketShardMapping. - - :param new_id: The new_id of this BucketShardMapping. - :type: int - """ # noqa: E501 - if new_id is None: - raise ValueError("Invalid value for `new_id`, must not be `None`") # noqa: E501 - self._new_id = new_id - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BucketShardMapping): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/buckets.py b/frogpilot/third_party/influxdb_client/domain/buckets.py deleted file mode 100644 index de3277f75..000000000 --- a/frogpilot/third_party/influxdb_client/domain/buckets.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Buckets(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'Links', - 'buckets': 'list[Bucket]' - } - - attribute_map = { - 'links': 'links', - 'buckets': 'buckets' - } - - def __init__(self, links=None, buckets=None): # noqa: E501,D401,D403 - """Buckets - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._buckets = None - self.discriminator = None - - if links is not None: - self.links = links - if buckets is not None: - self.buckets = buckets - - @property - def links(self): - """Get the links of this Buckets. - - :return: The links of this Buckets. - :rtype: Links - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Buckets. - - :param links: The links of this Buckets. - :type: Links - """ # noqa: E501 - self._links = links - - @property - def buckets(self): - """Get the buckets of this Buckets. - - :return: The buckets of this Buckets. - :rtype: list[Bucket] - """ # noqa: E501 - return self._buckets - - @buckets.setter - def buckets(self, buckets): - """Set the buckets of this Buckets. - - :param buckets: The buckets of this Buckets. - :type: list[Bucket] - """ # noqa: E501 - self._buckets = buckets - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Buckets): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/builder_aggregate_function_type.py b/frogpilot/third_party/influxdb_client/domain/builder_aggregate_function_type.py deleted file mode 100644 index 0cbf6b676..000000000 --- a/frogpilot/third_party/influxdb_client/domain/builder_aggregate_function_type.py +++ /dev/null @@ -1,88 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class BuilderAggregateFunctionType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - FILTER = "filter" - GROUP = "group" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """BuilderAggregateFunctionType - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BuilderAggregateFunctionType): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/builder_config.py b/frogpilot/third_party/influxdb_client/domain/builder_config.py deleted file mode 100644 index e8a2d0258..000000000 --- a/frogpilot/third_party/influxdb_client/domain/builder_config.py +++ /dev/null @@ -1,176 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class BuilderConfig(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'buckets': 'list[str]', - 'tags': 'list[BuilderTagsType]', - 'functions': 'list[BuilderFunctionsType]', - 'aggregate_window': 'BuilderConfigAggregateWindow' - } - - attribute_map = { - 'buckets': 'buckets', - 'tags': 'tags', - 'functions': 'functions', - 'aggregate_window': 'aggregateWindow' - } - - def __init__(self, buckets=None, tags=None, functions=None, aggregate_window=None): # noqa: E501,D401,D403 - """BuilderConfig - a model defined in OpenAPI.""" # noqa: E501 - self._buckets = None - self._tags = None - self._functions = None - self._aggregate_window = None - self.discriminator = None - - if buckets is not None: - self.buckets = buckets - if tags is not None: - self.tags = tags - if functions is not None: - self.functions = functions - if aggregate_window is not None: - self.aggregate_window = aggregate_window - - @property - def buckets(self): - """Get the buckets of this BuilderConfig. - - :return: The buckets of this BuilderConfig. - :rtype: list[str] - """ # noqa: E501 - return self._buckets - - @buckets.setter - def buckets(self, buckets): - """Set the buckets of this BuilderConfig. - - :param buckets: The buckets of this BuilderConfig. - :type: list[str] - """ # noqa: E501 - self._buckets = buckets - - @property - def tags(self): - """Get the tags of this BuilderConfig. - - :return: The tags of this BuilderConfig. - :rtype: list[BuilderTagsType] - """ # noqa: E501 - return self._tags - - @tags.setter - def tags(self, tags): - """Set the tags of this BuilderConfig. - - :param tags: The tags of this BuilderConfig. - :type: list[BuilderTagsType] - """ # noqa: E501 - self._tags = tags - - @property - def functions(self): - """Get the functions of this BuilderConfig. - - :return: The functions of this BuilderConfig. - :rtype: list[BuilderFunctionsType] - """ # noqa: E501 - return self._functions - - @functions.setter - def functions(self, functions): - """Set the functions of this BuilderConfig. - - :param functions: The functions of this BuilderConfig. - :type: list[BuilderFunctionsType] - """ # noqa: E501 - self._functions = functions - - @property - def aggregate_window(self): - """Get the aggregate_window of this BuilderConfig. - - :return: The aggregate_window of this BuilderConfig. - :rtype: BuilderConfigAggregateWindow - """ # noqa: E501 - return self._aggregate_window - - @aggregate_window.setter - def aggregate_window(self, aggregate_window): - """Set the aggregate_window of this BuilderConfig. - - :param aggregate_window: The aggregate_window of this BuilderConfig. - :type: BuilderConfigAggregateWindow - """ # noqa: E501 - self._aggregate_window = aggregate_window - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BuilderConfig): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/builder_config_aggregate_window.py b/frogpilot/third_party/influxdb_client/domain/builder_config_aggregate_window.py deleted file mode 100644 index bcdde38d9..000000000 --- a/frogpilot/third_party/influxdb_client/domain/builder_config_aggregate_window.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class BuilderConfigAggregateWindow(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'period': 'str', - 'fill_values': 'bool' - } - - attribute_map = { - 'period': 'period', - 'fill_values': 'fillValues' - } - - def __init__(self, period=None, fill_values=None): # noqa: E501,D401,D403 - """BuilderConfigAggregateWindow - a model defined in OpenAPI.""" # noqa: E501 - self._period = None - self._fill_values = None - self.discriminator = None - - if period is not None: - self.period = period - if fill_values is not None: - self.fill_values = fill_values - - @property - def period(self): - """Get the period of this BuilderConfigAggregateWindow. - - :return: The period of this BuilderConfigAggregateWindow. - :rtype: str - """ # noqa: E501 - return self._period - - @period.setter - def period(self, period): - """Set the period of this BuilderConfigAggregateWindow. - - :param period: The period of this BuilderConfigAggregateWindow. - :type: str - """ # noqa: E501 - self._period = period - - @property - def fill_values(self): - """Get the fill_values of this BuilderConfigAggregateWindow. - - :return: The fill_values of this BuilderConfigAggregateWindow. - :rtype: bool - """ # noqa: E501 - return self._fill_values - - @fill_values.setter - def fill_values(self, fill_values): - """Set the fill_values of this BuilderConfigAggregateWindow. - - :param fill_values: The fill_values of this BuilderConfigAggregateWindow. - :type: bool - """ # noqa: E501 - self._fill_values = fill_values - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BuilderConfigAggregateWindow): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/builder_functions_type.py b/frogpilot/third_party/influxdb_client/domain/builder_functions_type.py deleted file mode 100644 index 4ebf44ea9..000000000 --- a/frogpilot/third_party/influxdb_client/domain/builder_functions_type.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class BuilderFunctionsType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str' - } - - attribute_map = { - 'name': 'name' - } - - def __init__(self, name=None): # noqa: E501,D401,D403 - """BuilderFunctionsType - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self.discriminator = None - - if name is not None: - self.name = name - - @property - def name(self): - """Get the name of this BuilderFunctionsType. - - :return: The name of this BuilderFunctionsType. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this BuilderFunctionsType. - - :param name: The name of this BuilderFunctionsType. - :type: str - """ # noqa: E501 - self._name = name - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BuilderFunctionsType): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/builder_tags_type.py b/frogpilot/third_party/influxdb_client/domain/builder_tags_type.py deleted file mode 100644 index fcf7e05e1..000000000 --- a/frogpilot/third_party/influxdb_client/domain/builder_tags_type.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class BuilderTagsType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'key': 'str', - 'values': 'list[str]', - 'aggregate_function_type': 'BuilderAggregateFunctionType' - } - - attribute_map = { - 'key': 'key', - 'values': 'values', - 'aggregate_function_type': 'aggregateFunctionType' - } - - def __init__(self, key=None, values=None, aggregate_function_type=None): # noqa: E501,D401,D403 - """BuilderTagsType - a model defined in OpenAPI.""" # noqa: E501 - self._key = None - self._values = None - self._aggregate_function_type = None - self.discriminator = None - - if key is not None: - self.key = key - if values is not None: - self.values = values - if aggregate_function_type is not None: - self.aggregate_function_type = aggregate_function_type - - @property - def key(self): - """Get the key of this BuilderTagsType. - - :return: The key of this BuilderTagsType. - :rtype: str - """ # noqa: E501 - return self._key - - @key.setter - def key(self, key): - """Set the key of this BuilderTagsType. - - :param key: The key of this BuilderTagsType. - :type: str - """ # noqa: E501 - self._key = key - - @property - def values(self): - """Get the values of this BuilderTagsType. - - :return: The values of this BuilderTagsType. - :rtype: list[str] - """ # noqa: E501 - return self._values - - @values.setter - def values(self, values): - """Set the values of this BuilderTagsType. - - :param values: The values of this BuilderTagsType. - :type: list[str] - """ # noqa: E501 - self._values = values - - @property - def aggregate_function_type(self): - """Get the aggregate_function_type of this BuilderTagsType. - - :return: The aggregate_function_type of this BuilderTagsType. - :rtype: BuilderAggregateFunctionType - """ # noqa: E501 - return self._aggregate_function_type - - @aggregate_function_type.setter - def aggregate_function_type(self, aggregate_function_type): - """Set the aggregate_function_type of this BuilderTagsType. - - :param aggregate_function_type: The aggregate_function_type of this BuilderTagsType. - :type: BuilderAggregateFunctionType - """ # noqa: E501 - self._aggregate_function_type = aggregate_function_type - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BuilderTagsType): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/builtin_statement.py b/frogpilot/third_party/influxdb_client/domain/builtin_statement.py deleted file mode 100644 index 51f24a317..000000000 --- a/frogpilot/third_party/influxdb_client/domain/builtin_statement.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.statement import Statement - - -class BuiltinStatement(Statement): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'id': 'Identifier' - } - - attribute_map = { - 'type': 'type', - 'id': 'id' - } - - def __init__(self, type=None, id=None): # noqa: E501,D401,D403 - """BuiltinStatement - a model defined in OpenAPI.""" # noqa: E501 - Statement.__init__(self) # noqa: E501 - - self._type = None - self._id = None - self.discriminator = None - - if type is not None: - self.type = type - if id is not None: - self.id = id - - @property - def type(self): - """Get the type of this BuiltinStatement. - - Type of AST node - - :return: The type of this BuiltinStatement. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this BuiltinStatement. - - Type of AST node - - :param type: The type of this BuiltinStatement. - :type: str - """ # noqa: E501 - self._type = type - - @property - def id(self): - """Get the id of this BuiltinStatement. - - :return: The id of this BuiltinStatement. - :rtype: Identifier - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this BuiltinStatement. - - :param id: The id of this BuiltinStatement. - :type: Identifier - """ # noqa: E501 - self._id = id - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, BuiltinStatement): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/call_expression.py b/frogpilot/third_party/influxdb_client/domain/call_expression.py deleted file mode 100644 index 922b705d2..000000000 --- a/frogpilot/third_party/influxdb_client/domain/call_expression.py +++ /dev/null @@ -1,165 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class CallExpression(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'callee': 'Expression', - 'arguments': 'list[Expression]' - } - - attribute_map = { - 'type': 'type', - 'callee': 'callee', - 'arguments': 'arguments' - } - - def __init__(self, type=None, callee=None, arguments=None): # noqa: E501,D401,D403 - """CallExpression - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._callee = None - self._arguments = None - self.discriminator = None - - if type is not None: - self.type = type - if callee is not None: - self.callee = callee - if arguments is not None: - self.arguments = arguments - - @property - def type(self): - """Get the type of this CallExpression. - - Type of AST node - - :return: The type of this CallExpression. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this CallExpression. - - Type of AST node - - :param type: The type of this CallExpression. - :type: str - """ # noqa: E501 - self._type = type - - @property - def callee(self): - """Get the callee of this CallExpression. - - :return: The callee of this CallExpression. - :rtype: Expression - """ # noqa: E501 - return self._callee - - @callee.setter - def callee(self, callee): - """Set the callee of this CallExpression. - - :param callee: The callee of this CallExpression. - :type: Expression - """ # noqa: E501 - self._callee = callee - - @property - def arguments(self): - """Get the arguments of this CallExpression. - - Function arguments - - :return: The arguments of this CallExpression. - :rtype: list[Expression] - """ # noqa: E501 - return self._arguments - - @arguments.setter - def arguments(self, arguments): - """Set the arguments of this CallExpression. - - Function arguments - - :param arguments: The arguments of this CallExpression. - :type: list[Expression] - """ # noqa: E501 - self._arguments = arguments - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, CallExpression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/cell.py b/frogpilot/third_party/influxdb_client/domain/cell.py deleted file mode 100644 index d52d9476f..000000000 --- a/frogpilot/third_party/influxdb_client/domain/cell.py +++ /dev/null @@ -1,249 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Cell(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'links': 'CellLinks', - 'x': 'int', - 'y': 'int', - 'w': 'int', - 'h': 'int', - 'view_id': 'str' - } - - attribute_map = { - 'id': 'id', - 'links': 'links', - 'x': 'x', - 'y': 'y', - 'w': 'w', - 'h': 'h', - 'view_id': 'viewID' - } - - def __init__(self, id=None, links=None, x=None, y=None, w=None, h=None, view_id=None): # noqa: E501,D401,D403 - """Cell - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._links = None - self._x = None - self._y = None - self._w = None - self._h = None - self._view_id = None - self.discriminator = None - - if id is not None: - self.id = id - if links is not None: - self.links = links - if x is not None: - self.x = x - if y is not None: - self.y = y - if w is not None: - self.w = w - if h is not None: - self.h = h - if view_id is not None: - self.view_id = view_id - - @property - def id(self): - """Get the id of this Cell. - - :return: The id of this Cell. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Cell. - - :param id: The id of this Cell. - :type: str - """ # noqa: E501 - self._id = id - - @property - def links(self): - """Get the links of this Cell. - - :return: The links of this Cell. - :rtype: CellLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Cell. - - :param links: The links of this Cell. - :type: CellLinks - """ # noqa: E501 - self._links = links - - @property - def x(self): - """Get the x of this Cell. - - :return: The x of this Cell. - :rtype: int - """ # noqa: E501 - return self._x - - @x.setter - def x(self, x): - """Set the x of this Cell. - - :param x: The x of this Cell. - :type: int - """ # noqa: E501 - self._x = x - - @property - def y(self): - """Get the y of this Cell. - - :return: The y of this Cell. - :rtype: int - """ # noqa: E501 - return self._y - - @y.setter - def y(self, y): - """Set the y of this Cell. - - :param y: The y of this Cell. - :type: int - """ # noqa: E501 - self._y = y - - @property - def w(self): - """Get the w of this Cell. - - :return: The w of this Cell. - :rtype: int - """ # noqa: E501 - return self._w - - @w.setter - def w(self, w): - """Set the w of this Cell. - - :param w: The w of this Cell. - :type: int - """ # noqa: E501 - self._w = w - - @property - def h(self): - """Get the h of this Cell. - - :return: The h of this Cell. - :rtype: int - """ # noqa: E501 - return self._h - - @h.setter - def h(self, h): - """Set the h of this Cell. - - :param h: The h of this Cell. - :type: int - """ # noqa: E501 - self._h = h - - @property - def view_id(self): - """Get the view_id of this Cell. - - The reference to a view from the views API. - - :return: The view_id of this Cell. - :rtype: str - """ # noqa: E501 - return self._view_id - - @view_id.setter - def view_id(self, view_id): - """Set the view_id of this Cell. - - The reference to a view from the views API. - - :param view_id: The view_id of this Cell. - :type: str - """ # noqa: E501 - self._view_id = view_id - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Cell): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/cell_links.py b/frogpilot/third_party/influxdb_client/domain/cell_links.py deleted file mode 100644 index fc556c728..000000000 --- a/frogpilot/third_party/influxdb_client/domain/cell_links.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class CellLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str', - 'view': 'str' - } - - attribute_map = { - '_self': 'self', - 'view': 'view' - } - - def __init__(self, _self=None, view=None): # noqa: E501,D401,D403 - """CellLinks - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self._view = None - self.discriminator = None - - if _self is not None: - self._self = _self - if view is not None: - self.view = view - - @property - def _self(self): - """Get the _self of this CellLinks. - - :return: The _self of this CellLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this CellLinks. - - :param _self: The _self of this CellLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - @property - def view(self): - """Get the view of this CellLinks. - - :return: The view of this CellLinks. - :rtype: str - """ # noqa: E501 - return self._view - - @view.setter - def view(self, view): - """Set the view of this CellLinks. - - :param view: The view of this CellLinks. - :type: str - """ # noqa: E501 - self._view = view - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, CellLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/cell_update.py b/frogpilot/third_party/influxdb_client/domain/cell_update.py deleted file mode 100644 index d58c62577..000000000 --- a/frogpilot/third_party/influxdb_client/domain/cell_update.py +++ /dev/null @@ -1,176 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class CellUpdate(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'x': 'int', - 'y': 'int', - 'w': 'int', - 'h': 'int' - } - - attribute_map = { - 'x': 'x', - 'y': 'y', - 'w': 'w', - 'h': 'h' - } - - def __init__(self, x=None, y=None, w=None, h=None): # noqa: E501,D401,D403 - """CellUpdate - a model defined in OpenAPI.""" # noqa: E501 - self._x = None - self._y = None - self._w = None - self._h = None - self.discriminator = None - - if x is not None: - self.x = x - if y is not None: - self.y = y - if w is not None: - self.w = w - if h is not None: - self.h = h - - @property - def x(self): - """Get the x of this CellUpdate. - - :return: The x of this CellUpdate. - :rtype: int - """ # noqa: E501 - return self._x - - @x.setter - def x(self, x): - """Set the x of this CellUpdate. - - :param x: The x of this CellUpdate. - :type: int - """ # noqa: E501 - self._x = x - - @property - def y(self): - """Get the y of this CellUpdate. - - :return: The y of this CellUpdate. - :rtype: int - """ # noqa: E501 - return self._y - - @y.setter - def y(self, y): - """Set the y of this CellUpdate. - - :param y: The y of this CellUpdate. - :type: int - """ # noqa: E501 - self._y = y - - @property - def w(self): - """Get the w of this CellUpdate. - - :return: The w of this CellUpdate. - :rtype: int - """ # noqa: E501 - return self._w - - @w.setter - def w(self, w): - """Set the w of this CellUpdate. - - :param w: The w of this CellUpdate. - :type: int - """ # noqa: E501 - self._w = w - - @property - def h(self): - """Get the h of this CellUpdate. - - :return: The h of this CellUpdate. - :rtype: int - """ # noqa: E501 - return self._h - - @h.setter - def h(self, h): - """Set the h of this CellUpdate. - - :param h: The h of this CellUpdate. - :type: int - """ # noqa: E501 - self._h = h - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, CellUpdate): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/cell_with_view_properties.py b/frogpilot/third_party/influxdb_client/domain/cell_with_view_properties.py deleted file mode 100644 index 4379cd11c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/cell_with_view_properties.py +++ /dev/null @@ -1,148 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.cell import Cell - - -class CellWithViewProperties(Cell): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'properties': 'ViewProperties', - 'id': 'str', - 'links': 'CellLinks', - 'x': 'int', - 'y': 'int', - 'w': 'int', - 'h': 'int', - 'view_id': 'str' - } - - attribute_map = { - 'name': 'name', - 'properties': 'properties', - 'id': 'id', - 'links': 'links', - 'x': 'x', - 'y': 'y', - 'w': 'w', - 'h': 'h', - 'view_id': 'viewID' - } - - def __init__(self, name=None, properties=None, id=None, links=None, x=None, y=None, w=None, h=None, view_id=None): # noqa: E501,D401,D403 - """CellWithViewProperties - a model defined in OpenAPI.""" # noqa: E501 - Cell.__init__(self, id=id, links=links, x=x, y=y, w=w, h=h, view_id=view_id) # noqa: E501 - - self._name = None - self._properties = None - self.discriminator = None - - if name is not None: - self.name = name - if properties is not None: - self.properties = properties - - @property - def name(self): - """Get the name of this CellWithViewProperties. - - :return: The name of this CellWithViewProperties. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this CellWithViewProperties. - - :param name: The name of this CellWithViewProperties. - :type: str - """ # noqa: E501 - self._name = name - - @property - def properties(self): - """Get the properties of this CellWithViewProperties. - - :return: The properties of this CellWithViewProperties. - :rtype: ViewProperties - """ # noqa: E501 - return self._properties - - @properties.setter - def properties(self, properties): - """Set the properties of this CellWithViewProperties. - - :param properties: The properties of this CellWithViewProperties. - :type: ViewProperties - """ # noqa: E501 - self._properties = properties - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, CellWithViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/check.py b/frogpilot/third_party/influxdb_client/domain/check.py deleted file mode 100644 index c85e4a558..000000000 --- a/frogpilot/third_party/influxdb_client/domain/check.py +++ /dev/null @@ -1,120 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Check(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str' - } - - attribute_map = { - 'type': 'type' - } - - discriminator_value_class_map = { - 'deadman': 'DeadmanCheck', - 'custom': 'CustomCheck', - 'threshold': 'ThresholdCheck' - } - - def __init__(self, type=None): # noqa: E501,D401,D403 - """Check - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self.discriminator = 'type' - - self.type = type - - @property - def type(self): - """Get the type of this Check. - - :return: The type of this Check. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this Check. - - :param type: The type of this Check. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - def get_real_child_model(self, data): - """Return the real base class specified by the discriminator.""" - discriminator_key = self.attribute_map[self.discriminator] - discriminator_value = data[discriminator_key] - return self.discriminator_value_class_map.get(discriminator_value) - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Check): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/check_base.py b/frogpilot/third_party/influxdb_client/domain/check_base.py deleted file mode 100644 index b54921a10..000000000 --- a/frogpilot/third_party/influxdb_client/domain/check_base.py +++ /dev/null @@ -1,452 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class CheckBase(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'name': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'query': 'DashboardQuery', - 'status': 'TaskStatusType', - 'description': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'labels': 'list[Label]', - 'links': 'CheckBaseLinks' - } - - attribute_map = { - 'id': 'id', - 'name': 'name', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'query': 'query', - 'status': 'status', - 'description': 'description', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, id=None, name=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, query=None, status=None, description=None, latest_completed=None, last_run_status=None, last_run_error=None, labels=None, links=None): # noqa: E501,D401,D403 - """CheckBase - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._name = None - self._org_id = None - self._task_id = None - self._owner_id = None - self._created_at = None - self._updated_at = None - self._query = None - self._status = None - self._description = None - self._latest_completed = None - self._last_run_status = None - self._last_run_error = None - self._labels = None - self._links = None - self.discriminator = None - - if id is not None: - self.id = id - self.name = name - self.org_id = org_id - if task_id is not None: - self.task_id = task_id - if owner_id is not None: - self.owner_id = owner_id - if created_at is not None: - self.created_at = created_at - if updated_at is not None: - self.updated_at = updated_at - self.query = query - if status is not None: - self.status = status - if description is not None: - self.description = description - if latest_completed is not None: - self.latest_completed = latest_completed - if last_run_status is not None: - self.last_run_status = last_run_status - if last_run_error is not None: - self.last_run_error = last_run_error - if labels is not None: - self.labels = labels - if links is not None: - self.links = links - - @property - def id(self): - """Get the id of this CheckBase. - - :return: The id of this CheckBase. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this CheckBase. - - :param id: The id of this CheckBase. - :type: str - """ # noqa: E501 - self._id = id - - @property - def name(self): - """Get the name of this CheckBase. - - :return: The name of this CheckBase. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this CheckBase. - - :param name: The name of this CheckBase. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def org_id(self): - """Get the org_id of this CheckBase. - - The ID of the organization that owns this check. - - :return: The org_id of this CheckBase. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this CheckBase. - - The ID of the organization that owns this check. - - :param org_id: The org_id of this CheckBase. - :type: str - """ # noqa: E501 - if org_id is None: - raise ValueError("Invalid value for `org_id`, must not be `None`") # noqa: E501 - self._org_id = org_id - - @property - def task_id(self): - """Get the task_id of this CheckBase. - - The ID of the task associated with this check. - - :return: The task_id of this CheckBase. - :rtype: str - """ # noqa: E501 - return self._task_id - - @task_id.setter - def task_id(self, task_id): - """Set the task_id of this CheckBase. - - The ID of the task associated with this check. - - :param task_id: The task_id of this CheckBase. - :type: str - """ # noqa: E501 - self._task_id = task_id - - @property - def owner_id(self): - """Get the owner_id of this CheckBase. - - The ID of creator used to create this check. - - :return: The owner_id of this CheckBase. - :rtype: str - """ # noqa: E501 - return self._owner_id - - @owner_id.setter - def owner_id(self, owner_id): - """Set the owner_id of this CheckBase. - - The ID of creator used to create this check. - - :param owner_id: The owner_id of this CheckBase. - :type: str - """ # noqa: E501 - self._owner_id = owner_id - - @property - def created_at(self): - """Get the created_at of this CheckBase. - - :return: The created_at of this CheckBase. - :rtype: datetime - """ # noqa: E501 - return self._created_at - - @created_at.setter - def created_at(self, created_at): - """Set the created_at of this CheckBase. - - :param created_at: The created_at of this CheckBase. - :type: datetime - """ # noqa: E501 - self._created_at = created_at - - @property - def updated_at(self): - """Get the updated_at of this CheckBase. - - :return: The updated_at of this CheckBase. - :rtype: datetime - """ # noqa: E501 - return self._updated_at - - @updated_at.setter - def updated_at(self, updated_at): - """Set the updated_at of this CheckBase. - - :param updated_at: The updated_at of this CheckBase. - :type: datetime - """ # noqa: E501 - self._updated_at = updated_at - - @property - def query(self): - """Get the query of this CheckBase. - - :return: The query of this CheckBase. - :rtype: DashboardQuery - """ # noqa: E501 - return self._query - - @query.setter - def query(self, query): - """Set the query of this CheckBase. - - :param query: The query of this CheckBase. - :type: DashboardQuery - """ # noqa: E501 - if query is None: - raise ValueError("Invalid value for `query`, must not be `None`") # noqa: E501 - self._query = query - - @property - def status(self): - """Get the status of this CheckBase. - - :return: The status of this CheckBase. - :rtype: TaskStatusType - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this CheckBase. - - :param status: The status of this CheckBase. - :type: TaskStatusType - """ # noqa: E501 - self._status = status - - @property - def description(self): - """Get the description of this CheckBase. - - An optional description of the check. - - :return: The description of this CheckBase. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this CheckBase. - - An optional description of the check. - - :param description: The description of this CheckBase. - :type: str - """ # noqa: E501 - self._description = description - - @property - def latest_completed(self): - """Get the latest_completed of this CheckBase. - - A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)) of the latest scheduled and completed run. - - :return: The latest_completed of this CheckBase. - :rtype: datetime - """ # noqa: E501 - return self._latest_completed - - @latest_completed.setter - def latest_completed(self, latest_completed): - """Set the latest_completed of this CheckBase. - - A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)) of the latest scheduled and completed run. - - :param latest_completed: The latest_completed of this CheckBase. - :type: datetime - """ # noqa: E501 - self._latest_completed = latest_completed - - @property - def last_run_status(self): - """Get the last_run_status of this CheckBase. - - :return: The last_run_status of this CheckBase. - :rtype: str - """ # noqa: E501 - return self._last_run_status - - @last_run_status.setter - def last_run_status(self, last_run_status): - """Set the last_run_status of this CheckBase. - - :param last_run_status: The last_run_status of this CheckBase. - :type: str - """ # noqa: E501 - self._last_run_status = last_run_status - - @property - def last_run_error(self): - """Get the last_run_error of this CheckBase. - - :return: The last_run_error of this CheckBase. - :rtype: str - """ # noqa: E501 - return self._last_run_error - - @last_run_error.setter - def last_run_error(self, last_run_error): - """Set the last_run_error of this CheckBase. - - :param last_run_error: The last_run_error of this CheckBase. - :type: str - """ # noqa: E501 - self._last_run_error = last_run_error - - @property - def labels(self): - """Get the labels of this CheckBase. - - :return: The labels of this CheckBase. - :rtype: list[Label] - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this CheckBase. - - :param labels: The labels of this CheckBase. - :type: list[Label] - """ # noqa: E501 - self._labels = labels - - @property - def links(self): - """Get the links of this CheckBase. - - :return: The links of this CheckBase. - :rtype: CheckBaseLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this CheckBase. - - :param links: The links of this CheckBase. - :type: CheckBaseLinks - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, CheckBase): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/check_base_links.py b/frogpilot/third_party/influxdb_client/domain/check_base_links.py deleted file mode 100644 index 19c28aa45..000000000 --- a/frogpilot/third_party/influxdb_client/domain/check_base_links.py +++ /dev/null @@ -1,219 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class CheckBaseLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str', - 'labels': 'str', - 'members': 'str', - 'owners': 'str', - 'query': 'str' - } - - attribute_map = { - '_self': 'self', - 'labels': 'labels', - 'members': 'members', - 'owners': 'owners', - 'query': 'query' - } - - def __init__(self, _self=None, labels=None, members=None, owners=None, query=None): # noqa: E501,D401,D403 - """CheckBaseLinks - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self._labels = None - self._members = None - self._owners = None - self._query = None - self.discriminator = None - - if _self is not None: - self._self = _self - if labels is not None: - self.labels = labels - if members is not None: - self.members = members - if owners is not None: - self.owners = owners - if query is not None: - self.query = query - - @property - def _self(self): - """Get the _self of this CheckBaseLinks. - - URI of resource. - - :return: The _self of this CheckBaseLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this CheckBaseLinks. - - URI of resource. - - :param _self: The _self of this CheckBaseLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - @property - def labels(self): - """Get the labels of this CheckBaseLinks. - - URI of resource. - - :return: The labels of this CheckBaseLinks. - :rtype: str - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this CheckBaseLinks. - - URI of resource. - - :param labels: The labels of this CheckBaseLinks. - :type: str - """ # noqa: E501 - self._labels = labels - - @property - def members(self): - """Get the members of this CheckBaseLinks. - - URI of resource. - - :return: The members of this CheckBaseLinks. - :rtype: str - """ # noqa: E501 - return self._members - - @members.setter - def members(self, members): - """Set the members of this CheckBaseLinks. - - URI of resource. - - :param members: The members of this CheckBaseLinks. - :type: str - """ # noqa: E501 - self._members = members - - @property - def owners(self): - """Get the owners of this CheckBaseLinks. - - URI of resource. - - :return: The owners of this CheckBaseLinks. - :rtype: str - """ # noqa: E501 - return self._owners - - @owners.setter - def owners(self, owners): - """Set the owners of this CheckBaseLinks. - - URI of resource. - - :param owners: The owners of this CheckBaseLinks. - :type: str - """ # noqa: E501 - self._owners = owners - - @property - def query(self): - """Get the query of this CheckBaseLinks. - - URI of resource. - - :return: The query of this CheckBaseLinks. - :rtype: str - """ # noqa: E501 - return self._query - - @query.setter - def query(self, query): - """Set the query of this CheckBaseLinks. - - URI of resource. - - :param query: The query of this CheckBaseLinks. - :type: str - """ # noqa: E501 - self._query = query - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, CheckBaseLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/check_discriminator.py b/frogpilot/third_party/influxdb_client/domain/check_discriminator.py deleted file mode 100644 index c2ebfea88..000000000 --- a/frogpilot/third_party/influxdb_client/domain/check_discriminator.py +++ /dev/null @@ -1,116 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.check_base import CheckBase - - -class CheckDiscriminator(CheckBase): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'name': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'query': 'DashboardQuery', - 'status': 'TaskStatusType', - 'description': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'labels': 'list[Label]', - 'links': 'CheckBaseLinks' - } - - attribute_map = { - 'id': 'id', - 'name': 'name', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'query': 'query', - 'status': 'status', - 'description': 'description', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, id=None, name=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, query=None, status=None, description=None, latest_completed=None, last_run_status=None, last_run_error=None, labels=None, links=None): # noqa: E501,D401,D403 - """CheckDiscriminator - a model defined in OpenAPI.""" # noqa: E501 - CheckBase.__init__(self, id=id, name=name, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, query=query, status=status, description=description, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, labels=labels, links=links) # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, CheckDiscriminator): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/check_patch.py b/frogpilot/third_party/influxdb_client/domain/check_patch.py deleted file mode 100644 index 014e910b3..000000000 --- a/frogpilot/third_party/influxdb_client/domain/check_patch.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class CheckPatch(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'status': 'str' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'status': 'status' - } - - def __init__(self, name=None, description=None, status=None): # noqa: E501,D401,D403 - """CheckPatch - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._status = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - if status is not None: - self.status = status - - @property - def name(self): - """Get the name of this CheckPatch. - - :return: The name of this CheckPatch. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this CheckPatch. - - :param name: The name of this CheckPatch. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this CheckPatch. - - :return: The description of this CheckPatch. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this CheckPatch. - - :param description: The description of this CheckPatch. - :type: str - """ # noqa: E501 - self._description = description - - @property - def status(self): - """Get the status of this CheckPatch. - - :return: The status of this CheckPatch. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this CheckPatch. - - :param status: The status of this CheckPatch. - :type: str - """ # noqa: E501 - self._status = status - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, CheckPatch): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/check_status_level.py b/frogpilot/third_party/influxdb_client/domain/check_status_level.py deleted file mode 100644 index 476f2b568..000000000 --- a/frogpilot/third_party/influxdb_client/domain/check_status_level.py +++ /dev/null @@ -1,91 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class CheckStatusLevel(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - UNKNOWN = "UNKNOWN" - OK = "OK" - INFO = "INFO" - CRIT = "CRIT" - WARN = "WARN" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """CheckStatusLevel - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, CheckStatusLevel): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/check_view_properties.py b/frogpilot/third_party/influxdb_client/domain/check_view_properties.py deleted file mode 100644 index 5226c490c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/check_view_properties.py +++ /dev/null @@ -1,350 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.view_properties import ViewProperties - - -class CheckViewProperties(ViewProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'adaptive_zoom_hide': 'bool', - 'type': 'str', - 'shape': 'str', - 'check_id': 'str', - 'check': 'Check', - 'queries': 'list[DashboardQuery]', - 'colors': 'list[DashboardColor]', - 'legend_colorize_rows': 'bool', - 'legend_hide': 'bool', - 'legend_opacity': 'float', - 'legend_orientation_threshold': 'int' - } - - attribute_map = { - 'adaptive_zoom_hide': 'adaptiveZoomHide', - 'type': 'type', - 'shape': 'shape', - 'check_id': 'checkID', - 'check': 'check', - 'queries': 'queries', - 'colors': 'colors', - 'legend_colorize_rows': 'legendColorizeRows', - 'legend_hide': 'legendHide', - 'legend_opacity': 'legendOpacity', - 'legend_orientation_threshold': 'legendOrientationThreshold' - } - - def __init__(self, adaptive_zoom_hide=None, type=None, shape=None, check_id=None, check=None, queries=None, colors=None, legend_colorize_rows=None, legend_hide=None, legend_opacity=None, legend_orientation_threshold=None): # noqa: E501,D401,D403 - """CheckViewProperties - a model defined in OpenAPI.""" # noqa: E501 - ViewProperties.__init__(self) # noqa: E501 - - self._adaptive_zoom_hide = None - self._type = None - self._shape = None - self._check_id = None - self._check = None - self._queries = None - self._colors = None - self._legend_colorize_rows = None - self._legend_hide = None - self._legend_opacity = None - self._legend_orientation_threshold = None - self.discriminator = None - - if adaptive_zoom_hide is not None: - self.adaptive_zoom_hide = adaptive_zoom_hide - self.type = type - self.shape = shape - self.check_id = check_id - if check is not None: - self.check = check - self.queries = queries - self.colors = colors - if legend_colorize_rows is not None: - self.legend_colorize_rows = legend_colorize_rows - if legend_hide is not None: - self.legend_hide = legend_hide - if legend_opacity is not None: - self.legend_opacity = legend_opacity - if legend_orientation_threshold is not None: - self.legend_orientation_threshold = legend_orientation_threshold - - @property - def adaptive_zoom_hide(self): - """Get the adaptive_zoom_hide of this CheckViewProperties. - - :return: The adaptive_zoom_hide of this CheckViewProperties. - :rtype: bool - """ # noqa: E501 - return self._adaptive_zoom_hide - - @adaptive_zoom_hide.setter - def adaptive_zoom_hide(self, adaptive_zoom_hide): - """Set the adaptive_zoom_hide of this CheckViewProperties. - - :param adaptive_zoom_hide: The adaptive_zoom_hide of this CheckViewProperties. - :type: bool - """ # noqa: E501 - self._adaptive_zoom_hide = adaptive_zoom_hide - - @property - def type(self): - """Get the type of this CheckViewProperties. - - :return: The type of this CheckViewProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this CheckViewProperties. - - :param type: The type of this CheckViewProperties. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def shape(self): - """Get the shape of this CheckViewProperties. - - :return: The shape of this CheckViewProperties. - :rtype: str - """ # noqa: E501 - return self._shape - - @shape.setter - def shape(self, shape): - """Set the shape of this CheckViewProperties. - - :param shape: The shape of this CheckViewProperties. - :type: str - """ # noqa: E501 - if shape is None: - raise ValueError("Invalid value for `shape`, must not be `None`") # noqa: E501 - self._shape = shape - - @property - def check_id(self): - """Get the check_id of this CheckViewProperties. - - :return: The check_id of this CheckViewProperties. - :rtype: str - """ # noqa: E501 - return self._check_id - - @check_id.setter - def check_id(self, check_id): - """Set the check_id of this CheckViewProperties. - - :param check_id: The check_id of this CheckViewProperties. - :type: str - """ # noqa: E501 - if check_id is None: - raise ValueError("Invalid value for `check_id`, must not be `None`") # noqa: E501 - self._check_id = check_id - - @property - def check(self): - """Get the check of this CheckViewProperties. - - :return: The check of this CheckViewProperties. - :rtype: Check - """ # noqa: E501 - return self._check - - @check.setter - def check(self, check): - """Set the check of this CheckViewProperties. - - :param check: The check of this CheckViewProperties. - :type: Check - """ # noqa: E501 - self._check = check - - @property - def queries(self): - """Get the queries of this CheckViewProperties. - - :return: The queries of this CheckViewProperties. - :rtype: list[DashboardQuery] - """ # noqa: E501 - return self._queries - - @queries.setter - def queries(self, queries): - """Set the queries of this CheckViewProperties. - - :param queries: The queries of this CheckViewProperties. - :type: list[DashboardQuery] - """ # noqa: E501 - if queries is None: - raise ValueError("Invalid value for `queries`, must not be `None`") # noqa: E501 - self._queries = queries - - @property - def colors(self): - """Get the colors of this CheckViewProperties. - - Colors define color encoding of data into a visualization - - :return: The colors of this CheckViewProperties. - :rtype: list[DashboardColor] - """ # noqa: E501 - return self._colors - - @colors.setter - def colors(self, colors): - """Set the colors of this CheckViewProperties. - - Colors define color encoding of data into a visualization - - :param colors: The colors of this CheckViewProperties. - :type: list[DashboardColor] - """ # noqa: E501 - if colors is None: - raise ValueError("Invalid value for `colors`, must not be `None`") # noqa: E501 - self._colors = colors - - @property - def legend_colorize_rows(self): - """Get the legend_colorize_rows of this CheckViewProperties. - - :return: The legend_colorize_rows of this CheckViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_colorize_rows - - @legend_colorize_rows.setter - def legend_colorize_rows(self, legend_colorize_rows): - """Set the legend_colorize_rows of this CheckViewProperties. - - :param legend_colorize_rows: The legend_colorize_rows of this CheckViewProperties. - :type: bool - """ # noqa: E501 - self._legend_colorize_rows = legend_colorize_rows - - @property - def legend_hide(self): - """Get the legend_hide of this CheckViewProperties. - - :return: The legend_hide of this CheckViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_hide - - @legend_hide.setter - def legend_hide(self, legend_hide): - """Set the legend_hide of this CheckViewProperties. - - :param legend_hide: The legend_hide of this CheckViewProperties. - :type: bool - """ # noqa: E501 - self._legend_hide = legend_hide - - @property - def legend_opacity(self): - """Get the legend_opacity of this CheckViewProperties. - - :return: The legend_opacity of this CheckViewProperties. - :rtype: float - """ # noqa: E501 - return self._legend_opacity - - @legend_opacity.setter - def legend_opacity(self, legend_opacity): - """Set the legend_opacity of this CheckViewProperties. - - :param legend_opacity: The legend_opacity of this CheckViewProperties. - :type: float - """ # noqa: E501 - self._legend_opacity = legend_opacity - - @property - def legend_orientation_threshold(self): - """Get the legend_orientation_threshold of this CheckViewProperties. - - :return: The legend_orientation_threshold of this CheckViewProperties. - :rtype: int - """ # noqa: E501 - return self._legend_orientation_threshold - - @legend_orientation_threshold.setter - def legend_orientation_threshold(self, legend_orientation_threshold): - """Set the legend_orientation_threshold of this CheckViewProperties. - - :param legend_orientation_threshold: The legend_orientation_threshold of this CheckViewProperties. - :type: int - """ # noqa: E501 - self._legend_orientation_threshold = legend_orientation_threshold - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, CheckViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/checks.py b/frogpilot/third_party/influxdb_client/domain/checks.py deleted file mode 100644 index 05083fcc4..000000000 --- a/frogpilot/third_party/influxdb_client/domain/checks.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Checks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'checks': 'list[Check]', - 'links': 'Links' - } - - attribute_map = { - 'checks': 'checks', - 'links': 'links' - } - - def __init__(self, checks=None, links=None): # noqa: E501,D401,D403 - """Checks - a model defined in OpenAPI.""" # noqa: E501 - self._checks = None - self._links = None - self.discriminator = None - - if checks is not None: - self.checks = checks - if links is not None: - self.links = links - - @property - def checks(self): - """Get the checks of this Checks. - - :return: The checks of this Checks. - :rtype: list[Check] - """ # noqa: E501 - return self._checks - - @checks.setter - def checks(self, checks): - """Set the checks of this Checks. - - :param checks: The checks of this Checks. - :type: list[Check] - """ # noqa: E501 - self._checks = checks - - @property - def links(self): - """Get the links of this Checks. - - :return: The links of this Checks. - :rtype: Links - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Checks. - - :param links: The links of this Checks. - :type: Links - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Checks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/column_data_type.py b/frogpilot/third_party/influxdb_client/domain/column_data_type.py deleted file mode 100644 index e2a2f2c32..000000000 --- a/frogpilot/third_party/influxdb_client/domain/column_data_type.py +++ /dev/null @@ -1,91 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ColumnDataType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - INTEGER = "integer" - FLOAT = "float" - BOOLEAN = "boolean" - STRING = "string" - UNSIGNED = "unsigned" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """ColumnDataType - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ColumnDataType): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/column_semantic_type.py b/frogpilot/third_party/influxdb_client/domain/column_semantic_type.py deleted file mode 100644 index 3f88a1337..000000000 --- a/frogpilot/third_party/influxdb_client/domain/column_semantic_type.py +++ /dev/null @@ -1,89 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ColumnSemanticType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - TIMESTAMP = "timestamp" - TAG = "tag" - FIELD = "field" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """ColumnSemanticType - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ColumnSemanticType): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/conditional_expression.py b/frogpilot/third_party/influxdb_client/domain/conditional_expression.py deleted file mode 100644 index da5af4339..000000000 --- a/frogpilot/third_party/influxdb_client/domain/conditional_expression.py +++ /dev/null @@ -1,184 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class ConditionalExpression(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'test': 'Expression', - 'alternate': 'Expression', - 'consequent': 'Expression' - } - - attribute_map = { - 'type': 'type', - 'test': 'test', - 'alternate': 'alternate', - 'consequent': 'consequent' - } - - def __init__(self, type=None, test=None, alternate=None, consequent=None): # noqa: E501,D401,D403 - """ConditionalExpression - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._test = None - self._alternate = None - self._consequent = None - self.discriminator = None - - if type is not None: - self.type = type - if test is not None: - self.test = test - if alternate is not None: - self.alternate = alternate - if consequent is not None: - self.consequent = consequent - - @property - def type(self): - """Get the type of this ConditionalExpression. - - Type of AST node - - :return: The type of this ConditionalExpression. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this ConditionalExpression. - - Type of AST node - - :param type: The type of this ConditionalExpression. - :type: str - """ # noqa: E501 - self._type = type - - @property - def test(self): - """Get the test of this ConditionalExpression. - - :return: The test of this ConditionalExpression. - :rtype: Expression - """ # noqa: E501 - return self._test - - @test.setter - def test(self, test): - """Set the test of this ConditionalExpression. - - :param test: The test of this ConditionalExpression. - :type: Expression - """ # noqa: E501 - self._test = test - - @property - def alternate(self): - """Get the alternate of this ConditionalExpression. - - :return: The alternate of this ConditionalExpression. - :rtype: Expression - """ # noqa: E501 - return self._alternate - - @alternate.setter - def alternate(self, alternate): - """Set the alternate of this ConditionalExpression. - - :param alternate: The alternate of this ConditionalExpression. - :type: Expression - """ # noqa: E501 - self._alternate = alternate - - @property - def consequent(self): - """Get the consequent of this ConditionalExpression. - - :return: The consequent of this ConditionalExpression. - :rtype: Expression - """ # noqa: E501 - return self._consequent - - @consequent.setter - def consequent(self, consequent): - """Set the consequent of this ConditionalExpression. - - :param consequent: The consequent of this ConditionalExpression. - :type: Expression - """ # noqa: E501 - self._consequent = consequent - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ConditionalExpression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/config.py b/frogpilot/third_party/influxdb_client/domain/config.py deleted file mode 100644 index cc4a03381..000000000 --- a/frogpilot/third_party/influxdb_client/domain/config.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Config(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'config': 'dict(str, object)' - } - - attribute_map = { - 'config': 'config' - } - - def __init__(self, config=None): # noqa: E501,D401,D403 - """Config - a model defined in OpenAPI.""" # noqa: E501 - self._config = None - self.discriminator = None - - if config is not None: - self.config = config - - @property - def config(self): - """Get the config of this Config. - - :return: The config of this Config. - :rtype: dict(str, object) - """ # noqa: E501 - return self._config - - @config.setter - def config(self, config): - """Set the config of this Config. - - :param config: The config of this Config. - :type: dict(str, object) - """ # noqa: E501 - self._config = config - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Config): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/constant_variable_properties.py b/frogpilot/third_party/influxdb_client/domain/constant_variable_properties.py deleted file mode 100644 index 806045e89..000000000 --- a/frogpilot/third_party/influxdb_client/domain/constant_variable_properties.py +++ /dev/null @@ -1,134 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.variable_properties import VariableProperties - - -class ConstantVariableProperties(VariableProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'values': 'list[str]' - } - - attribute_map = { - 'type': 'type', - 'values': 'values' - } - - def __init__(self, type=None, values=None): # noqa: E501,D401,D403 - """ConstantVariableProperties - a model defined in OpenAPI.""" # noqa: E501 - VariableProperties.__init__(self) # noqa: E501 - - self._type = None - self._values = None - self.discriminator = None - - if type is not None: - self.type = type - if values is not None: - self.values = values - - @property - def type(self): - """Get the type of this ConstantVariableProperties. - - :return: The type of this ConstantVariableProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this ConstantVariableProperties. - - :param type: The type of this ConstantVariableProperties. - :type: str - """ # noqa: E501 - self._type = type - - @property - def values(self): - """Get the values of this ConstantVariableProperties. - - :return: The values of this ConstantVariableProperties. - :rtype: list[str] - """ # noqa: E501 - return self._values - - @values.setter - def values(self, values): - """Set the values of this ConstantVariableProperties. - - :param values: The values of this ConstantVariableProperties. - :type: list[str] - """ # noqa: E501 - self._values = values - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ConstantVariableProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/create_cell.py b/frogpilot/third_party/influxdb_client/domain/create_cell.py deleted file mode 100644 index 1251c2f10..000000000 --- a/frogpilot/third_party/influxdb_client/domain/create_cell.py +++ /dev/null @@ -1,226 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class CreateCell(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'x': 'int', - 'y': 'int', - 'w': 'int', - 'h': 'int', - 'using_view': 'str' - } - - attribute_map = { - 'name': 'name', - 'x': 'x', - 'y': 'y', - 'w': 'w', - 'h': 'h', - 'using_view': 'usingView' - } - - def __init__(self, name=None, x=None, y=None, w=None, h=None, using_view=None): # noqa: E501,D401,D403 - """CreateCell - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._x = None - self._y = None - self._w = None - self._h = None - self._using_view = None - self.discriminator = None - - if name is not None: - self.name = name - if x is not None: - self.x = x - if y is not None: - self.y = y - if w is not None: - self.w = w - if h is not None: - self.h = h - if using_view is not None: - self.using_view = using_view - - @property - def name(self): - """Get the name of this CreateCell. - - :return: The name of this CreateCell. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this CreateCell. - - :param name: The name of this CreateCell. - :type: str - """ # noqa: E501 - self._name = name - - @property - def x(self): - """Get the x of this CreateCell. - - :return: The x of this CreateCell. - :rtype: int - """ # noqa: E501 - return self._x - - @x.setter - def x(self, x): - """Set the x of this CreateCell. - - :param x: The x of this CreateCell. - :type: int - """ # noqa: E501 - self._x = x - - @property - def y(self): - """Get the y of this CreateCell. - - :return: The y of this CreateCell. - :rtype: int - """ # noqa: E501 - return self._y - - @y.setter - def y(self, y): - """Set the y of this CreateCell. - - :param y: The y of this CreateCell. - :type: int - """ # noqa: E501 - self._y = y - - @property - def w(self): - """Get the w of this CreateCell. - - :return: The w of this CreateCell. - :rtype: int - """ # noqa: E501 - return self._w - - @w.setter - def w(self, w): - """Set the w of this CreateCell. - - :param w: The w of this CreateCell. - :type: int - """ # noqa: E501 - self._w = w - - @property - def h(self): - """Get the h of this CreateCell. - - :return: The h of this CreateCell. - :rtype: int - """ # noqa: E501 - return self._h - - @h.setter - def h(self, h): - """Set the h of this CreateCell. - - :param h: The h of this CreateCell. - :type: int - """ # noqa: E501 - self._h = h - - @property - def using_view(self): - """Get the using_view of this CreateCell. - - Makes a copy of the provided view. - - :return: The using_view of this CreateCell. - :rtype: str - """ # noqa: E501 - return self._using_view - - @using_view.setter - def using_view(self, using_view): - """Set the using_view of this CreateCell. - - Makes a copy of the provided view. - - :param using_view: The using_view of this CreateCell. - :type: str - """ # noqa: E501 - self._using_view = using_view - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, CreateCell): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/create_dashboard_request.py b/frogpilot/third_party/influxdb_client/domain/create_dashboard_request.py deleted file mode 100644 index e5de81ee8..000000000 --- a/frogpilot/third_party/influxdb_client/domain/create_dashboard_request.py +++ /dev/null @@ -1,167 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class CreateDashboardRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'org_id': 'str', - 'name': 'str', - 'description': 'str' - } - - attribute_map = { - 'org_id': 'orgID', - 'name': 'name', - 'description': 'description' - } - - def __init__(self, org_id=None, name=None, description=None): # noqa: E501,D401,D403 - """CreateDashboardRequest - a model defined in OpenAPI.""" # noqa: E501 - self._org_id = None - self._name = None - self._description = None - self.discriminator = None - - self.org_id = org_id - self.name = name - if description is not None: - self.description = description - - @property - def org_id(self): - """Get the org_id of this CreateDashboardRequest. - - The ID of the organization that owns the dashboard. - - :return: The org_id of this CreateDashboardRequest. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this CreateDashboardRequest. - - The ID of the organization that owns the dashboard. - - :param org_id: The org_id of this CreateDashboardRequest. - :type: str - """ # noqa: E501 - if org_id is None: - raise ValueError("Invalid value for `org_id`, must not be `None`") # noqa: E501 - self._org_id = org_id - - @property - def name(self): - """Get the name of this CreateDashboardRequest. - - The user-facing name of the dashboard. - - :return: The name of this CreateDashboardRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this CreateDashboardRequest. - - The user-facing name of the dashboard. - - :param name: The name of this CreateDashboardRequest. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this CreateDashboardRequest. - - The user-facing description of the dashboard. - - :return: The description of this CreateDashboardRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this CreateDashboardRequest. - - The user-facing description of the dashboard. - - :param description: The description of this CreateDashboardRequest. - :type: str - """ # noqa: E501 - self._description = description - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, CreateDashboardRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/custom_check.py b/frogpilot/third_party/influxdb_client/domain/custom_check.py deleted file mode 100644 index 88c0180de..000000000 --- a/frogpilot/third_party/influxdb_client/domain/custom_check.py +++ /dev/null @@ -1,142 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.check_discriminator import CheckDiscriminator - - -class CustomCheck(CheckDiscriminator): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'id': 'str', - 'name': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'query': 'DashboardQuery', - 'status': 'TaskStatusType', - 'description': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'labels': 'list[Label]', - 'links': 'CheckBaseLinks' - } - - attribute_map = { - 'type': 'type', - 'id': 'id', - 'name': 'name', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'query': 'query', - 'status': 'status', - 'description': 'description', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, type="custom", id=None, name=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, query=None, status=None, description=None, latest_completed=None, last_run_status=None, last_run_error=None, labels=None, links=None): # noqa: E501,D401,D403 - """CustomCheck - a model defined in OpenAPI.""" # noqa: E501 - CheckDiscriminator.__init__(self, id=id, name=name, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, query=query, status=status, description=description, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, labels=labels, links=links) # noqa: E501 - - self._type = None - self.discriminator = None - - self.type = type - - @property - def type(self): - """Get the type of this CustomCheck. - - :return: The type of this CustomCheck. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this CustomCheck. - - :param type: The type of this CustomCheck. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, CustomCheck): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/dashboard.py b/frogpilot/third_party/influxdb_client/domain/dashboard.py deleted file mode 100644 index 4b4e47e9d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/dashboard.py +++ /dev/null @@ -1,209 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.create_dashboard_request import CreateDashboardRequest - - -class Dashboard(CreateDashboardRequest): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'object', - 'id': 'str', - 'meta': 'object', - 'cells': 'list[Cell]', - 'labels': 'list[Label]', - 'org_id': 'str', - 'name': 'str', - 'description': 'str' - } - - attribute_map = { - 'links': 'links', - 'id': 'id', - 'meta': 'meta', - 'cells': 'cells', - 'labels': 'labels', - 'org_id': 'orgID', - 'name': 'name', - 'description': 'description' - } - - def __init__(self, links=None, id=None, meta=None, cells=None, labels=None, org_id=None, name=None, description=None): # noqa: E501,D401,D403 - """Dashboard - a model defined in OpenAPI.""" # noqa: E501 - CreateDashboardRequest.__init__(self, org_id=org_id, name=name, description=description) # noqa: E501 - - self._links = None - self._id = None - self._meta = None - self._cells = None - self._labels = None - self.discriminator = None - - if links is not None: - self.links = links - if id is not None: - self.id = id - if meta is not None: - self.meta = meta - if cells is not None: - self.cells = cells - if labels is not None: - self.labels = labels - - @property - def links(self): - """Get the links of this Dashboard. - - :return: The links of this Dashboard. - :rtype: object - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Dashboard. - - :param links: The links of this Dashboard. - :type: object - """ # noqa: E501 - self._links = links - - @property - def id(self): - """Get the id of this Dashboard. - - :return: The id of this Dashboard. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Dashboard. - - :param id: The id of this Dashboard. - :type: str - """ # noqa: E501 - self._id = id - - @property - def meta(self): - """Get the meta of this Dashboard. - - :return: The meta of this Dashboard. - :rtype: object - """ # noqa: E501 - return self._meta - - @meta.setter - def meta(self, meta): - """Set the meta of this Dashboard. - - :param meta: The meta of this Dashboard. - :type: object - """ # noqa: E501 - self._meta = meta - - @property - def cells(self): - """Get the cells of this Dashboard. - - :return: The cells of this Dashboard. - :rtype: list[Cell] - """ # noqa: E501 - return self._cells - - @cells.setter - def cells(self, cells): - """Set the cells of this Dashboard. - - :param cells: The cells of this Dashboard. - :type: list[Cell] - """ # noqa: E501 - self._cells = cells - - @property - def labels(self): - """Get the labels of this Dashboard. - - :return: The labels of this Dashboard. - :rtype: list[Label] - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this Dashboard. - - :param labels: The labels of this Dashboard. - :type: list[Label] - """ # noqa: E501 - self._labels = labels - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Dashboard): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/dashboard_color.py b/frogpilot/third_party/influxdb_client/domain/dashboard_color.py deleted file mode 100644 index b03a4e2fe..000000000 --- a/frogpilot/third_party/influxdb_client/domain/dashboard_color.py +++ /dev/null @@ -1,228 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class DashboardColor(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'type': 'str', - 'hex': 'str', - 'name': 'str', - 'value': 'float' - } - - attribute_map = { - 'id': 'id', - 'type': 'type', - 'hex': 'hex', - 'name': 'name', - 'value': 'value' - } - - def __init__(self, id=None, type=None, hex=None, name=None, value=None): # noqa: E501,D401,D403 - """DashboardColor - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._type = None - self._hex = None - self._name = None - self._value = None - self.discriminator = None - - self.id = id - self.type = type - self.hex = hex - self.name = name - self.value = value - - @property - def id(self): - """Get the id of this DashboardColor. - - The unique ID of the view color. - - :return: The id of this DashboardColor. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this DashboardColor. - - The unique ID of the view color. - - :param id: The id of this DashboardColor. - :type: str - """ # noqa: E501 - if id is None: - raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 - self._id = id - - @property - def type(self): - """Get the type of this DashboardColor. - - Type is how the color is used. - - :return: The type of this DashboardColor. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this DashboardColor. - - Type is how the color is used. - - :param type: The type of this DashboardColor. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def hex(self): - """Get the hex of this DashboardColor. - - The hex number of the color - - :return: The hex of this DashboardColor. - :rtype: str - """ # noqa: E501 - return self._hex - - @hex.setter - def hex(self, hex): - """Set the hex of this DashboardColor. - - The hex number of the color - - :param hex: The hex of this DashboardColor. - :type: str - """ # noqa: E501 - if hex is None: - raise ValueError("Invalid value for `hex`, must not be `None`") # noqa: E501 - if hex is not None and len(hex) > 7: - raise ValueError("Invalid value for `hex`, length must be less than or equal to `7`") # noqa: E501 - if hex is not None and len(hex) < 7: - raise ValueError("Invalid value for `hex`, length must be greater than or equal to `7`") # noqa: E501 - self._hex = hex - - @property - def name(self): - """Get the name of this DashboardColor. - - The user-facing name of the hex color. - - :return: The name of this DashboardColor. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this DashboardColor. - - The user-facing name of the hex color. - - :param name: The name of this DashboardColor. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def value(self): - """Get the value of this DashboardColor. - - The data value mapped to this color. - - :return: The value of this DashboardColor. - :rtype: float - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this DashboardColor. - - The data value mapped to this color. - - :param value: The value of this DashboardColor. - :type: float - """ # noqa: E501 - if value is None: - raise ValueError("Invalid value for `value`, must not be `None`") # noqa: E501 - self._value = value - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DashboardColor): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/dashboard_query.py b/frogpilot/third_party/influxdb_client/domain/dashboard_query.py deleted file mode 100644 index e23c61f7a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/dashboard_query.py +++ /dev/null @@ -1,180 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class DashboardQuery(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'text': 'str', - 'edit_mode': 'QueryEditMode', - 'name': 'str', - 'builder_config': 'BuilderConfig' - } - - attribute_map = { - 'text': 'text', - 'edit_mode': 'editMode', - 'name': 'name', - 'builder_config': 'builderConfig' - } - - def __init__(self, text=None, edit_mode=None, name=None, builder_config=None): # noqa: E501,D401,D403 - """DashboardQuery - a model defined in OpenAPI.""" # noqa: E501 - self._text = None - self._edit_mode = None - self._name = None - self._builder_config = None - self.discriminator = None - - if text is not None: - self.text = text - if edit_mode is not None: - self.edit_mode = edit_mode - if name is not None: - self.name = name - if builder_config is not None: - self.builder_config = builder_config - - @property - def text(self): - """Get the text of this DashboardQuery. - - The text of the Flux query. - - :return: The text of this DashboardQuery. - :rtype: str - """ # noqa: E501 - return self._text - - @text.setter - def text(self, text): - """Set the text of this DashboardQuery. - - The text of the Flux query. - - :param text: The text of this DashboardQuery. - :type: str - """ # noqa: E501 - self._text = text - - @property - def edit_mode(self): - """Get the edit_mode of this DashboardQuery. - - :return: The edit_mode of this DashboardQuery. - :rtype: QueryEditMode - """ # noqa: E501 - return self._edit_mode - - @edit_mode.setter - def edit_mode(self, edit_mode): - """Set the edit_mode of this DashboardQuery. - - :param edit_mode: The edit_mode of this DashboardQuery. - :type: QueryEditMode - """ # noqa: E501 - self._edit_mode = edit_mode - - @property - def name(self): - """Get the name of this DashboardQuery. - - :return: The name of this DashboardQuery. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this DashboardQuery. - - :param name: The name of this DashboardQuery. - :type: str - """ # noqa: E501 - self._name = name - - @property - def builder_config(self): - """Get the builder_config of this DashboardQuery. - - :return: The builder_config of this DashboardQuery. - :rtype: BuilderConfig - """ # noqa: E501 - return self._builder_config - - @builder_config.setter - def builder_config(self, builder_config): - """Set the builder_config of this DashboardQuery. - - :param builder_config: The builder_config of this DashboardQuery. - :type: BuilderConfig - """ # noqa: E501 - self._builder_config = builder_config - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DashboardQuery): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/dashboard_with_view_properties.py b/frogpilot/third_party/influxdb_client/domain/dashboard_with_view_properties.py deleted file mode 100644 index 08a78d2cb..000000000 --- a/frogpilot/third_party/influxdb_client/domain/dashboard_with_view_properties.py +++ /dev/null @@ -1,209 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.create_dashboard_request import CreateDashboardRequest - - -class DashboardWithViewProperties(CreateDashboardRequest): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'object', - 'id': 'str', - 'meta': 'object', - 'cells': 'list[CellWithViewProperties]', - 'labels': 'list[Label]', - 'org_id': 'str', - 'name': 'str', - 'description': 'str' - } - - attribute_map = { - 'links': 'links', - 'id': 'id', - 'meta': 'meta', - 'cells': 'cells', - 'labels': 'labels', - 'org_id': 'orgID', - 'name': 'name', - 'description': 'description' - } - - def __init__(self, links=None, id=None, meta=None, cells=None, labels=None, org_id=None, name=None, description=None): # noqa: E501,D401,D403 - """DashboardWithViewProperties - a model defined in OpenAPI.""" # noqa: E501 - CreateDashboardRequest.__init__(self, org_id=org_id, name=name, description=description) # noqa: E501 - - self._links = None - self._id = None - self._meta = None - self._cells = None - self._labels = None - self.discriminator = None - - if links is not None: - self.links = links - if id is not None: - self.id = id - if meta is not None: - self.meta = meta - if cells is not None: - self.cells = cells - if labels is not None: - self.labels = labels - - @property - def links(self): - """Get the links of this DashboardWithViewProperties. - - :return: The links of this DashboardWithViewProperties. - :rtype: object - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this DashboardWithViewProperties. - - :param links: The links of this DashboardWithViewProperties. - :type: object - """ # noqa: E501 - self._links = links - - @property - def id(self): - """Get the id of this DashboardWithViewProperties. - - :return: The id of this DashboardWithViewProperties. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this DashboardWithViewProperties. - - :param id: The id of this DashboardWithViewProperties. - :type: str - """ # noqa: E501 - self._id = id - - @property - def meta(self): - """Get the meta of this DashboardWithViewProperties. - - :return: The meta of this DashboardWithViewProperties. - :rtype: object - """ # noqa: E501 - return self._meta - - @meta.setter - def meta(self, meta): - """Set the meta of this DashboardWithViewProperties. - - :param meta: The meta of this DashboardWithViewProperties. - :type: object - """ # noqa: E501 - self._meta = meta - - @property - def cells(self): - """Get the cells of this DashboardWithViewProperties. - - :return: The cells of this DashboardWithViewProperties. - :rtype: list[CellWithViewProperties] - """ # noqa: E501 - return self._cells - - @cells.setter - def cells(self, cells): - """Set the cells of this DashboardWithViewProperties. - - :param cells: The cells of this DashboardWithViewProperties. - :type: list[CellWithViewProperties] - """ # noqa: E501 - self._cells = cells - - @property - def labels(self): - """Get the labels of this DashboardWithViewProperties. - - :return: The labels of this DashboardWithViewProperties. - :rtype: list[Label] - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this DashboardWithViewProperties. - - :param labels: The labels of this DashboardWithViewProperties. - :type: list[Label] - """ # noqa: E501 - self._labels = labels - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DashboardWithViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/dashboards.py b/frogpilot/third_party/influxdb_client/domain/dashboards.py deleted file mode 100644 index e15de9284..000000000 --- a/frogpilot/third_party/influxdb_client/domain/dashboards.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Dashboards(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'Links', - 'dashboards': 'list[Dashboard]' - } - - attribute_map = { - 'links': 'links', - 'dashboards': 'dashboards' - } - - def __init__(self, links=None, dashboards=None): # noqa: E501,D401,D403 - """Dashboards - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._dashboards = None - self.discriminator = None - - if links is not None: - self.links = links - if dashboards is not None: - self.dashboards = dashboards - - @property - def links(self): - """Get the links of this Dashboards. - - :return: The links of this Dashboards. - :rtype: Links - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Dashboards. - - :param links: The links of this Dashboards. - :type: Links - """ # noqa: E501 - self._links = links - - @property - def dashboards(self): - """Get the dashboards of this Dashboards. - - :return: The dashboards of this Dashboards. - :rtype: list[Dashboard] - """ # noqa: E501 - return self._dashboards - - @dashboards.setter - def dashboards(self, dashboards): - """Set the dashboards of this Dashboards. - - :param dashboards: The dashboards of this Dashboards. - :type: list[Dashboard] - """ # noqa: E501 - self._dashboards = dashboards - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Dashboards): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/date_time_literal.py b/frogpilot/third_party/influxdb_client/domain/date_time_literal.py deleted file mode 100644 index ce2280f36..000000000 --- a/frogpilot/third_party/influxdb_client/domain/date_time_literal.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class DateTimeLiteral(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'value': 'datetime' - } - - attribute_map = { - 'type': 'type', - 'value': 'value' - } - - def __init__(self, type=None, value=None): # noqa: E501,D401,D403 - """DateTimeLiteral - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._value = None - self.discriminator = None - - if type is not None: - self.type = type - if value is not None: - self.value = value - - @property - def type(self): - """Get the type of this DateTimeLiteral. - - Type of AST node - - :return: The type of this DateTimeLiteral. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this DateTimeLiteral. - - Type of AST node - - :param type: The type of this DateTimeLiteral. - :type: str - """ # noqa: E501 - self._type = type - - @property - def value(self): - """Get the value of this DateTimeLiteral. - - :return: The value of this DateTimeLiteral. - :rtype: datetime - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this DateTimeLiteral. - - :param value: The value of this DateTimeLiteral. - :type: datetime - """ # noqa: E501 - self._value = value - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DateTimeLiteral): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/dbr_ps.py b/frogpilot/third_party/influxdb_client/domain/dbr_ps.py deleted file mode 100644 index 27617a99f..000000000 --- a/frogpilot/third_party/influxdb_client/domain/dbr_ps.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class DBRPs(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'content': 'list[DBRP]' - } - - attribute_map = { - 'content': 'content' - } - - def __init__(self, content=None): # noqa: E501,D401,D403 - """DBRPs - a model defined in OpenAPI.""" # noqa: E501 - self._content = None - self.discriminator = None - - if content is not None: - self.content = content - - @property - def content(self): - """Get the content of this DBRPs. - - :return: The content of this DBRPs. - :rtype: list[DBRP] - """ # noqa: E501 - return self._content - - @content.setter - def content(self, content): - """Set the content of this DBRPs. - - :param content: The content of this DBRPs. - :type: list[DBRP] - """ # noqa: E501 - self._content = content - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DBRPs): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/dbrp.py b/frogpilot/third_party/influxdb_client/domain/dbrp.py deleted file mode 100644 index 1bb74ecf9..000000000 --- a/frogpilot/third_party/influxdb_client/domain/dbrp.py +++ /dev/null @@ -1,302 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class DBRP(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'org_id': 'str', - 'bucket_id': 'str', - 'database': 'str', - 'retention_policy': 'str', - 'default': 'bool', - 'virtual': 'bool', - 'links': 'Links' - } - - attribute_map = { - 'id': 'id', - 'org_id': 'orgID', - 'bucket_id': 'bucketID', - 'database': 'database', - 'retention_policy': 'retention_policy', - 'default': 'default', - 'virtual': 'virtual', - 'links': 'links' - } - - def __init__(self, id=None, org_id=None, bucket_id=None, database=None, retention_policy=None, default=None, virtual=None, links=None): # noqa: E501,D401,D403 - """DBRP - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._org_id = None - self._bucket_id = None - self._database = None - self._retention_policy = None - self._default = None - self._virtual = None - self._links = None - self.discriminator = None - - self.id = id - self.org_id = org_id - self.bucket_id = bucket_id - self.database = database - self.retention_policy = retention_policy - self.default = default - if virtual is not None: - self.virtual = virtual - if links is not None: - self.links = links - - @property - def id(self): - """Get the id of this DBRP. - - The resource ID that InfluxDB uses to uniquely identify the database retention policy (DBRP) mapping. - - :return: The id of this DBRP. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this DBRP. - - The resource ID that InfluxDB uses to uniquely identify the database retention policy (DBRP) mapping. - - :param id: The id of this DBRP. - :type: str - """ # noqa: E501 - if id is None: - raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 - self._id = id - - @property - def org_id(self): - """Get the org_id of this DBRP. - - An organization ID. Identifies the [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) that owns the mapping. - - :return: The org_id of this DBRP. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this DBRP. - - An organization ID. Identifies the [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) that owns the mapping. - - :param org_id: The org_id of this DBRP. - :type: str - """ # noqa: E501 - if org_id is None: - raise ValueError("Invalid value for `org_id`, must not be `None`") # noqa: E501 - self._org_id = org_id - - @property - def bucket_id(self): - """Get the bucket_id of this DBRP. - - A bucket ID. Identifies the bucket used as the target for the translation. - - :return: The bucket_id of this DBRP. - :rtype: str - """ # noqa: E501 - return self._bucket_id - - @bucket_id.setter - def bucket_id(self, bucket_id): - """Set the bucket_id of this DBRP. - - A bucket ID. Identifies the bucket used as the target for the translation. - - :param bucket_id: The bucket_id of this DBRP. - :type: str - """ # noqa: E501 - if bucket_id is None: - raise ValueError("Invalid value for `bucket_id`, must not be `None`") # noqa: E501 - self._bucket_id = bucket_id - - @property - def database(self): - """Get the database of this DBRP. - - A database name. Identifies the InfluxDB v1 database. - - :return: The database of this DBRP. - :rtype: str - """ # noqa: E501 - return self._database - - @database.setter - def database(self, database): - """Set the database of this DBRP. - - A database name. Identifies the InfluxDB v1 database. - - :param database: The database of this DBRP. - :type: str - """ # noqa: E501 - if database is None: - raise ValueError("Invalid value for `database`, must not be `None`") # noqa: E501 - self._database = database - - @property - def retention_policy(self): - """Get the retention_policy of this DBRP. - - A [retention policy](https://docs.influxdata.com/influxdb/v1.8/concepts/glossary/#retention-policy-rp) name. Identifies the InfluxDB v1 retention policy mapping. - - :return: The retention_policy of this DBRP. - :rtype: str - """ # noqa: E501 - return self._retention_policy - - @retention_policy.setter - def retention_policy(self, retention_policy): - """Set the retention_policy of this DBRP. - - A [retention policy](https://docs.influxdata.com/influxdb/v1.8/concepts/glossary/#retention-policy-rp) name. Identifies the InfluxDB v1 retention policy mapping. - - :param retention_policy: The retention_policy of this DBRP. - :type: str - """ # noqa: E501 - if retention_policy is None: - raise ValueError("Invalid value for `retention_policy`, must not be `None`") # noqa: E501 - self._retention_policy = retention_policy - - @property - def default(self): - """Get the default of this DBRP. - - If set to `true`, this DBRP mapping is the default retention policy for the database (specified by the `database` property's value). - - :return: The default of this DBRP. - :rtype: bool - """ # noqa: E501 - return self._default - - @default.setter - def default(self, default): - """Set the default of this DBRP. - - If set to `true`, this DBRP mapping is the default retention policy for the database (specified by the `database` property's value). - - :param default: The default of this DBRP. - :type: bool - """ # noqa: E501 - if default is None: - raise ValueError("Invalid value for `default`, must not be `None`") # noqa: E501 - self._default = default - - @property - def virtual(self): - """Get the virtual of this DBRP. - - Indicates an autogenerated, virtual mapping based on the bucket name. Currently only available in OSS. - - :return: The virtual of this DBRP. - :rtype: bool - """ # noqa: E501 - return self._virtual - - @virtual.setter - def virtual(self, virtual): - """Set the virtual of this DBRP. - - Indicates an autogenerated, virtual mapping based on the bucket name. Currently only available in OSS. - - :param virtual: The virtual of this DBRP. - :type: bool - """ # noqa: E501 - self._virtual = virtual - - @property - def links(self): - """Get the links of this DBRP. - - :return: The links of this DBRP. - :rtype: Links - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this DBRP. - - :param links: The links of this DBRP. - :type: Links - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DBRP): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/dbrp_create.py b/frogpilot/third_party/influxdb_client/domain/dbrp_create.py deleted file mode 100644 index e69183ff7..000000000 --- a/frogpilot/third_party/influxdb_client/domain/dbrp_create.py +++ /dev/null @@ -1,249 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class DBRPCreate(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'org': 'str', - 'org_id': 'str', - 'bucket_id': 'str', - 'database': 'str', - 'retention_policy': 'str', - 'default': 'bool' - } - - attribute_map = { - 'org': 'org', - 'org_id': 'orgID', - 'bucket_id': 'bucketID', - 'database': 'database', - 'retention_policy': 'retention_policy', - 'default': 'default' - } - - def __init__(self, org=None, org_id=None, bucket_id=None, database=None, retention_policy=None, default=None): # noqa: E501,D401,D403 - """DBRPCreate - a model defined in OpenAPI.""" # noqa: E501 - self._org = None - self._org_id = None - self._bucket_id = None - self._database = None - self._retention_policy = None - self._default = None - self.discriminator = None - - if org is not None: - self.org = org - if org_id is not None: - self.org_id = org_id - self.bucket_id = bucket_id - self.database = database - self.retention_policy = retention_policy - if default is not None: - self.default = default - - @property - def org(self): - """Get the org of this DBRPCreate. - - An organization name. Identifies the [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) that owns the mapping. - - :return: The org of this DBRPCreate. - :rtype: str - """ # noqa: E501 - return self._org - - @org.setter - def org(self, org): - """Set the org of this DBRPCreate. - - An organization name. Identifies the [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) that owns the mapping. - - :param org: The org of this DBRPCreate. - :type: str - """ # noqa: E501 - self._org = org - - @property - def org_id(self): - """Get the org_id of this DBRPCreate. - - An organization ID. Identifies the [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) that owns the mapping. - - :return: The org_id of this DBRPCreate. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this DBRPCreate. - - An organization ID. Identifies the [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) that owns the mapping. - - :param org_id: The org_id of this DBRPCreate. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def bucket_id(self): - """Get the bucket_id of this DBRPCreate. - - A bucket ID. Identifies the bucket used as the target for the translation. - - :return: The bucket_id of this DBRPCreate. - :rtype: str - """ # noqa: E501 - return self._bucket_id - - @bucket_id.setter - def bucket_id(self, bucket_id): - """Set the bucket_id of this DBRPCreate. - - A bucket ID. Identifies the bucket used as the target for the translation. - - :param bucket_id: The bucket_id of this DBRPCreate. - :type: str - """ # noqa: E501 - if bucket_id is None: - raise ValueError("Invalid value for `bucket_id`, must not be `None`") # noqa: E501 - self._bucket_id = bucket_id - - @property - def database(self): - """Get the database of this DBRPCreate. - - A database name. Identifies the InfluxDB v1 database. - - :return: The database of this DBRPCreate. - :rtype: str - """ # noqa: E501 - return self._database - - @database.setter - def database(self, database): - """Set the database of this DBRPCreate. - - A database name. Identifies the InfluxDB v1 database. - - :param database: The database of this DBRPCreate. - :type: str - """ # noqa: E501 - if database is None: - raise ValueError("Invalid value for `database`, must not be `None`") # noqa: E501 - self._database = database - - @property - def retention_policy(self): - """Get the retention_policy of this DBRPCreate. - - A [retention policy](https://docs.influxdata.com/influxdb/v1.8/concepts/glossary/#retention-policy-rp) name. Identifies the InfluxDB v1 retention policy mapping. - - :return: The retention_policy of this DBRPCreate. - :rtype: str - """ # noqa: E501 - return self._retention_policy - - @retention_policy.setter - def retention_policy(self, retention_policy): - """Set the retention_policy of this DBRPCreate. - - A [retention policy](https://docs.influxdata.com/influxdb/v1.8/concepts/glossary/#retention-policy-rp) name. Identifies the InfluxDB v1 retention policy mapping. - - :param retention_policy: The retention_policy of this DBRPCreate. - :type: str - """ # noqa: E501 - if retention_policy is None: - raise ValueError("Invalid value for `retention_policy`, must not be `None`") # noqa: E501 - self._retention_policy = retention_policy - - @property - def default(self): - """Get the default of this DBRPCreate. - - Set to `true` to use this DBRP mapping as the default retention policy for the database (specified by the `database` property's value). - - :return: The default of this DBRPCreate. - :rtype: bool - """ # noqa: E501 - return self._default - - @default.setter - def default(self, default): - """Set the default of this DBRPCreate. - - Set to `true` to use this DBRP mapping as the default retention policy for the database (specified by the `database` property's value). - - :param default: The default of this DBRPCreate. - :type: bool - """ # noqa: E501 - self._default = default - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DBRPCreate): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/dbrp_get.py b/frogpilot/third_party/influxdb_client/domain/dbrp_get.py deleted file mode 100644 index 375f0a55d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/dbrp_get.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class DBRPGet(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'content': 'DBRP' - } - - attribute_map = { - 'content': 'content' - } - - def __init__(self, content=None): # noqa: E501,D401,D403 - """DBRPGet - a model defined in OpenAPI.""" # noqa: E501 - self._content = None - self.discriminator = None - - if content is not None: - self.content = content - - @property - def content(self): - """Get the content of this DBRPGet. - - :return: The content of this DBRPGet. - :rtype: DBRP - """ # noqa: E501 - return self._content - - @content.setter - def content(self, content): - """Set the content of this DBRPGet. - - :param content: The content of this DBRPGet. - :type: DBRP - """ # noqa: E501 - self._content = content - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DBRPGet): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/dbrp_update.py b/frogpilot/third_party/influxdb_client/domain/dbrp_update.py deleted file mode 100644 index 4b0c5baea..000000000 --- a/frogpilot/third_party/influxdb_client/domain/dbrp_update.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class DBRPUpdate(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'retention_policy': 'str', - 'default': 'bool' - } - - attribute_map = { - 'retention_policy': 'retention_policy', - 'default': 'default' - } - - def __init__(self, retention_policy=None, default=None): # noqa: E501,D401,D403 - """DBRPUpdate - a model defined in OpenAPI.""" # noqa: E501 - self._retention_policy = None - self._default = None - self.discriminator = None - - if retention_policy is not None: - self.retention_policy = retention_policy - if default is not None: - self.default = default - - @property - def retention_policy(self): - """Get the retention_policy of this DBRPUpdate. - - A [retention policy](https://docs.influxdata.com/influxdb/v1.8/concepts/glossary/#retention-policy-rp) name. Identifies the InfluxDB v1 retention policy mapping. - - :return: The retention_policy of this DBRPUpdate. - :rtype: str - """ # noqa: E501 - return self._retention_policy - - @retention_policy.setter - def retention_policy(self, retention_policy): - """Set the retention_policy of this DBRPUpdate. - - A [retention policy](https://docs.influxdata.com/influxdb/v1.8/concepts/glossary/#retention-policy-rp) name. Identifies the InfluxDB v1 retention policy mapping. - - :param retention_policy: The retention_policy of this DBRPUpdate. - :type: str - """ # noqa: E501 - self._retention_policy = retention_policy - - @property - def default(self): - """Get the default of this DBRPUpdate. - - Set to `true` to use this DBRP mapping as the default retention policy for the database (specified by the `database` property's value). To remove the default mapping, set to `false`. - - :return: The default of this DBRPUpdate. - :rtype: bool - """ # noqa: E501 - return self._default - - @default.setter - def default(self, default): - """Set the default of this DBRPUpdate. - - Set to `true` to use this DBRP mapping as the default retention policy for the database (specified by the `database` property's value). To remove the default mapping, set to `false`. - - :param default: The default of this DBRPUpdate. - :type: bool - """ # noqa: E501 - self._default = default - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DBRPUpdate): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/deadman_check.py b/frogpilot/third_party/influxdb_client/domain/deadman_check.py deleted file mode 100644 index 81e368fab..000000000 --- a/frogpilot/third_party/influxdb_client/domain/deadman_check.py +++ /dev/null @@ -1,354 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.check_discriminator import CheckDiscriminator - - -class DeadmanCheck(CheckDiscriminator): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'time_since': 'str', - 'stale_time': 'str', - 'report_zero': 'bool', - 'level': 'CheckStatusLevel', - 'every': 'str', - 'offset': 'str', - 'tags': 'list[object]', - 'status_message_template': 'str', - 'id': 'str', - 'name': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'query': 'DashboardQuery', - 'status': 'TaskStatusType', - 'description': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'labels': 'list[Label]', - 'links': 'CheckBaseLinks' - } - - attribute_map = { - 'type': 'type', - 'time_since': 'timeSince', - 'stale_time': 'staleTime', - 'report_zero': 'reportZero', - 'level': 'level', - 'every': 'every', - 'offset': 'offset', - 'tags': 'tags', - 'status_message_template': 'statusMessageTemplate', - 'id': 'id', - 'name': 'name', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'query': 'query', - 'status': 'status', - 'description': 'description', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, type="deadman", time_since=None, stale_time=None, report_zero=None, level=None, every=None, offset=None, tags=None, status_message_template=None, id=None, name=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, query=None, status=None, description=None, latest_completed=None, last_run_status=None, last_run_error=None, labels=None, links=None): # noqa: E501,D401,D403 - """DeadmanCheck - a model defined in OpenAPI.""" # noqa: E501 - CheckDiscriminator.__init__(self, id=id, name=name, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, query=query, status=status, description=description, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, labels=labels, links=links) # noqa: E501 - - self._type = None - self._time_since = None - self._stale_time = None - self._report_zero = None - self._level = None - self._every = None - self._offset = None - self._tags = None - self._status_message_template = None - self.discriminator = None - - self.type = type - if time_since is not None: - self.time_since = time_since - if stale_time is not None: - self.stale_time = stale_time - if report_zero is not None: - self.report_zero = report_zero - if level is not None: - self.level = level - if every is not None: - self.every = every - if offset is not None: - self.offset = offset - if tags is not None: - self.tags = tags - if status_message_template is not None: - self.status_message_template = status_message_template - - @property - def type(self): - """Get the type of this DeadmanCheck. - - :return: The type of this DeadmanCheck. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this DeadmanCheck. - - :param type: The type of this DeadmanCheck. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def time_since(self): - """Get the time_since of this DeadmanCheck. - - String duration before deadman triggers. - - :return: The time_since of this DeadmanCheck. - :rtype: str - """ # noqa: E501 - return self._time_since - - @time_since.setter - def time_since(self, time_since): - """Set the time_since of this DeadmanCheck. - - String duration before deadman triggers. - - :param time_since: The time_since of this DeadmanCheck. - :type: str - """ # noqa: E501 - self._time_since = time_since - - @property - def stale_time(self): - """Get the stale_time of this DeadmanCheck. - - String duration for time that a series is considered stale and should not trigger deadman. - - :return: The stale_time of this DeadmanCheck. - :rtype: str - """ # noqa: E501 - return self._stale_time - - @stale_time.setter - def stale_time(self, stale_time): - """Set the stale_time of this DeadmanCheck. - - String duration for time that a series is considered stale and should not trigger deadman. - - :param stale_time: The stale_time of this DeadmanCheck. - :type: str - """ # noqa: E501 - self._stale_time = stale_time - - @property - def report_zero(self): - """Get the report_zero of this DeadmanCheck. - - If only zero values reported since time, trigger an alert - - :return: The report_zero of this DeadmanCheck. - :rtype: bool - """ # noqa: E501 - return self._report_zero - - @report_zero.setter - def report_zero(self, report_zero): - """Set the report_zero of this DeadmanCheck. - - If only zero values reported since time, trigger an alert - - :param report_zero: The report_zero of this DeadmanCheck. - :type: bool - """ # noqa: E501 - self._report_zero = report_zero - - @property - def level(self): - """Get the level of this DeadmanCheck. - - :return: The level of this DeadmanCheck. - :rtype: CheckStatusLevel - """ # noqa: E501 - return self._level - - @level.setter - def level(self, level): - """Set the level of this DeadmanCheck. - - :param level: The level of this DeadmanCheck. - :type: CheckStatusLevel - """ # noqa: E501 - self._level = level - - @property - def every(self): - """Get the every of this DeadmanCheck. - - Check repetition interval. - - :return: The every of this DeadmanCheck. - :rtype: str - """ # noqa: E501 - return self._every - - @every.setter - def every(self, every): - """Set the every of this DeadmanCheck. - - Check repetition interval. - - :param every: The every of this DeadmanCheck. - :type: str - """ # noqa: E501 - self._every = every - - @property - def offset(self): - """Get the offset of this DeadmanCheck. - - Duration to delay after the schedule, before executing check. - - :return: The offset of this DeadmanCheck. - :rtype: str - """ # noqa: E501 - return self._offset - - @offset.setter - def offset(self, offset): - """Set the offset of this DeadmanCheck. - - Duration to delay after the schedule, before executing check. - - :param offset: The offset of this DeadmanCheck. - :type: str - """ # noqa: E501 - self._offset = offset - - @property - def tags(self): - """Get the tags of this DeadmanCheck. - - List of tags to write to each status. - - :return: The tags of this DeadmanCheck. - :rtype: list[object] - """ # noqa: E501 - return self._tags - - @tags.setter - def tags(self, tags): - """Set the tags of this DeadmanCheck. - - List of tags to write to each status. - - :param tags: The tags of this DeadmanCheck. - :type: list[object] - """ # noqa: E501 - self._tags = tags - - @property - def status_message_template(self): - """Get the status_message_template of this DeadmanCheck. - - The template used to generate and write a status message. - - :return: The status_message_template of this DeadmanCheck. - :rtype: str - """ # noqa: E501 - return self._status_message_template - - @status_message_template.setter - def status_message_template(self, status_message_template): - """Set the status_message_template of this DeadmanCheck. - - The template used to generate and write a status message. - - :param status_message_template: The status_message_template of this DeadmanCheck. - :type: str - """ # noqa: E501 - self._status_message_template = status_message_template - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DeadmanCheck): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/decimal_places.py b/frogpilot/third_party/influxdb_client/domain/decimal_places.py deleted file mode 100644 index 7a855a6d6..000000000 --- a/frogpilot/third_party/influxdb_client/domain/decimal_places.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class DecimalPlaces(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'is_enforced': 'bool', - 'digits': 'int' - } - - attribute_map = { - 'is_enforced': 'isEnforced', - 'digits': 'digits' - } - - def __init__(self, is_enforced=None, digits=None): # noqa: E501,D401,D403 - """DecimalPlaces - a model defined in OpenAPI.""" # noqa: E501 - self._is_enforced = None - self._digits = None - self.discriminator = None - - if is_enforced is not None: - self.is_enforced = is_enforced - if digits is not None: - self.digits = digits - - @property - def is_enforced(self): - """Get the is_enforced of this DecimalPlaces. - - Indicates whether decimal point setting should be enforced - - :return: The is_enforced of this DecimalPlaces. - :rtype: bool - """ # noqa: E501 - return self._is_enforced - - @is_enforced.setter - def is_enforced(self, is_enforced): - """Set the is_enforced of this DecimalPlaces. - - Indicates whether decimal point setting should be enforced - - :param is_enforced: The is_enforced of this DecimalPlaces. - :type: bool - """ # noqa: E501 - self._is_enforced = is_enforced - - @property - def digits(self): - """Get the digits of this DecimalPlaces. - - The number of digits after decimal to display - - :return: The digits of this DecimalPlaces. - :rtype: int - """ # noqa: E501 - return self._digits - - @digits.setter - def digits(self, digits): - """Set the digits of this DecimalPlaces. - - The number of digits after decimal to display - - :param digits: The digits of this DecimalPlaces. - :type: int - """ # noqa: E501 - self._digits = digits - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DecimalPlaces): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/delete_predicate_request.py b/frogpilot/third_party/influxdb_client/domain/delete_predicate_request.py deleted file mode 100644 index 13202910d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/delete_predicate_request.py +++ /dev/null @@ -1,167 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class DeletePredicateRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'start': 'datetime', - 'stop': 'datetime', - 'predicate': 'str' - } - - attribute_map = { - 'start': 'start', - 'stop': 'stop', - 'predicate': 'predicate' - } - - def __init__(self, start=None, stop=None, predicate=None): # noqa: E501,D401,D403 - """DeletePredicateRequest - a model defined in OpenAPI.""" # noqa: E501 - self._start = None - self._stop = None - self._predicate = None - self.discriminator = None - - self.start = start - self.stop = stop - if predicate is not None: - self.predicate = predicate - - @property - def start(self): - """Get the start of this DeletePredicateRequest. - - A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)). The earliest time to delete from. - - :return: The start of this DeletePredicateRequest. - :rtype: datetime - """ # noqa: E501 - return self._start - - @start.setter - def start(self, start): - """Set the start of this DeletePredicateRequest. - - A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)). The earliest time to delete from. - - :param start: The start of this DeletePredicateRequest. - :type: datetime - """ # noqa: E501 - if start is None: - raise ValueError("Invalid value for `start`, must not be `None`") # noqa: E501 - self._start = start - - @property - def stop(self): - """Get the stop of this DeletePredicateRequest. - - A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)). The latest time to delete from. - - :return: The stop of this DeletePredicateRequest. - :rtype: datetime - """ # noqa: E501 - return self._stop - - @stop.setter - def stop(self, stop): - """Set the stop of this DeletePredicateRequest. - - A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)). The latest time to delete from. - - :param stop: The stop of this DeletePredicateRequest. - :type: datetime - """ # noqa: E501 - if stop is None: - raise ValueError("Invalid value for `stop`, must not be `None`") # noqa: E501 - self._stop = stop - - @property - def predicate(self): - """Get the predicate of this DeletePredicateRequest. - - An expression in [delete predicate syntax](https://docs.influxdata.com/influxdb/latest/reference/syntax/delete-predicate/). - - :return: The predicate of this DeletePredicateRequest. - :rtype: str - """ # noqa: E501 - return self._predicate - - @predicate.setter - def predicate(self, predicate): - """Set the predicate of this DeletePredicateRequest. - - An expression in [delete predicate syntax](https://docs.influxdata.com/influxdb/latest/reference/syntax/delete-predicate/). - - :param predicate: The predicate of this DeletePredicateRequest. - :type: str - """ # noqa: E501 - self._predicate = predicate - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DeletePredicateRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/dialect.py b/frogpilot/third_party/influxdb_client/domain/dialect.py deleted file mode 100644 index 18bc75329..000000000 --- a/frogpilot/third_party/influxdb_client/domain/dialect.py +++ /dev/null @@ -1,234 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Dialect(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'header': 'bool', - 'delimiter': 'str', - 'annotations': 'list[str]', - 'comment_prefix': 'str', - 'date_time_format': 'str' - } - - attribute_map = { - 'header': 'header', - 'delimiter': 'delimiter', - 'annotations': 'annotations', - 'comment_prefix': 'commentPrefix', - 'date_time_format': 'dateTimeFormat' - } - - def __init__(self, header=True, delimiter=',', annotations=None, comment_prefix='#', date_time_format='RFC3339'): # noqa: E501,D401,D403 - """Dialect - a model defined in OpenAPI.""" # noqa: E501 - self._header = None - self._delimiter = None - self._annotations = None - self._comment_prefix = None - self._date_time_format = None - self.discriminator = None - - if header is not None: - self.header = header - if delimiter is not None: - self.delimiter = delimiter - if annotations is not None: - self.annotations = annotations - if comment_prefix is not None: - self.comment_prefix = comment_prefix - if date_time_format is not None: - self.date_time_format = date_time_format - - @property - def header(self): - """Get the header of this Dialect. - - If true, the results contain a header row. - - :return: The header of this Dialect. - :rtype: bool - """ # noqa: E501 - return self._header - - @header.setter - def header(self, header): - """Set the header of this Dialect. - - If true, the results contain a header row. - - :param header: The header of this Dialect. - :type: bool - """ # noqa: E501 - self._header = header - - @property - def delimiter(self): - """Get the delimiter of this Dialect. - - The separator used between cells. Default is a comma (`,`). - - :return: The delimiter of this Dialect. - :rtype: str - """ # noqa: E501 - return self._delimiter - - @delimiter.setter - def delimiter(self, delimiter): - """Set the delimiter of this Dialect. - - The separator used between cells. Default is a comma (`,`). - - :param delimiter: The delimiter of this Dialect. - :type: str - """ # noqa: E501 - if delimiter is not None and len(delimiter) > 1: - raise ValueError("Invalid value for `delimiter`, length must be less than or equal to `1`") # noqa: E501 - if delimiter is not None and len(delimiter) < 1: - raise ValueError("Invalid value for `delimiter`, length must be greater than or equal to `1`") # noqa: E501 - self._delimiter = delimiter - - @property - def annotations(self): - """Get the annotations of this Dialect. - - Annotation rows to include in the results. An _annotation_ is metadata associated with an object (column) in the data model. #### Related guides - See [Annotated CSV annotations](https://docs.influxdata.com/influxdb/latest/reference/syntax/annotated-csv/#annotations) for examples and more information. For more information about **annotations** in tabular data, see [W3 metadata vocabulary for tabular data](https://www.w3.org/TR/2015/REC-tabular-data-model-20151217/#columns). - - :return: The annotations of this Dialect. - :rtype: list[str] - """ # noqa: E501 - return self._annotations - - @annotations.setter - def annotations(self, annotations): - """Set the annotations of this Dialect. - - Annotation rows to include in the results. An _annotation_ is metadata associated with an object (column) in the data model. #### Related guides - See [Annotated CSV annotations](https://docs.influxdata.com/influxdb/latest/reference/syntax/annotated-csv/#annotations) for examples and more information. For more information about **annotations** in tabular data, see [W3 metadata vocabulary for tabular data](https://www.w3.org/TR/2015/REC-tabular-data-model-20151217/#columns). - - :param annotations: The annotations of this Dialect. - :type: list[str] - """ # noqa: E501 - allowed_values = ["group", "datatype", "default"] # noqa: E501 - if not set(annotations).issubset(set(allowed_values)): - raise ValueError( - "Invalid values for `annotations` [{0}], must be a subset of [{1}]" # noqa: E501 - .format(", ".join(map(str, set(annotations) - set(allowed_values))), # noqa: E501 - ", ".join(map(str, allowed_values))) - ) - self._annotations = annotations - - @property - def comment_prefix(self): - """Get the comment_prefix of this Dialect. - - The character prefixed to comment strings. Default is a number sign (`#`). - - :return: The comment_prefix of this Dialect. - :rtype: str - """ # noqa: E501 - return self._comment_prefix - - @comment_prefix.setter - def comment_prefix(self, comment_prefix): - """Set the comment_prefix of this Dialect. - - The character prefixed to comment strings. Default is a number sign (`#`). - - :param comment_prefix: The comment_prefix of this Dialect. - :type: str - """ # noqa: E501 - if comment_prefix is not None and len(comment_prefix) > 1: - raise ValueError("Invalid value for `comment_prefix`, length must be less than or equal to `1`") # noqa: E501 - if comment_prefix is not None and len(comment_prefix) < 0: - raise ValueError("Invalid value for `comment_prefix`, length must be greater than or equal to `0`") # noqa: E501 - self._comment_prefix = comment_prefix - - @property - def date_time_format(self): - """Get the date_time_format of this Dialect. - - The format for timestamps in results. Default is [`RFC3339` date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp). To include nanoseconds in timestamps, use `RFC3339Nano`. #### Example formatted date/time values | Format | Value | |:------------|:----------------------------| | `RFC3339` | `"2006-01-02T15:04:05Z07:00"` | | `RFC3339Nano` | `"2006-01-02T15:04:05.999999999Z07:00"` | - - :return: The date_time_format of this Dialect. - :rtype: str - """ # noqa: E501 - return self._date_time_format - - @date_time_format.setter - def date_time_format(self, date_time_format): - """Set the date_time_format of this Dialect. - - The format for timestamps in results. Default is [`RFC3339` date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp). To include nanoseconds in timestamps, use `RFC3339Nano`. #### Example formatted date/time values | Format | Value | |:------------|:----------------------------| | `RFC3339` | `"2006-01-02T15:04:05Z07:00"` | | `RFC3339Nano` | `"2006-01-02T15:04:05.999999999Z07:00"` | - - :param date_time_format: The date_time_format of this Dialect. - :type: str - """ # noqa: E501 - self._date_time_format = date_time_format - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Dialect): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/dict_expression.py b/frogpilot/third_party/influxdb_client/domain/dict_expression.py deleted file mode 100644 index f6c0242c3..000000000 --- a/frogpilot/third_party/influxdb_client/domain/dict_expression.py +++ /dev/null @@ -1,142 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class DictExpression(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'elements': 'list[DictItem]' - } - - attribute_map = { - 'type': 'type', - 'elements': 'elements' - } - - def __init__(self, type=None, elements=None): # noqa: E501,D401,D403 - """DictExpression - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._elements = None - self.discriminator = None - - if type is not None: - self.type = type - if elements is not None: - self.elements = elements - - @property - def type(self): - """Get the type of this DictExpression. - - Type of AST node - - :return: The type of this DictExpression. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this DictExpression. - - Type of AST node - - :param type: The type of this DictExpression. - :type: str - """ # noqa: E501 - self._type = type - - @property - def elements(self): - """Get the elements of this DictExpression. - - Elements of the dictionary - - :return: The elements of this DictExpression. - :rtype: list[DictItem] - """ # noqa: E501 - return self._elements - - @elements.setter - def elements(self, elements): - """Set the elements of this DictExpression. - - Elements of the dictionary - - :param elements: The elements of this DictExpression. - :type: list[DictItem] - """ # noqa: E501 - self._elements = elements - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DictExpression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/dict_item.py b/frogpilot/third_party/influxdb_client/domain/dict_item.py deleted file mode 100644 index 77beac923..000000000 --- a/frogpilot/third_party/influxdb_client/domain/dict_item.py +++ /dev/null @@ -1,157 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class DictItem(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'key': 'Expression', - 'val': 'Expression' - } - - attribute_map = { - 'type': 'type', - 'key': 'key', - 'val': 'val' - } - - def __init__(self, type=None, key=None, val=None): # noqa: E501,D401,D403 - """DictItem - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self._key = None - self._val = None - self.discriminator = None - - if type is not None: - self.type = type - if key is not None: - self.key = key - if val is not None: - self.val = val - - @property - def type(self): - """Get the type of this DictItem. - - Type of AST node - - :return: The type of this DictItem. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this DictItem. - - Type of AST node - - :param type: The type of this DictItem. - :type: str - """ # noqa: E501 - self._type = type - - @property - def key(self): - """Get the key of this DictItem. - - :return: The key of this DictItem. - :rtype: Expression - """ # noqa: E501 - return self._key - - @key.setter - def key(self, key): - """Set the key of this DictItem. - - :param key: The key of this DictItem. - :type: Expression - """ # noqa: E501 - self._key = key - - @property - def val(self): - """Get the val of this DictItem. - - :return: The val of this DictItem. - :rtype: Expression - """ # noqa: E501 - return self._val - - @val.setter - def val(self, val): - """Set the val of this DictItem. - - :param val: The val of this DictItem. - :type: Expression - """ # noqa: E501 - self._val = val - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DictItem): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/duration.py b/frogpilot/third_party/influxdb_client/domain/duration.py deleted file mode 100644 index 510444443..000000000 --- a/frogpilot/third_party/influxdb_client/domain/duration.py +++ /dev/null @@ -1,157 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Duration(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'magnitude': 'int', - 'unit': 'str' - } - - attribute_map = { - 'type': 'type', - 'magnitude': 'magnitude', - 'unit': 'unit' - } - - def __init__(self, type=None, magnitude=None, unit=None): # noqa: E501,D401,D403 - """Duration - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self._magnitude = None - self._unit = None - self.discriminator = None - - if type is not None: - self.type = type - if magnitude is not None: - self.magnitude = magnitude - if unit is not None: - self.unit = unit - - @property - def type(self): - """Get the type of this Duration. - - Type of AST node - - :return: The type of this Duration. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this Duration. - - Type of AST node - - :param type: The type of this Duration. - :type: str - """ # noqa: E501 - self._type = type - - @property - def magnitude(self): - """Get the magnitude of this Duration. - - :return: The magnitude of this Duration. - :rtype: int - """ # noqa: E501 - return self._magnitude - - @magnitude.setter - def magnitude(self, magnitude): - """Set the magnitude of this Duration. - - :param magnitude: The magnitude of this Duration. - :type: int - """ # noqa: E501 - self._magnitude = magnitude - - @property - def unit(self): - """Get the unit of this Duration. - - :return: The unit of this Duration. - :rtype: str - """ # noqa: E501 - return self._unit - - @unit.setter - def unit(self, unit): - """Set the unit of this Duration. - - :param unit: The unit of this Duration. - :type: str - """ # noqa: E501 - self._unit = unit - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Duration): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/duration_literal.py b/frogpilot/third_party/influxdb_client/domain/duration_literal.py deleted file mode 100644 index f6d639655..000000000 --- a/frogpilot/third_party/influxdb_client/domain/duration_literal.py +++ /dev/null @@ -1,142 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class DurationLiteral(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'values': 'list[Duration]' - } - - attribute_map = { - 'type': 'type', - 'values': 'values' - } - - def __init__(self, type=None, values=None): # noqa: E501,D401,D403 - """DurationLiteral - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._values = None - self.discriminator = None - - if type is not None: - self.type = type - if values is not None: - self.values = values - - @property - def type(self): - """Get the type of this DurationLiteral. - - Type of AST node - - :return: The type of this DurationLiteral. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this DurationLiteral. - - Type of AST node - - :param type: The type of this DurationLiteral. - :type: str - """ # noqa: E501 - self._type = type - - @property - def values(self): - """Get the values of this DurationLiteral. - - Duration values - - :return: The values of this DurationLiteral. - :rtype: list[Duration] - """ # noqa: E501 - return self._values - - @values.setter - def values(self, values): - """Set the values of this DurationLiteral. - - Duration values - - :param values: The values of this DurationLiteral. - :type: list[Duration] - """ # noqa: E501 - self._values = values - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, DurationLiteral): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/error.py b/frogpilot/third_party/influxdb_client/domain/error.py deleted file mode 100644 index 2a3655bb0..000000000 --- a/frogpilot/third_party/influxdb_client/domain/error.py +++ /dev/null @@ -1,193 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Error(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'code': 'str', - 'message': 'str', - 'op': 'str', - 'err': 'str' - } - - attribute_map = { - 'code': 'code', - 'message': 'message', - 'op': 'op', - 'err': 'err' - } - - def __init__(self, code=None, message=None, op=None, err=None): # noqa: E501,D401,D403 - """Error - a model defined in OpenAPI.""" # noqa: E501 - self._code = None - self._message = None - self._op = None - self._err = None - self.discriminator = None - - self.code = code - if message is not None: - self.message = message - if op is not None: - self.op = op - if err is not None: - self.err = err - - @property - def code(self): - """Get the code of this Error. - - code is the machine-readable error code. - - :return: The code of this Error. - :rtype: str - """ # noqa: E501 - return self._code - - @code.setter - def code(self, code): - """Set the code of this Error. - - code is the machine-readable error code. - - :param code: The code of this Error. - :type: str - """ # noqa: E501 - if code is None: - raise ValueError("Invalid value for `code`, must not be `None`") # noqa: E501 - self._code = code - - @property - def message(self): - """Get the message of this Error. - - Human-readable message. - - :return: The message of this Error. - :rtype: str - """ # noqa: E501 - return self._message - - @message.setter - def message(self, message): - """Set the message of this Error. - - Human-readable message. - - :param message: The message of this Error. - :type: str - """ # noqa: E501 - self._message = message - - @property - def op(self): - """Get the op of this Error. - - Describes the logical code operation when the error occurred. Useful for debugging. - - :return: The op of this Error. - :rtype: str - """ # noqa: E501 - return self._op - - @op.setter - def op(self, op): - """Set the op of this Error. - - Describes the logical code operation when the error occurred. Useful for debugging. - - :param op: The op of this Error. - :type: str - """ # noqa: E501 - self._op = op - - @property - def err(self): - """Get the err of this Error. - - Stack of errors that occurred during processing of the request. Useful for debugging. - - :return: The err of this Error. - :rtype: str - """ # noqa: E501 - return self._err - - @err.setter - def err(self, err): - """Set the err of this Error. - - Stack of errors that occurred during processing of the request. Useful for debugging. - - :param err: The err of this Error. - :type: str - """ # noqa: E501 - self._err = err - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Error): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/expression.py b/frogpilot/third_party/influxdb_client/domain/expression.py deleted file mode 100644 index 9d449fd45..000000000 --- a/frogpilot/third_party/influxdb_client/domain/expression.py +++ /dev/null @@ -1,86 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.node import Node - - -class Expression(Node): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """Expression - a model defined in OpenAPI.""" # noqa: E501 - Node.__init__(self) # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Expression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/expression_statement.py b/frogpilot/third_party/influxdb_client/domain/expression_statement.py deleted file mode 100644 index 04dd216d9..000000000 --- a/frogpilot/third_party/influxdb_client/domain/expression_statement.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.statement import Statement - - -class ExpressionStatement(Statement): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'expression': 'Expression' - } - - attribute_map = { - 'type': 'type', - 'expression': 'expression' - } - - def __init__(self, type=None, expression=None): # noqa: E501,D401,D403 - """ExpressionStatement - a model defined in OpenAPI.""" # noqa: E501 - Statement.__init__(self) # noqa: E501 - - self._type = None - self._expression = None - self.discriminator = None - - if type is not None: - self.type = type - if expression is not None: - self.expression = expression - - @property - def type(self): - """Get the type of this ExpressionStatement. - - Type of AST node - - :return: The type of this ExpressionStatement. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this ExpressionStatement. - - Type of AST node - - :param type: The type of this ExpressionStatement. - :type: str - """ # noqa: E501 - self._type = type - - @property - def expression(self): - """Get the expression of this ExpressionStatement. - - :return: The expression of this ExpressionStatement. - :rtype: Expression - """ # noqa: E501 - return self._expression - - @expression.setter - def expression(self, expression): - """Set the expression of this ExpressionStatement. - - :param expression: The expression of this ExpressionStatement. - :type: Expression - """ # noqa: E501 - self._expression = expression - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ExpressionStatement): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/field.py b/frogpilot/third_party/influxdb_client/domain/field.py deleted file mode 100644 index 62bc3d13e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/field.py +++ /dev/null @@ -1,192 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Field(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'value': 'str', - 'type': 'str', - 'alias': 'str', - 'args': 'list[Field]' - } - - attribute_map = { - 'value': 'value', - 'type': 'type', - 'alias': 'alias', - 'args': 'args' - } - - def __init__(self, value=None, type=None, alias=None, args=None): # noqa: E501,D401,D403 - """Field - a model defined in OpenAPI.""" # noqa: E501 - self._value = None - self._type = None - self._alias = None - self._args = None - self.discriminator = None - - if value is not None: - self.value = value - if type is not None: - self.type = type - if alias is not None: - self.alias = alias - if args is not None: - self.args = args - - @property - def value(self): - """Get the value of this Field. - - value is the value of the field. Meaning of the value is implied by the `type` key - - :return: The value of this Field. - :rtype: str - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this Field. - - value is the value of the field. Meaning of the value is implied by the `type` key - - :param value: The value of this Field. - :type: str - """ # noqa: E501 - self._value = value - - @property - def type(self): - """Get the type of this Field. - - `type` describes the field type. `func` is a function. `field` is a field reference. - - :return: The type of this Field. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this Field. - - `type` describes the field type. `func` is a function. `field` is a field reference. - - :param type: The type of this Field. - :type: str - """ # noqa: E501 - self._type = type - - @property - def alias(self): - """Get the alias of this Field. - - Alias overrides the field name in the returned response. Applies only if type is `func` - - :return: The alias of this Field. - :rtype: str - """ # noqa: E501 - return self._alias - - @alias.setter - def alias(self, alias): - """Set the alias of this Field. - - Alias overrides the field name in the returned response. Applies only if type is `func` - - :param alias: The alias of this Field. - :type: str - """ # noqa: E501 - self._alias = alias - - @property - def args(self): - """Get the args of this Field. - - Args are the arguments to the function - - :return: The args of this Field. - :rtype: list[Field] - """ # noqa: E501 - return self._args - - @args.setter - def args(self, args): - """Set the args of this Field. - - Args are the arguments to the function - - :param args: The args of this Field. - :type: list[Field] - """ # noqa: E501 - self._args = args - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Field): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/file.py b/frogpilot/third_party/influxdb_client/domain/file.py deleted file mode 100644 index 6d3ac8125..000000000 --- a/frogpilot/third_party/influxdb_client/domain/file.py +++ /dev/null @@ -1,215 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class File(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'name': 'str', - 'package': 'PackageClause', - 'imports': 'list[ImportDeclaration]', - 'body': 'list[Statement]' - } - - attribute_map = { - 'type': 'type', - 'name': 'name', - 'package': 'package', - 'imports': 'imports', - 'body': 'body' - } - - def __init__(self, type=None, name=None, package=None, imports=None, body=None): # noqa: E501,D401,D403 - """File - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self._name = None - self._package = None - self._imports = None - self._body = None - self.discriminator = None - - if type is not None: - self.type = type - if name is not None: - self.name = name - if package is not None: - self.package = package - if imports is not None: - self.imports = imports - if body is not None: - self.body = body - - @property - def type(self): - """Get the type of this File. - - Type of AST node - - :return: The type of this File. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this File. - - Type of AST node - - :param type: The type of this File. - :type: str - """ # noqa: E501 - self._type = type - - @property - def name(self): - """Get the name of this File. - - The name of the file. - - :return: The name of this File. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this File. - - The name of the file. - - :param name: The name of this File. - :type: str - """ # noqa: E501 - self._name = name - - @property - def package(self): - """Get the package of this File. - - :return: The package of this File. - :rtype: PackageClause - """ # noqa: E501 - return self._package - - @package.setter - def package(self, package): - """Set the package of this File. - - :param package: The package of this File. - :type: PackageClause - """ # noqa: E501 - self._package = package - - @property - def imports(self): - """Get the imports of this File. - - A list of package imports - - :return: The imports of this File. - :rtype: list[ImportDeclaration] - """ # noqa: E501 - return self._imports - - @imports.setter - def imports(self, imports): - """Set the imports of this File. - - A list of package imports - - :param imports: The imports of this File. - :type: list[ImportDeclaration] - """ # noqa: E501 - self._imports = imports - - @property - def body(self): - """Get the body of this File. - - List of Flux statements - - :return: The body of this File. - :rtype: list[Statement] - """ # noqa: E501 - return self._body - - @body.setter - def body(self, body): - """Set the body of this File. - - List of Flux statements - - :param body: The body of this File. - :type: list[Statement] - """ # noqa: E501 - self._body = body - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, File): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/float_literal.py b/frogpilot/third_party/influxdb_client/domain/float_literal.py deleted file mode 100644 index 41e8ec354..000000000 --- a/frogpilot/third_party/influxdb_client/domain/float_literal.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class FloatLiteral(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'value': 'float' - } - - attribute_map = { - 'type': 'type', - 'value': 'value' - } - - def __init__(self, type=None, value=None): # noqa: E501,D401,D403 - """FloatLiteral - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._value = None - self.discriminator = None - - if type is not None: - self.type = type - if value is not None: - self.value = value - - @property - def type(self): - """Get the type of this FloatLiteral. - - Type of AST node - - :return: The type of this FloatLiteral. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this FloatLiteral. - - Type of AST node - - :param type: The type of this FloatLiteral. - :type: str - """ # noqa: E501 - self._type = type - - @property - def value(self): - """Get the value of this FloatLiteral. - - :return: The value of this FloatLiteral. - :rtype: float - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this FloatLiteral. - - :param value: The value of this FloatLiteral. - :type: float - """ # noqa: E501 - self._value = value - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, FloatLiteral): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/flux_response.py b/frogpilot/third_party/influxdb_client/domain/flux_response.py deleted file mode 100644 index 94608114a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/flux_response.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class FluxResponse(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'flux': 'str' - } - - attribute_map = { - 'flux': 'flux' - } - - def __init__(self, flux=None): # noqa: E501,D401,D403 - """FluxResponse - a model defined in OpenAPI.""" # noqa: E501 - self._flux = None - self.discriminator = None - - if flux is not None: - self.flux = flux - - @property - def flux(self): - """Get the flux of this FluxResponse. - - :return: The flux of this FluxResponse. - :rtype: str - """ # noqa: E501 - return self._flux - - @flux.setter - def flux(self, flux): - """Set the flux of this FluxResponse. - - :param flux: The flux of this FluxResponse. - :type: str - """ # noqa: E501 - self._flux = flux - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, FluxResponse): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/flux_suggestion.py b/frogpilot/third_party/influxdb_client/domain/flux_suggestion.py deleted file mode 100644 index 46c692fbd..000000000 --- a/frogpilot/third_party/influxdb_client/domain/flux_suggestion.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class FluxSuggestion(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'params': 'dict(str, str)' - } - - attribute_map = { - 'name': 'name', - 'params': 'params' - } - - def __init__(self, name=None, params=None): # noqa: E501,D401,D403 - """FluxSuggestion - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._params = None - self.discriminator = None - - if name is not None: - self.name = name - if params is not None: - self.params = params - - @property - def name(self): - """Get the name of this FluxSuggestion. - - :return: The name of this FluxSuggestion. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this FluxSuggestion. - - :param name: The name of this FluxSuggestion. - :type: str - """ # noqa: E501 - self._name = name - - @property - def params(self): - """Get the params of this FluxSuggestion. - - :return: The params of this FluxSuggestion. - :rtype: dict(str, str) - """ # noqa: E501 - return self._params - - @params.setter - def params(self, params): - """Set the params of this FluxSuggestion. - - :param params: The params of this FluxSuggestion. - :type: dict(str, str) - """ # noqa: E501 - self._params = params - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, FluxSuggestion): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/flux_suggestions.py b/frogpilot/third_party/influxdb_client/domain/flux_suggestions.py deleted file mode 100644 index 38c3ccf87..000000000 --- a/frogpilot/third_party/influxdb_client/domain/flux_suggestions.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class FluxSuggestions(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'funcs': 'list[FluxSuggestion]' - } - - attribute_map = { - 'funcs': 'funcs' - } - - def __init__(self, funcs=None): # noqa: E501,D401,D403 - """FluxSuggestions - a model defined in OpenAPI.""" # noqa: E501 - self._funcs = None - self.discriminator = None - - if funcs is not None: - self.funcs = funcs - - @property - def funcs(self): - """Get the funcs of this FluxSuggestions. - - :return: The funcs of this FluxSuggestions. - :rtype: list[FluxSuggestion] - """ # noqa: E501 - return self._funcs - - @funcs.setter - def funcs(self, funcs): - """Set the funcs of this FluxSuggestions. - - :param funcs: The funcs of this FluxSuggestions. - :type: list[FluxSuggestion] - """ # noqa: E501 - self._funcs = funcs - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, FluxSuggestions): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/function_expression.py b/frogpilot/third_party/influxdb_client/domain/function_expression.py deleted file mode 100644 index b06c73876..000000000 --- a/frogpilot/third_party/influxdb_client/domain/function_expression.py +++ /dev/null @@ -1,165 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class FunctionExpression(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'params': 'list[ModelProperty]', - 'body': 'Node' - } - - attribute_map = { - 'type': 'type', - 'params': 'params', - 'body': 'body' - } - - def __init__(self, type=None, params=None, body=None): # noqa: E501,D401,D403 - """FunctionExpression - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._params = None - self._body = None - self.discriminator = None - - if type is not None: - self.type = type - if params is not None: - self.params = params - if body is not None: - self.body = body - - @property - def type(self): - """Get the type of this FunctionExpression. - - Type of AST node - - :return: The type of this FunctionExpression. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this FunctionExpression. - - Type of AST node - - :param type: The type of this FunctionExpression. - :type: str - """ # noqa: E501 - self._type = type - - @property - def params(self): - """Get the params of this FunctionExpression. - - Function parameters - - :return: The params of this FunctionExpression. - :rtype: list[ModelProperty] - """ # noqa: E501 - return self._params - - @params.setter - def params(self, params): - """Set the params of this FunctionExpression. - - Function parameters - - :param params: The params of this FunctionExpression. - :type: list[ModelProperty] - """ # noqa: E501 - self._params = params - - @property - def body(self): - """Get the body of this FunctionExpression. - - :return: The body of this FunctionExpression. - :rtype: Node - """ # noqa: E501 - return self._body - - @body.setter - def body(self, body): - """Set the body of this FunctionExpression. - - :param body: The body of this FunctionExpression. - :type: Node - """ # noqa: E501 - self._body = body - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, FunctionExpression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/gauge_view_properties.py b/frogpilot/third_party/influxdb_client/domain/gauge_view_properties.py deleted file mode 100644 index 237859874..000000000 --- a/frogpilot/third_party/influxdb_client/domain/gauge_view_properties.py +++ /dev/null @@ -1,360 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.view_properties import ViewProperties - - -class GaugeViewProperties(ViewProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'queries': 'list[DashboardQuery]', - 'colors': 'list[DashboardColor]', - 'shape': 'str', - 'note': 'str', - 'show_note_when_empty': 'bool', - 'prefix': 'str', - 'tick_prefix': 'str', - 'suffix': 'str', - 'tick_suffix': 'str', - 'decimal_places': 'DecimalPlaces' - } - - attribute_map = { - 'type': 'type', - 'queries': 'queries', - 'colors': 'colors', - 'shape': 'shape', - 'note': 'note', - 'show_note_when_empty': 'showNoteWhenEmpty', - 'prefix': 'prefix', - 'tick_prefix': 'tickPrefix', - 'suffix': 'suffix', - 'tick_suffix': 'tickSuffix', - 'decimal_places': 'decimalPlaces' - } - - def __init__(self, type=None, queries=None, colors=None, shape=None, note=None, show_note_when_empty=None, prefix=None, tick_prefix=None, suffix=None, tick_suffix=None, decimal_places=None): # noqa: E501,D401,D403 - """GaugeViewProperties - a model defined in OpenAPI.""" # noqa: E501 - ViewProperties.__init__(self) # noqa: E501 - - self._type = None - self._queries = None - self._colors = None - self._shape = None - self._note = None - self._show_note_when_empty = None - self._prefix = None - self._tick_prefix = None - self._suffix = None - self._tick_suffix = None - self._decimal_places = None - self.discriminator = None - - self.type = type - self.queries = queries - self.colors = colors - self.shape = shape - self.note = note - self.show_note_when_empty = show_note_when_empty - self.prefix = prefix - self.tick_prefix = tick_prefix - self.suffix = suffix - self.tick_suffix = tick_suffix - self.decimal_places = decimal_places - - @property - def type(self): - """Get the type of this GaugeViewProperties. - - :return: The type of this GaugeViewProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this GaugeViewProperties. - - :param type: The type of this GaugeViewProperties. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def queries(self): - """Get the queries of this GaugeViewProperties. - - :return: The queries of this GaugeViewProperties. - :rtype: list[DashboardQuery] - """ # noqa: E501 - return self._queries - - @queries.setter - def queries(self, queries): - """Set the queries of this GaugeViewProperties. - - :param queries: The queries of this GaugeViewProperties. - :type: list[DashboardQuery] - """ # noqa: E501 - if queries is None: - raise ValueError("Invalid value for `queries`, must not be `None`") # noqa: E501 - self._queries = queries - - @property - def colors(self): - """Get the colors of this GaugeViewProperties. - - Colors define color encoding of data into a visualization - - :return: The colors of this GaugeViewProperties. - :rtype: list[DashboardColor] - """ # noqa: E501 - return self._colors - - @colors.setter - def colors(self, colors): - """Set the colors of this GaugeViewProperties. - - Colors define color encoding of data into a visualization - - :param colors: The colors of this GaugeViewProperties. - :type: list[DashboardColor] - """ # noqa: E501 - if colors is None: - raise ValueError("Invalid value for `colors`, must not be `None`") # noqa: E501 - self._colors = colors - - @property - def shape(self): - """Get the shape of this GaugeViewProperties. - - :return: The shape of this GaugeViewProperties. - :rtype: str - """ # noqa: E501 - return self._shape - - @shape.setter - def shape(self, shape): - """Set the shape of this GaugeViewProperties. - - :param shape: The shape of this GaugeViewProperties. - :type: str - """ # noqa: E501 - if shape is None: - raise ValueError("Invalid value for `shape`, must not be `None`") # noqa: E501 - self._shape = shape - - @property - def note(self): - """Get the note of this GaugeViewProperties. - - :return: The note of this GaugeViewProperties. - :rtype: str - """ # noqa: E501 - return self._note - - @note.setter - def note(self, note): - """Set the note of this GaugeViewProperties. - - :param note: The note of this GaugeViewProperties. - :type: str - """ # noqa: E501 - if note is None: - raise ValueError("Invalid value for `note`, must not be `None`") # noqa: E501 - self._note = note - - @property - def show_note_when_empty(self): - """Get the show_note_when_empty of this GaugeViewProperties. - - If true, will display note when empty - - :return: The show_note_when_empty of this GaugeViewProperties. - :rtype: bool - """ # noqa: E501 - return self._show_note_when_empty - - @show_note_when_empty.setter - def show_note_when_empty(self, show_note_when_empty): - """Set the show_note_when_empty of this GaugeViewProperties. - - If true, will display note when empty - - :param show_note_when_empty: The show_note_when_empty of this GaugeViewProperties. - :type: bool - """ # noqa: E501 - if show_note_when_empty is None: - raise ValueError("Invalid value for `show_note_when_empty`, must not be `None`") # noqa: E501 - self._show_note_when_empty = show_note_when_empty - - @property - def prefix(self): - """Get the prefix of this GaugeViewProperties. - - :return: The prefix of this GaugeViewProperties. - :rtype: str - """ # noqa: E501 - return self._prefix - - @prefix.setter - def prefix(self, prefix): - """Set the prefix of this GaugeViewProperties. - - :param prefix: The prefix of this GaugeViewProperties. - :type: str - """ # noqa: E501 - if prefix is None: - raise ValueError("Invalid value for `prefix`, must not be `None`") # noqa: E501 - self._prefix = prefix - - @property - def tick_prefix(self): - """Get the tick_prefix of this GaugeViewProperties. - - :return: The tick_prefix of this GaugeViewProperties. - :rtype: str - """ # noqa: E501 - return self._tick_prefix - - @tick_prefix.setter - def tick_prefix(self, tick_prefix): - """Set the tick_prefix of this GaugeViewProperties. - - :param tick_prefix: The tick_prefix of this GaugeViewProperties. - :type: str - """ # noqa: E501 - if tick_prefix is None: - raise ValueError("Invalid value for `tick_prefix`, must not be `None`") # noqa: E501 - self._tick_prefix = tick_prefix - - @property - def suffix(self): - """Get the suffix of this GaugeViewProperties. - - :return: The suffix of this GaugeViewProperties. - :rtype: str - """ # noqa: E501 - return self._suffix - - @suffix.setter - def suffix(self, suffix): - """Set the suffix of this GaugeViewProperties. - - :param suffix: The suffix of this GaugeViewProperties. - :type: str - """ # noqa: E501 - if suffix is None: - raise ValueError("Invalid value for `suffix`, must not be `None`") # noqa: E501 - self._suffix = suffix - - @property - def tick_suffix(self): - """Get the tick_suffix of this GaugeViewProperties. - - :return: The tick_suffix of this GaugeViewProperties. - :rtype: str - """ # noqa: E501 - return self._tick_suffix - - @tick_suffix.setter - def tick_suffix(self, tick_suffix): - """Set the tick_suffix of this GaugeViewProperties. - - :param tick_suffix: The tick_suffix of this GaugeViewProperties. - :type: str - """ # noqa: E501 - if tick_suffix is None: - raise ValueError("Invalid value for `tick_suffix`, must not be `None`") # noqa: E501 - self._tick_suffix = tick_suffix - - @property - def decimal_places(self): - """Get the decimal_places of this GaugeViewProperties. - - :return: The decimal_places of this GaugeViewProperties. - :rtype: DecimalPlaces - """ # noqa: E501 - return self._decimal_places - - @decimal_places.setter - def decimal_places(self, decimal_places): - """Set the decimal_places of this GaugeViewProperties. - - :param decimal_places: The decimal_places of this GaugeViewProperties. - :type: DecimalPlaces - """ # noqa: E501 - if decimal_places is None: - raise ValueError("Invalid value for `decimal_places`, must not be `None`") # noqa: E501 - self._decimal_places = decimal_places - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, GaugeViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/greater_threshold.py b/frogpilot/third_party/influxdb_client/domain/greater_threshold.py deleted file mode 100644 index b857f1322..000000000 --- a/frogpilot/third_party/influxdb_client/domain/greater_threshold.py +++ /dev/null @@ -1,140 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.threshold_base import ThresholdBase - - -class GreaterThreshold(ThresholdBase): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'value': 'float', - 'level': 'CheckStatusLevel', - 'all_values': 'bool' - } - - attribute_map = { - 'type': 'type', - 'value': 'value', - 'level': 'level', - 'all_values': 'allValues' - } - - def __init__(self, type="greater", value=None, level=None, all_values=None): # noqa: E501,D401,D403 - """GreaterThreshold - a model defined in OpenAPI.""" # noqa: E501 - ThresholdBase.__init__(self, level=level, all_values=all_values) # noqa: E501 - - self._type = None - self._value = None - self.discriminator = None - - self.type = type - self.value = value - - @property - def type(self): - """Get the type of this GreaterThreshold. - - :return: The type of this GreaterThreshold. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this GreaterThreshold. - - :param type: The type of this GreaterThreshold. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def value(self): - """Get the value of this GreaterThreshold. - - :return: The value of this GreaterThreshold. - :rtype: float - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this GreaterThreshold. - - :param value: The value of this GreaterThreshold. - :type: float - """ # noqa: E501 - if value is None: - raise ValueError("Invalid value for `value`, must not be `None`") # noqa: E501 - self._value = value - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, GreaterThreshold): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/health_check.py b/frogpilot/third_party/influxdb_client/domain/health_check.py deleted file mode 100644 index b35524372..000000000 --- a/frogpilot/third_party/influxdb_client/domain/health_check.py +++ /dev/null @@ -1,224 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class HealthCheck(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'message': 'str', - 'checks': 'list[HealthCheck]', - 'status': 'str', - 'version': 'str', - 'commit': 'str' - } - - attribute_map = { - 'name': 'name', - 'message': 'message', - 'checks': 'checks', - 'status': 'status', - 'version': 'version', - 'commit': 'commit' - } - - def __init__(self, name=None, message=None, checks=None, status=None, version=None, commit=None): # noqa: E501,D401,D403 - """HealthCheck - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._message = None - self._checks = None - self._status = None - self._version = None - self._commit = None - self.discriminator = None - - self.name = name - if message is not None: - self.message = message - if checks is not None: - self.checks = checks - self.status = status - if version is not None: - self.version = version - if commit is not None: - self.commit = commit - - @property - def name(self): - """Get the name of this HealthCheck. - - :return: The name of this HealthCheck. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this HealthCheck. - - :param name: The name of this HealthCheck. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def message(self): - """Get the message of this HealthCheck. - - :return: The message of this HealthCheck. - :rtype: str - """ # noqa: E501 - return self._message - - @message.setter - def message(self, message): - """Set the message of this HealthCheck. - - :param message: The message of this HealthCheck. - :type: str - """ # noqa: E501 - self._message = message - - @property - def checks(self): - """Get the checks of this HealthCheck. - - :return: The checks of this HealthCheck. - :rtype: list[HealthCheck] - """ # noqa: E501 - return self._checks - - @checks.setter - def checks(self, checks): - """Set the checks of this HealthCheck. - - :param checks: The checks of this HealthCheck. - :type: list[HealthCheck] - """ # noqa: E501 - self._checks = checks - - @property - def status(self): - """Get the status of this HealthCheck. - - :return: The status of this HealthCheck. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this HealthCheck. - - :param status: The status of this HealthCheck. - :type: str - """ # noqa: E501 - if status is None: - raise ValueError("Invalid value for `status`, must not be `None`") # noqa: E501 - self._status = status - - @property - def version(self): - """Get the version of this HealthCheck. - - :return: The version of this HealthCheck. - :rtype: str - """ # noqa: E501 - return self._version - - @version.setter - def version(self, version): - """Set the version of this HealthCheck. - - :param version: The version of this HealthCheck. - :type: str - """ # noqa: E501 - self._version = version - - @property - def commit(self): - """Get the commit of this HealthCheck. - - :return: The commit of this HealthCheck. - :rtype: str - """ # noqa: E501 - return self._commit - - @commit.setter - def commit(self, commit): - """Set the commit of this HealthCheck. - - :param commit: The commit of this HealthCheck. - :type: str - """ # noqa: E501 - self._commit = commit - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, HealthCheck): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/heatmap_view_properties.py b/frogpilot/third_party/influxdb_client/domain/heatmap_view_properties.py deleted file mode 100644 index c4061b18f..000000000 --- a/frogpilot/third_party/influxdb_client/domain/heatmap_view_properties.py +++ /dev/null @@ -1,826 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.view_properties import ViewProperties - - -class HeatmapViewProperties(ViewProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'adaptive_zoom_hide': 'bool', - 'time_format': 'str', - 'type': 'str', - 'queries': 'list[DashboardQuery]', - 'colors': 'list[str]', - 'shape': 'str', - 'note': 'str', - 'show_note_when_empty': 'bool', - 'x_column': 'str', - 'generate_x_axis_ticks': 'list[str]', - 'x_total_ticks': 'int', - 'x_tick_start': 'float', - 'x_tick_step': 'float', - 'y_column': 'str', - 'generate_y_axis_ticks': 'list[str]', - 'y_total_ticks': 'int', - 'y_tick_start': 'float', - 'y_tick_step': 'float', - 'x_domain': 'list[float]', - 'y_domain': 'list[float]', - 'x_axis_label': 'str', - 'y_axis_label': 'str', - 'x_prefix': 'str', - 'x_suffix': 'str', - 'y_prefix': 'str', - 'y_suffix': 'str', - 'bin_size': 'float', - 'legend_colorize_rows': 'bool', - 'legend_hide': 'bool', - 'legend_opacity': 'float', - 'legend_orientation_threshold': 'int' - } - - attribute_map = { - 'adaptive_zoom_hide': 'adaptiveZoomHide', - 'time_format': 'timeFormat', - 'type': 'type', - 'queries': 'queries', - 'colors': 'colors', - 'shape': 'shape', - 'note': 'note', - 'show_note_when_empty': 'showNoteWhenEmpty', - 'x_column': 'xColumn', - 'generate_x_axis_ticks': 'generateXAxisTicks', - 'x_total_ticks': 'xTotalTicks', - 'x_tick_start': 'xTickStart', - 'x_tick_step': 'xTickStep', - 'y_column': 'yColumn', - 'generate_y_axis_ticks': 'generateYAxisTicks', - 'y_total_ticks': 'yTotalTicks', - 'y_tick_start': 'yTickStart', - 'y_tick_step': 'yTickStep', - 'x_domain': 'xDomain', - 'y_domain': 'yDomain', - 'x_axis_label': 'xAxisLabel', - 'y_axis_label': 'yAxisLabel', - 'x_prefix': 'xPrefix', - 'x_suffix': 'xSuffix', - 'y_prefix': 'yPrefix', - 'y_suffix': 'ySuffix', - 'bin_size': 'binSize', - 'legend_colorize_rows': 'legendColorizeRows', - 'legend_hide': 'legendHide', - 'legend_opacity': 'legendOpacity', - 'legend_orientation_threshold': 'legendOrientationThreshold' - } - - def __init__(self, adaptive_zoom_hide=None, time_format=None, type=None, queries=None, colors=None, shape=None, note=None, show_note_when_empty=None, x_column=None, generate_x_axis_ticks=None, x_total_ticks=None, x_tick_start=None, x_tick_step=None, y_column=None, generate_y_axis_ticks=None, y_total_ticks=None, y_tick_start=None, y_tick_step=None, x_domain=None, y_domain=None, x_axis_label=None, y_axis_label=None, x_prefix=None, x_suffix=None, y_prefix=None, y_suffix=None, bin_size=None, legend_colorize_rows=None, legend_hide=None, legend_opacity=None, legend_orientation_threshold=None): # noqa: E501,D401,D403 - """HeatmapViewProperties - a model defined in OpenAPI.""" # noqa: E501 - ViewProperties.__init__(self) # noqa: E501 - - self._adaptive_zoom_hide = None - self._time_format = None - self._type = None - self._queries = None - self._colors = None - self._shape = None - self._note = None - self._show_note_when_empty = None - self._x_column = None - self._generate_x_axis_ticks = None - self._x_total_ticks = None - self._x_tick_start = None - self._x_tick_step = None - self._y_column = None - self._generate_y_axis_ticks = None - self._y_total_ticks = None - self._y_tick_start = None - self._y_tick_step = None - self._x_domain = None - self._y_domain = None - self._x_axis_label = None - self._y_axis_label = None - self._x_prefix = None - self._x_suffix = None - self._y_prefix = None - self._y_suffix = None - self._bin_size = None - self._legend_colorize_rows = None - self._legend_hide = None - self._legend_opacity = None - self._legend_orientation_threshold = None - self.discriminator = None - - if adaptive_zoom_hide is not None: - self.adaptive_zoom_hide = adaptive_zoom_hide - if time_format is not None: - self.time_format = time_format - self.type = type - self.queries = queries - self.colors = colors - self.shape = shape - self.note = note - self.show_note_when_empty = show_note_when_empty - self.x_column = x_column - if generate_x_axis_ticks is not None: - self.generate_x_axis_ticks = generate_x_axis_ticks - if x_total_ticks is not None: - self.x_total_ticks = x_total_ticks - if x_tick_start is not None: - self.x_tick_start = x_tick_start - if x_tick_step is not None: - self.x_tick_step = x_tick_step - self.y_column = y_column - if generate_y_axis_ticks is not None: - self.generate_y_axis_ticks = generate_y_axis_ticks - if y_total_ticks is not None: - self.y_total_ticks = y_total_ticks - if y_tick_start is not None: - self.y_tick_start = y_tick_start - if y_tick_step is not None: - self.y_tick_step = y_tick_step - self.x_domain = x_domain - self.y_domain = y_domain - self.x_axis_label = x_axis_label - self.y_axis_label = y_axis_label - self.x_prefix = x_prefix - self.x_suffix = x_suffix - self.y_prefix = y_prefix - self.y_suffix = y_suffix - self.bin_size = bin_size - if legend_colorize_rows is not None: - self.legend_colorize_rows = legend_colorize_rows - if legend_hide is not None: - self.legend_hide = legend_hide - if legend_opacity is not None: - self.legend_opacity = legend_opacity - if legend_orientation_threshold is not None: - self.legend_orientation_threshold = legend_orientation_threshold - - @property - def adaptive_zoom_hide(self): - """Get the adaptive_zoom_hide of this HeatmapViewProperties. - - :return: The adaptive_zoom_hide of this HeatmapViewProperties. - :rtype: bool - """ # noqa: E501 - return self._adaptive_zoom_hide - - @adaptive_zoom_hide.setter - def adaptive_zoom_hide(self, adaptive_zoom_hide): - """Set the adaptive_zoom_hide of this HeatmapViewProperties. - - :param adaptive_zoom_hide: The adaptive_zoom_hide of this HeatmapViewProperties. - :type: bool - """ # noqa: E501 - self._adaptive_zoom_hide = adaptive_zoom_hide - - @property - def time_format(self): - """Get the time_format of this HeatmapViewProperties. - - :return: The time_format of this HeatmapViewProperties. - :rtype: str - """ # noqa: E501 - return self._time_format - - @time_format.setter - def time_format(self, time_format): - """Set the time_format of this HeatmapViewProperties. - - :param time_format: The time_format of this HeatmapViewProperties. - :type: str - """ # noqa: E501 - self._time_format = time_format - - @property - def type(self): - """Get the type of this HeatmapViewProperties. - - :return: The type of this HeatmapViewProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this HeatmapViewProperties. - - :param type: The type of this HeatmapViewProperties. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def queries(self): - """Get the queries of this HeatmapViewProperties. - - :return: The queries of this HeatmapViewProperties. - :rtype: list[DashboardQuery] - """ # noqa: E501 - return self._queries - - @queries.setter - def queries(self, queries): - """Set the queries of this HeatmapViewProperties. - - :param queries: The queries of this HeatmapViewProperties. - :type: list[DashboardQuery] - """ # noqa: E501 - if queries is None: - raise ValueError("Invalid value for `queries`, must not be `None`") # noqa: E501 - self._queries = queries - - @property - def colors(self): - """Get the colors of this HeatmapViewProperties. - - Colors define color encoding of data into a visualization - - :return: The colors of this HeatmapViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._colors - - @colors.setter - def colors(self, colors): - """Set the colors of this HeatmapViewProperties. - - Colors define color encoding of data into a visualization - - :param colors: The colors of this HeatmapViewProperties. - :type: list[str] - """ # noqa: E501 - if colors is None: - raise ValueError("Invalid value for `colors`, must not be `None`") # noqa: E501 - self._colors = colors - - @property - def shape(self): - """Get the shape of this HeatmapViewProperties. - - :return: The shape of this HeatmapViewProperties. - :rtype: str - """ # noqa: E501 - return self._shape - - @shape.setter - def shape(self, shape): - """Set the shape of this HeatmapViewProperties. - - :param shape: The shape of this HeatmapViewProperties. - :type: str - """ # noqa: E501 - if shape is None: - raise ValueError("Invalid value for `shape`, must not be `None`") # noqa: E501 - self._shape = shape - - @property - def note(self): - """Get the note of this HeatmapViewProperties. - - :return: The note of this HeatmapViewProperties. - :rtype: str - """ # noqa: E501 - return self._note - - @note.setter - def note(self, note): - """Set the note of this HeatmapViewProperties. - - :param note: The note of this HeatmapViewProperties. - :type: str - """ # noqa: E501 - if note is None: - raise ValueError("Invalid value for `note`, must not be `None`") # noqa: E501 - self._note = note - - @property - def show_note_when_empty(self): - """Get the show_note_when_empty of this HeatmapViewProperties. - - If true, will display note when empty - - :return: The show_note_when_empty of this HeatmapViewProperties. - :rtype: bool - """ # noqa: E501 - return self._show_note_when_empty - - @show_note_when_empty.setter - def show_note_when_empty(self, show_note_when_empty): - """Set the show_note_when_empty of this HeatmapViewProperties. - - If true, will display note when empty - - :param show_note_when_empty: The show_note_when_empty of this HeatmapViewProperties. - :type: bool - """ # noqa: E501 - if show_note_when_empty is None: - raise ValueError("Invalid value for `show_note_when_empty`, must not be `None`") # noqa: E501 - self._show_note_when_empty = show_note_when_empty - - @property - def x_column(self): - """Get the x_column of this HeatmapViewProperties. - - :return: The x_column of this HeatmapViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_column - - @x_column.setter - def x_column(self, x_column): - """Set the x_column of this HeatmapViewProperties. - - :param x_column: The x_column of this HeatmapViewProperties. - :type: str - """ # noqa: E501 - if x_column is None: - raise ValueError("Invalid value for `x_column`, must not be `None`") # noqa: E501 - self._x_column = x_column - - @property - def generate_x_axis_ticks(self): - """Get the generate_x_axis_ticks of this HeatmapViewProperties. - - :return: The generate_x_axis_ticks of this HeatmapViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._generate_x_axis_ticks - - @generate_x_axis_ticks.setter - def generate_x_axis_ticks(self, generate_x_axis_ticks): - """Set the generate_x_axis_ticks of this HeatmapViewProperties. - - :param generate_x_axis_ticks: The generate_x_axis_ticks of this HeatmapViewProperties. - :type: list[str] - """ # noqa: E501 - self._generate_x_axis_ticks = generate_x_axis_ticks - - @property - def x_total_ticks(self): - """Get the x_total_ticks of this HeatmapViewProperties. - - :return: The x_total_ticks of this HeatmapViewProperties. - :rtype: int - """ # noqa: E501 - return self._x_total_ticks - - @x_total_ticks.setter - def x_total_ticks(self, x_total_ticks): - """Set the x_total_ticks of this HeatmapViewProperties. - - :param x_total_ticks: The x_total_ticks of this HeatmapViewProperties. - :type: int - """ # noqa: E501 - self._x_total_ticks = x_total_ticks - - @property - def x_tick_start(self): - """Get the x_tick_start of this HeatmapViewProperties. - - :return: The x_tick_start of this HeatmapViewProperties. - :rtype: float - """ # noqa: E501 - return self._x_tick_start - - @x_tick_start.setter - def x_tick_start(self, x_tick_start): - """Set the x_tick_start of this HeatmapViewProperties. - - :param x_tick_start: The x_tick_start of this HeatmapViewProperties. - :type: float - """ # noqa: E501 - self._x_tick_start = x_tick_start - - @property - def x_tick_step(self): - """Get the x_tick_step of this HeatmapViewProperties. - - :return: The x_tick_step of this HeatmapViewProperties. - :rtype: float - """ # noqa: E501 - return self._x_tick_step - - @x_tick_step.setter - def x_tick_step(self, x_tick_step): - """Set the x_tick_step of this HeatmapViewProperties. - - :param x_tick_step: The x_tick_step of this HeatmapViewProperties. - :type: float - """ # noqa: E501 - self._x_tick_step = x_tick_step - - @property - def y_column(self): - """Get the y_column of this HeatmapViewProperties. - - :return: The y_column of this HeatmapViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_column - - @y_column.setter - def y_column(self, y_column): - """Set the y_column of this HeatmapViewProperties. - - :param y_column: The y_column of this HeatmapViewProperties. - :type: str - """ # noqa: E501 - if y_column is None: - raise ValueError("Invalid value for `y_column`, must not be `None`") # noqa: E501 - self._y_column = y_column - - @property - def generate_y_axis_ticks(self): - """Get the generate_y_axis_ticks of this HeatmapViewProperties. - - :return: The generate_y_axis_ticks of this HeatmapViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._generate_y_axis_ticks - - @generate_y_axis_ticks.setter - def generate_y_axis_ticks(self, generate_y_axis_ticks): - """Set the generate_y_axis_ticks of this HeatmapViewProperties. - - :param generate_y_axis_ticks: The generate_y_axis_ticks of this HeatmapViewProperties. - :type: list[str] - """ # noqa: E501 - self._generate_y_axis_ticks = generate_y_axis_ticks - - @property - def y_total_ticks(self): - """Get the y_total_ticks of this HeatmapViewProperties. - - :return: The y_total_ticks of this HeatmapViewProperties. - :rtype: int - """ # noqa: E501 - return self._y_total_ticks - - @y_total_ticks.setter - def y_total_ticks(self, y_total_ticks): - """Set the y_total_ticks of this HeatmapViewProperties. - - :param y_total_ticks: The y_total_ticks of this HeatmapViewProperties. - :type: int - """ # noqa: E501 - self._y_total_ticks = y_total_ticks - - @property - def y_tick_start(self): - """Get the y_tick_start of this HeatmapViewProperties. - - :return: The y_tick_start of this HeatmapViewProperties. - :rtype: float - """ # noqa: E501 - return self._y_tick_start - - @y_tick_start.setter - def y_tick_start(self, y_tick_start): - """Set the y_tick_start of this HeatmapViewProperties. - - :param y_tick_start: The y_tick_start of this HeatmapViewProperties. - :type: float - """ # noqa: E501 - self._y_tick_start = y_tick_start - - @property - def y_tick_step(self): - """Get the y_tick_step of this HeatmapViewProperties. - - :return: The y_tick_step of this HeatmapViewProperties. - :rtype: float - """ # noqa: E501 - return self._y_tick_step - - @y_tick_step.setter - def y_tick_step(self, y_tick_step): - """Set the y_tick_step of this HeatmapViewProperties. - - :param y_tick_step: The y_tick_step of this HeatmapViewProperties. - :type: float - """ # noqa: E501 - self._y_tick_step = y_tick_step - - @property - def x_domain(self): - """Get the x_domain of this HeatmapViewProperties. - - :return: The x_domain of this HeatmapViewProperties. - :rtype: list[float] - """ # noqa: E501 - return self._x_domain - - @x_domain.setter - def x_domain(self, x_domain): - """Set the x_domain of this HeatmapViewProperties. - - :param x_domain: The x_domain of this HeatmapViewProperties. - :type: list[float] - """ # noqa: E501 - if x_domain is None: - raise ValueError("Invalid value for `x_domain`, must not be `None`") # noqa: E501 - self._x_domain = x_domain - - @property - def y_domain(self): - """Get the y_domain of this HeatmapViewProperties. - - :return: The y_domain of this HeatmapViewProperties. - :rtype: list[float] - """ # noqa: E501 - return self._y_domain - - @y_domain.setter - def y_domain(self, y_domain): - """Set the y_domain of this HeatmapViewProperties. - - :param y_domain: The y_domain of this HeatmapViewProperties. - :type: list[float] - """ # noqa: E501 - if y_domain is None: - raise ValueError("Invalid value for `y_domain`, must not be `None`") # noqa: E501 - self._y_domain = y_domain - - @property - def x_axis_label(self): - """Get the x_axis_label of this HeatmapViewProperties. - - :return: The x_axis_label of this HeatmapViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_axis_label - - @x_axis_label.setter - def x_axis_label(self, x_axis_label): - """Set the x_axis_label of this HeatmapViewProperties. - - :param x_axis_label: The x_axis_label of this HeatmapViewProperties. - :type: str - """ # noqa: E501 - if x_axis_label is None: - raise ValueError("Invalid value for `x_axis_label`, must not be `None`") # noqa: E501 - self._x_axis_label = x_axis_label - - @property - def y_axis_label(self): - """Get the y_axis_label of this HeatmapViewProperties. - - :return: The y_axis_label of this HeatmapViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_axis_label - - @y_axis_label.setter - def y_axis_label(self, y_axis_label): - """Set the y_axis_label of this HeatmapViewProperties. - - :param y_axis_label: The y_axis_label of this HeatmapViewProperties. - :type: str - """ # noqa: E501 - if y_axis_label is None: - raise ValueError("Invalid value for `y_axis_label`, must not be `None`") # noqa: E501 - self._y_axis_label = y_axis_label - - @property - def x_prefix(self): - """Get the x_prefix of this HeatmapViewProperties. - - :return: The x_prefix of this HeatmapViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_prefix - - @x_prefix.setter - def x_prefix(self, x_prefix): - """Set the x_prefix of this HeatmapViewProperties. - - :param x_prefix: The x_prefix of this HeatmapViewProperties. - :type: str - """ # noqa: E501 - if x_prefix is None: - raise ValueError("Invalid value for `x_prefix`, must not be `None`") # noqa: E501 - self._x_prefix = x_prefix - - @property - def x_suffix(self): - """Get the x_suffix of this HeatmapViewProperties. - - :return: The x_suffix of this HeatmapViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_suffix - - @x_suffix.setter - def x_suffix(self, x_suffix): - """Set the x_suffix of this HeatmapViewProperties. - - :param x_suffix: The x_suffix of this HeatmapViewProperties. - :type: str - """ # noqa: E501 - if x_suffix is None: - raise ValueError("Invalid value for `x_suffix`, must not be `None`") # noqa: E501 - self._x_suffix = x_suffix - - @property - def y_prefix(self): - """Get the y_prefix of this HeatmapViewProperties. - - :return: The y_prefix of this HeatmapViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_prefix - - @y_prefix.setter - def y_prefix(self, y_prefix): - """Set the y_prefix of this HeatmapViewProperties. - - :param y_prefix: The y_prefix of this HeatmapViewProperties. - :type: str - """ # noqa: E501 - if y_prefix is None: - raise ValueError("Invalid value for `y_prefix`, must not be `None`") # noqa: E501 - self._y_prefix = y_prefix - - @property - def y_suffix(self): - """Get the y_suffix of this HeatmapViewProperties. - - :return: The y_suffix of this HeatmapViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_suffix - - @y_suffix.setter - def y_suffix(self, y_suffix): - """Set the y_suffix of this HeatmapViewProperties. - - :param y_suffix: The y_suffix of this HeatmapViewProperties. - :type: str - """ # noqa: E501 - if y_suffix is None: - raise ValueError("Invalid value for `y_suffix`, must not be `None`") # noqa: E501 - self._y_suffix = y_suffix - - @property - def bin_size(self): - """Get the bin_size of this HeatmapViewProperties. - - :return: The bin_size of this HeatmapViewProperties. - :rtype: float - """ # noqa: E501 - return self._bin_size - - @bin_size.setter - def bin_size(self, bin_size): - """Set the bin_size of this HeatmapViewProperties. - - :param bin_size: The bin_size of this HeatmapViewProperties. - :type: float - """ # noqa: E501 - if bin_size is None: - raise ValueError("Invalid value for `bin_size`, must not be `None`") # noqa: E501 - self._bin_size = bin_size - - @property - def legend_colorize_rows(self): - """Get the legend_colorize_rows of this HeatmapViewProperties. - - :return: The legend_colorize_rows of this HeatmapViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_colorize_rows - - @legend_colorize_rows.setter - def legend_colorize_rows(self, legend_colorize_rows): - """Set the legend_colorize_rows of this HeatmapViewProperties. - - :param legend_colorize_rows: The legend_colorize_rows of this HeatmapViewProperties. - :type: bool - """ # noqa: E501 - self._legend_colorize_rows = legend_colorize_rows - - @property - def legend_hide(self): - """Get the legend_hide of this HeatmapViewProperties. - - :return: The legend_hide of this HeatmapViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_hide - - @legend_hide.setter - def legend_hide(self, legend_hide): - """Set the legend_hide of this HeatmapViewProperties. - - :param legend_hide: The legend_hide of this HeatmapViewProperties. - :type: bool - """ # noqa: E501 - self._legend_hide = legend_hide - - @property - def legend_opacity(self): - """Get the legend_opacity of this HeatmapViewProperties. - - :return: The legend_opacity of this HeatmapViewProperties. - :rtype: float - """ # noqa: E501 - return self._legend_opacity - - @legend_opacity.setter - def legend_opacity(self, legend_opacity): - """Set the legend_opacity of this HeatmapViewProperties. - - :param legend_opacity: The legend_opacity of this HeatmapViewProperties. - :type: float - """ # noqa: E501 - self._legend_opacity = legend_opacity - - @property - def legend_orientation_threshold(self): - """Get the legend_orientation_threshold of this HeatmapViewProperties. - - :return: The legend_orientation_threshold of this HeatmapViewProperties. - :rtype: int - """ # noqa: E501 - return self._legend_orientation_threshold - - @legend_orientation_threshold.setter - def legend_orientation_threshold(self, legend_orientation_threshold): - """Set the legend_orientation_threshold of this HeatmapViewProperties. - - :param legend_orientation_threshold: The legend_orientation_threshold of this HeatmapViewProperties. - :type: int - """ # noqa: E501 - self._legend_orientation_threshold = legend_orientation_threshold - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, HeatmapViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/histogram_view_properties.py b/frogpilot/third_party/influxdb_client/domain/histogram_view_properties.py deleted file mode 100644 index 750574306..000000000 --- a/frogpilot/third_party/influxdb_client/domain/histogram_view_properties.py +++ /dev/null @@ -1,476 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.view_properties import ViewProperties - - -class HistogramViewProperties(ViewProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'queries': 'list[DashboardQuery]', - 'colors': 'list[DashboardColor]', - 'shape': 'str', - 'note': 'str', - 'show_note_when_empty': 'bool', - 'x_column': 'str', - 'fill_columns': 'list[str]', - 'x_domain': 'list[float]', - 'x_axis_label': 'str', - 'position': 'str', - 'bin_count': 'int', - 'legend_colorize_rows': 'bool', - 'legend_hide': 'bool', - 'legend_opacity': 'float', - 'legend_orientation_threshold': 'int' - } - - attribute_map = { - 'type': 'type', - 'queries': 'queries', - 'colors': 'colors', - 'shape': 'shape', - 'note': 'note', - 'show_note_when_empty': 'showNoteWhenEmpty', - 'x_column': 'xColumn', - 'fill_columns': 'fillColumns', - 'x_domain': 'xDomain', - 'x_axis_label': 'xAxisLabel', - 'position': 'position', - 'bin_count': 'binCount', - 'legend_colorize_rows': 'legendColorizeRows', - 'legend_hide': 'legendHide', - 'legend_opacity': 'legendOpacity', - 'legend_orientation_threshold': 'legendOrientationThreshold' - } - - def __init__(self, type=None, queries=None, colors=None, shape=None, note=None, show_note_when_empty=None, x_column=None, fill_columns=None, x_domain=None, x_axis_label=None, position=None, bin_count=None, legend_colorize_rows=None, legend_hide=None, legend_opacity=None, legend_orientation_threshold=None): # noqa: E501,D401,D403 - """HistogramViewProperties - a model defined in OpenAPI.""" # noqa: E501 - ViewProperties.__init__(self) # noqa: E501 - - self._type = None - self._queries = None - self._colors = None - self._shape = None - self._note = None - self._show_note_when_empty = None - self._x_column = None - self._fill_columns = None - self._x_domain = None - self._x_axis_label = None - self._position = None - self._bin_count = None - self._legend_colorize_rows = None - self._legend_hide = None - self._legend_opacity = None - self._legend_orientation_threshold = None - self.discriminator = None - - self.type = type - self.queries = queries - self.colors = colors - self.shape = shape - self.note = note - self.show_note_when_empty = show_note_when_empty - self.x_column = x_column - self.fill_columns = fill_columns - self.x_domain = x_domain - self.x_axis_label = x_axis_label - self.position = position - self.bin_count = bin_count - if legend_colorize_rows is not None: - self.legend_colorize_rows = legend_colorize_rows - if legend_hide is not None: - self.legend_hide = legend_hide - if legend_opacity is not None: - self.legend_opacity = legend_opacity - if legend_orientation_threshold is not None: - self.legend_orientation_threshold = legend_orientation_threshold - - @property - def type(self): - """Get the type of this HistogramViewProperties. - - :return: The type of this HistogramViewProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this HistogramViewProperties. - - :param type: The type of this HistogramViewProperties. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def queries(self): - """Get the queries of this HistogramViewProperties. - - :return: The queries of this HistogramViewProperties. - :rtype: list[DashboardQuery] - """ # noqa: E501 - return self._queries - - @queries.setter - def queries(self, queries): - """Set the queries of this HistogramViewProperties. - - :param queries: The queries of this HistogramViewProperties. - :type: list[DashboardQuery] - """ # noqa: E501 - if queries is None: - raise ValueError("Invalid value for `queries`, must not be `None`") # noqa: E501 - self._queries = queries - - @property - def colors(self): - """Get the colors of this HistogramViewProperties. - - Colors define color encoding of data into a visualization - - :return: The colors of this HistogramViewProperties. - :rtype: list[DashboardColor] - """ # noqa: E501 - return self._colors - - @colors.setter - def colors(self, colors): - """Set the colors of this HistogramViewProperties. - - Colors define color encoding of data into a visualization - - :param colors: The colors of this HistogramViewProperties. - :type: list[DashboardColor] - """ # noqa: E501 - if colors is None: - raise ValueError("Invalid value for `colors`, must not be `None`") # noqa: E501 - self._colors = colors - - @property - def shape(self): - """Get the shape of this HistogramViewProperties. - - :return: The shape of this HistogramViewProperties. - :rtype: str - """ # noqa: E501 - return self._shape - - @shape.setter - def shape(self, shape): - """Set the shape of this HistogramViewProperties. - - :param shape: The shape of this HistogramViewProperties. - :type: str - """ # noqa: E501 - if shape is None: - raise ValueError("Invalid value for `shape`, must not be `None`") # noqa: E501 - self._shape = shape - - @property - def note(self): - """Get the note of this HistogramViewProperties. - - :return: The note of this HistogramViewProperties. - :rtype: str - """ # noqa: E501 - return self._note - - @note.setter - def note(self, note): - """Set the note of this HistogramViewProperties. - - :param note: The note of this HistogramViewProperties. - :type: str - """ # noqa: E501 - if note is None: - raise ValueError("Invalid value for `note`, must not be `None`") # noqa: E501 - self._note = note - - @property - def show_note_when_empty(self): - """Get the show_note_when_empty of this HistogramViewProperties. - - If true, will display note when empty - - :return: The show_note_when_empty of this HistogramViewProperties. - :rtype: bool - """ # noqa: E501 - return self._show_note_when_empty - - @show_note_when_empty.setter - def show_note_when_empty(self, show_note_when_empty): - """Set the show_note_when_empty of this HistogramViewProperties. - - If true, will display note when empty - - :param show_note_when_empty: The show_note_when_empty of this HistogramViewProperties. - :type: bool - """ # noqa: E501 - if show_note_when_empty is None: - raise ValueError("Invalid value for `show_note_when_empty`, must not be `None`") # noqa: E501 - self._show_note_when_empty = show_note_when_empty - - @property - def x_column(self): - """Get the x_column of this HistogramViewProperties. - - :return: The x_column of this HistogramViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_column - - @x_column.setter - def x_column(self, x_column): - """Set the x_column of this HistogramViewProperties. - - :param x_column: The x_column of this HistogramViewProperties. - :type: str - """ # noqa: E501 - if x_column is None: - raise ValueError("Invalid value for `x_column`, must not be `None`") # noqa: E501 - self._x_column = x_column - - @property - def fill_columns(self): - """Get the fill_columns of this HistogramViewProperties. - - :return: The fill_columns of this HistogramViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._fill_columns - - @fill_columns.setter - def fill_columns(self, fill_columns): - """Set the fill_columns of this HistogramViewProperties. - - :param fill_columns: The fill_columns of this HistogramViewProperties. - :type: list[str] - """ # noqa: E501 - if fill_columns is None: - raise ValueError("Invalid value for `fill_columns`, must not be `None`") # noqa: E501 - self._fill_columns = fill_columns - - @property - def x_domain(self): - """Get the x_domain of this HistogramViewProperties. - - :return: The x_domain of this HistogramViewProperties. - :rtype: list[float] - """ # noqa: E501 - return self._x_domain - - @x_domain.setter - def x_domain(self, x_domain): - """Set the x_domain of this HistogramViewProperties. - - :param x_domain: The x_domain of this HistogramViewProperties. - :type: list[float] - """ # noqa: E501 - if x_domain is None: - raise ValueError("Invalid value for `x_domain`, must not be `None`") # noqa: E501 - self._x_domain = x_domain - - @property - def x_axis_label(self): - """Get the x_axis_label of this HistogramViewProperties. - - :return: The x_axis_label of this HistogramViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_axis_label - - @x_axis_label.setter - def x_axis_label(self, x_axis_label): - """Set the x_axis_label of this HistogramViewProperties. - - :param x_axis_label: The x_axis_label of this HistogramViewProperties. - :type: str - """ # noqa: E501 - if x_axis_label is None: - raise ValueError("Invalid value for `x_axis_label`, must not be `None`") # noqa: E501 - self._x_axis_label = x_axis_label - - @property - def position(self): - """Get the position of this HistogramViewProperties. - - :return: The position of this HistogramViewProperties. - :rtype: str - """ # noqa: E501 - return self._position - - @position.setter - def position(self, position): - """Set the position of this HistogramViewProperties. - - :param position: The position of this HistogramViewProperties. - :type: str - """ # noqa: E501 - if position is None: - raise ValueError("Invalid value for `position`, must not be `None`") # noqa: E501 - self._position = position - - @property - def bin_count(self): - """Get the bin_count of this HistogramViewProperties. - - :return: The bin_count of this HistogramViewProperties. - :rtype: int - """ # noqa: E501 - return self._bin_count - - @bin_count.setter - def bin_count(self, bin_count): - """Set the bin_count of this HistogramViewProperties. - - :param bin_count: The bin_count of this HistogramViewProperties. - :type: int - """ # noqa: E501 - if bin_count is None: - raise ValueError("Invalid value for `bin_count`, must not be `None`") # noqa: E501 - self._bin_count = bin_count - - @property - def legend_colorize_rows(self): - """Get the legend_colorize_rows of this HistogramViewProperties. - - :return: The legend_colorize_rows of this HistogramViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_colorize_rows - - @legend_colorize_rows.setter - def legend_colorize_rows(self, legend_colorize_rows): - """Set the legend_colorize_rows of this HistogramViewProperties. - - :param legend_colorize_rows: The legend_colorize_rows of this HistogramViewProperties. - :type: bool - """ # noqa: E501 - self._legend_colorize_rows = legend_colorize_rows - - @property - def legend_hide(self): - """Get the legend_hide of this HistogramViewProperties. - - :return: The legend_hide of this HistogramViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_hide - - @legend_hide.setter - def legend_hide(self, legend_hide): - """Set the legend_hide of this HistogramViewProperties. - - :param legend_hide: The legend_hide of this HistogramViewProperties. - :type: bool - """ # noqa: E501 - self._legend_hide = legend_hide - - @property - def legend_opacity(self): - """Get the legend_opacity of this HistogramViewProperties. - - :return: The legend_opacity of this HistogramViewProperties. - :rtype: float - """ # noqa: E501 - return self._legend_opacity - - @legend_opacity.setter - def legend_opacity(self, legend_opacity): - """Set the legend_opacity of this HistogramViewProperties. - - :param legend_opacity: The legend_opacity of this HistogramViewProperties. - :type: float - """ # noqa: E501 - self._legend_opacity = legend_opacity - - @property - def legend_orientation_threshold(self): - """Get the legend_orientation_threshold of this HistogramViewProperties. - - :return: The legend_orientation_threshold of this HistogramViewProperties. - :rtype: int - """ # noqa: E501 - return self._legend_orientation_threshold - - @legend_orientation_threshold.setter - def legend_orientation_threshold(self, legend_orientation_threshold): - """Set the legend_orientation_threshold of this HistogramViewProperties. - - :param legend_orientation_threshold: The legend_orientation_threshold of this HistogramViewProperties. - :type: int - """ # noqa: E501 - self._legend_orientation_threshold = legend_orientation_threshold - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, HistogramViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/http_notification_endpoint.py b/frogpilot/third_party/influxdb_client/domain/http_notification_endpoint.py deleted file mode 100644 index d8a48851e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/http_notification_endpoint.py +++ /dev/null @@ -1,301 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.notification_endpoint_discriminator import NotificationEndpointDiscriminator - - -class HTTPNotificationEndpoint(NotificationEndpointDiscriminator): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'url': 'str', - 'username': 'str', - 'password': 'str', - 'token': 'str', - 'method': 'str', - 'auth_method': 'str', - 'content_template': 'str', - 'headers': 'dict(str, str)', - 'id': 'str', - 'org_id': 'str', - 'user_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'description': 'str', - 'name': 'str', - 'status': 'str', - 'labels': 'list[Label]', - 'links': 'NotificationEndpointBaseLinks', - 'type': 'NotificationEndpointType' - } - - attribute_map = { - 'url': 'url', - 'username': 'username', - 'password': 'password', - 'token': 'token', - 'method': 'method', - 'auth_method': 'authMethod', - 'content_template': 'contentTemplate', - 'headers': 'headers', - 'id': 'id', - 'org_id': 'orgID', - 'user_id': 'userID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'description': 'description', - 'name': 'name', - 'status': 'status', - 'labels': 'labels', - 'links': 'links', - 'type': 'type' - } - - def __init__(self, url=None, username=None, password=None, token=None, method=None, auth_method=None, content_template=None, headers=None, id=None, org_id=None, user_id=None, created_at=None, updated_at=None, description=None, name=None, status='active', labels=None, links=None, type="http"): # noqa: E501,D401,D403 - """HTTPNotificationEndpoint - a model defined in OpenAPI.""" # noqa: E501 - NotificationEndpointDiscriminator.__init__(self, id=id, org_id=org_id, user_id=user_id, created_at=created_at, updated_at=updated_at, description=description, name=name, status=status, labels=labels, links=links, type=type) # noqa: E501 - - self._url = None - self._username = None - self._password = None - self._token = None - self._method = None - self._auth_method = None - self._content_template = None - self._headers = None - self.discriminator = None - - self.url = url - if username is not None: - self.username = username - if password is not None: - self.password = password - if token is not None: - self.token = token - self.method = method - self.auth_method = auth_method - if content_template is not None: - self.content_template = content_template - if headers is not None: - self.headers = headers - - @property - def url(self): - """Get the url of this HTTPNotificationEndpoint. - - :return: The url of this HTTPNotificationEndpoint. - :rtype: str - """ # noqa: E501 - return self._url - - @url.setter - def url(self, url): - """Set the url of this HTTPNotificationEndpoint. - - :param url: The url of this HTTPNotificationEndpoint. - :type: str - """ # noqa: E501 - if url is None: - raise ValueError("Invalid value for `url`, must not be `None`") # noqa: E501 - self._url = url - - @property - def username(self): - """Get the username of this HTTPNotificationEndpoint. - - :return: The username of this HTTPNotificationEndpoint. - :rtype: str - """ # noqa: E501 - return self._username - - @username.setter - def username(self, username): - """Set the username of this HTTPNotificationEndpoint. - - :param username: The username of this HTTPNotificationEndpoint. - :type: str - """ # noqa: E501 - self._username = username - - @property - def password(self): - """Get the password of this HTTPNotificationEndpoint. - - :return: The password of this HTTPNotificationEndpoint. - :rtype: str - """ # noqa: E501 - return self._password - - @password.setter - def password(self, password): - """Set the password of this HTTPNotificationEndpoint. - - :param password: The password of this HTTPNotificationEndpoint. - :type: str - """ # noqa: E501 - self._password = password - - @property - def token(self): - """Get the token of this HTTPNotificationEndpoint. - - :return: The token of this HTTPNotificationEndpoint. - :rtype: str - """ # noqa: E501 - return self._token - - @token.setter - def token(self, token): - """Set the token of this HTTPNotificationEndpoint. - - :param token: The token of this HTTPNotificationEndpoint. - :type: str - """ # noqa: E501 - self._token = token - - @property - def method(self): - """Get the method of this HTTPNotificationEndpoint. - - :return: The method of this HTTPNotificationEndpoint. - :rtype: str - """ # noqa: E501 - return self._method - - @method.setter - def method(self, method): - """Set the method of this HTTPNotificationEndpoint. - - :param method: The method of this HTTPNotificationEndpoint. - :type: str - """ # noqa: E501 - if method is None: - raise ValueError("Invalid value for `method`, must not be `None`") # noqa: E501 - self._method = method - - @property - def auth_method(self): - """Get the auth_method of this HTTPNotificationEndpoint. - - :return: The auth_method of this HTTPNotificationEndpoint. - :rtype: str - """ # noqa: E501 - return self._auth_method - - @auth_method.setter - def auth_method(self, auth_method): - """Set the auth_method of this HTTPNotificationEndpoint. - - :param auth_method: The auth_method of this HTTPNotificationEndpoint. - :type: str - """ # noqa: E501 - if auth_method is None: - raise ValueError("Invalid value for `auth_method`, must not be `None`") # noqa: E501 - self._auth_method = auth_method - - @property - def content_template(self): - """Get the content_template of this HTTPNotificationEndpoint. - - :return: The content_template of this HTTPNotificationEndpoint. - :rtype: str - """ # noqa: E501 - return self._content_template - - @content_template.setter - def content_template(self, content_template): - """Set the content_template of this HTTPNotificationEndpoint. - - :param content_template: The content_template of this HTTPNotificationEndpoint. - :type: str - """ # noqa: E501 - self._content_template = content_template - - @property - def headers(self): - """Get the headers of this HTTPNotificationEndpoint. - - Customized headers. - - :return: The headers of this HTTPNotificationEndpoint. - :rtype: dict(str, str) - """ # noqa: E501 - return self._headers - - @headers.setter - def headers(self, headers): - """Set the headers of this HTTPNotificationEndpoint. - - Customized headers. - - :param headers: The headers of this HTTPNotificationEndpoint. - :type: dict(str, str) - """ # noqa: E501 - self._headers = headers - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, HTTPNotificationEndpoint): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/http_notification_rule.py b/frogpilot/third_party/influxdb_client/domain/http_notification_rule.py deleted file mode 100644 index 050b3fcc5..000000000 --- a/frogpilot/third_party/influxdb_client/domain/http_notification_rule.py +++ /dev/null @@ -1,136 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.http_notification_rule_base import HTTPNotificationRuleBase - - -class HTTPNotificationRule(HTTPNotificationRuleBase): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'url': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'id': 'str', - 'endpoint_id': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'status': 'TaskStatusType', - 'name': 'str', - 'sleep_until': 'str', - 'every': 'str', - 'offset': 'str', - 'runbook_link': 'str', - 'limit_every': 'int', - 'limit': 'int', - 'tag_rules': 'list[TagRule]', - 'description': 'str', - 'status_rules': 'list[StatusRule]', - 'labels': 'list[Label]', - 'links': 'NotificationRuleBaseLinks' - } - - attribute_map = { - 'type': 'type', - 'url': 'url', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'id': 'id', - 'endpoint_id': 'endpointID', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'status': 'status', - 'name': 'name', - 'sleep_until': 'sleepUntil', - 'every': 'every', - 'offset': 'offset', - 'runbook_link': 'runbookLink', - 'limit_every': 'limitEvery', - 'limit': 'limit', - 'tag_rules': 'tagRules', - 'description': 'description', - 'status_rules': 'statusRules', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, type="http", url=None, latest_completed=None, last_run_status=None, last_run_error=None, id=None, endpoint_id=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, status=None, name=None, sleep_until=None, every=None, offset=None, runbook_link=None, limit_every=None, limit=None, tag_rules=None, description=None, status_rules=None, labels=None, links=None): # noqa: E501,D401,D403 - """HTTPNotificationRule - a model defined in OpenAPI.""" # noqa: E501 - HTTPNotificationRuleBase.__init__(self, type=type, url=url, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, id=id, endpoint_id=endpoint_id, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, status=status, name=name, sleep_until=sleep_until, every=every, offset=offset, runbook_link=runbook_link, limit_every=limit_every, limit=limit, tag_rules=tag_rules, description=description, status_rules=status_rules, labels=labels, links=links) # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, HTTPNotificationRule): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/http_notification_rule_base.py b/frogpilot/third_party/influxdb_client/domain/http_notification_rule_base.py deleted file mode 100644 index 521f9084d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/http_notification_rule_base.py +++ /dev/null @@ -1,181 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.notification_rule_discriminator import NotificationRuleDiscriminator - - -class HTTPNotificationRuleBase(NotificationRuleDiscriminator): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'url': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'id': 'str', - 'endpoint_id': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'status': 'TaskStatusType', - 'name': 'str', - 'sleep_until': 'str', - 'every': 'str', - 'offset': 'str', - 'runbook_link': 'str', - 'limit_every': 'int', - 'limit': 'int', - 'tag_rules': 'list[TagRule]', - 'description': 'str', - 'status_rules': 'list[StatusRule]', - 'labels': 'list[Label]', - 'links': 'NotificationRuleBaseLinks' - } - - attribute_map = { - 'type': 'type', - 'url': 'url', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'id': 'id', - 'endpoint_id': 'endpointID', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'status': 'status', - 'name': 'name', - 'sleep_until': 'sleepUntil', - 'every': 'every', - 'offset': 'offset', - 'runbook_link': 'runbookLink', - 'limit_every': 'limitEvery', - 'limit': 'limit', - 'tag_rules': 'tagRules', - 'description': 'description', - 'status_rules': 'statusRules', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, type=None, url=None, latest_completed=None, last_run_status=None, last_run_error=None, id=None, endpoint_id=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, status=None, name=None, sleep_until=None, every=None, offset=None, runbook_link=None, limit_every=None, limit=None, tag_rules=None, description=None, status_rules=None, labels=None, links=None): # noqa: E501,D401,D403 - """HTTPNotificationRuleBase - a model defined in OpenAPI.""" # noqa: E501 - NotificationRuleDiscriminator.__init__(self, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, id=id, endpoint_id=endpoint_id, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, status=status, name=name, sleep_until=sleep_until, every=every, offset=offset, runbook_link=runbook_link, limit_every=limit_every, limit=limit, tag_rules=tag_rules, description=description, status_rules=status_rules, labels=labels, links=links) # noqa: E501 - - self._type = None - self._url = None - self.discriminator = None - - self.type = type - if url is not None: - self.url = url - - @property - def type(self): - """Get the type of this HTTPNotificationRuleBase. - - :return: The type of this HTTPNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this HTTPNotificationRuleBase. - - :param type: The type of this HTTPNotificationRuleBase. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def url(self): - """Get the url of this HTTPNotificationRuleBase. - - :return: The url of this HTTPNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._url - - @url.setter - def url(self, url): - """Set the url of this HTTPNotificationRuleBase. - - :param url: The url of this HTTPNotificationRuleBase. - :type: str - """ # noqa: E501 - self._url = url - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, HTTPNotificationRuleBase): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/identifier.py b/frogpilot/third_party/influxdb_client/domain/identifier.py deleted file mode 100644 index aa9a3fb29..000000000 --- a/frogpilot/third_party/influxdb_client/domain/identifier.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.property_key import PropertyKey - - -class Identifier(PropertyKey): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'name': 'str' - } - - attribute_map = { - 'type': 'type', - 'name': 'name' - } - - def __init__(self, type=None, name=None): # noqa: E501,D401,D403 - """Identifier - a model defined in OpenAPI.""" # noqa: E501 - PropertyKey.__init__(self) # noqa: E501 - - self._type = None - self._name = None - self.discriminator = None - - if type is not None: - self.type = type - if name is not None: - self.name = name - - @property - def type(self): - """Get the type of this Identifier. - - Type of AST node - - :return: The type of this Identifier. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this Identifier. - - Type of AST node - - :param type: The type of this Identifier. - :type: str - """ # noqa: E501 - self._type = type - - @property - def name(self): - """Get the name of this Identifier. - - :return: The name of this Identifier. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this Identifier. - - :param name: The name of this Identifier. - :type: str - """ # noqa: E501 - self._name = name - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Identifier): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/import_declaration.py b/frogpilot/third_party/influxdb_client/domain/import_declaration.py deleted file mode 100644 index 435380cfa..000000000 --- a/frogpilot/third_party/influxdb_client/domain/import_declaration.py +++ /dev/null @@ -1,157 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ImportDeclaration(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - '_as': 'Identifier', - 'path': 'StringLiteral' - } - - attribute_map = { - 'type': 'type', - '_as': 'as', - 'path': 'path' - } - - def __init__(self, type=None, _as=None, path=None): # noqa: E501,D401,D403 - """ImportDeclaration - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self.__as = None - self._path = None - self.discriminator = None - - if type is not None: - self.type = type - if _as is not None: - self._as = _as - if path is not None: - self.path = path - - @property - def type(self): - """Get the type of this ImportDeclaration. - - Type of AST node - - :return: The type of this ImportDeclaration. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this ImportDeclaration. - - Type of AST node - - :param type: The type of this ImportDeclaration. - :type: str - """ # noqa: E501 - self._type = type - - @property - def _as(self): - """Get the _as of this ImportDeclaration. - - :return: The _as of this ImportDeclaration. - :rtype: Identifier - """ # noqa: E501 - return self.__as - - @_as.setter - def _as(self, _as): - """Set the _as of this ImportDeclaration. - - :param _as: The _as of this ImportDeclaration. - :type: Identifier - """ # noqa: E501 - self.__as = _as - - @property - def path(self): - """Get the path of this ImportDeclaration. - - :return: The path of this ImportDeclaration. - :rtype: StringLiteral - """ # noqa: E501 - return self._path - - @path.setter - def path(self, path): - """Set the path of this ImportDeclaration. - - :param path: The path of this ImportDeclaration. - :type: StringLiteral - """ # noqa: E501 - self._path = path - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ImportDeclaration): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/index_expression.py b/frogpilot/third_party/influxdb_client/domain/index_expression.py deleted file mode 100644 index 4aedd7317..000000000 --- a/frogpilot/third_party/influxdb_client/domain/index_expression.py +++ /dev/null @@ -1,161 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class IndexExpression(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'array': 'Expression', - 'index': 'Expression' - } - - attribute_map = { - 'type': 'type', - 'array': 'array', - 'index': 'index' - } - - def __init__(self, type=None, array=None, index=None): # noqa: E501,D401,D403 - """IndexExpression - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._array = None - self._index = None - self.discriminator = None - - if type is not None: - self.type = type - if array is not None: - self.array = array - if index is not None: - self.index = index - - @property - def type(self): - """Get the type of this IndexExpression. - - Type of AST node - - :return: The type of this IndexExpression. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this IndexExpression. - - Type of AST node - - :param type: The type of this IndexExpression. - :type: str - """ # noqa: E501 - self._type = type - - @property - def array(self): - """Get the array of this IndexExpression. - - :return: The array of this IndexExpression. - :rtype: Expression - """ # noqa: E501 - return self._array - - @array.setter - def array(self, array): - """Set the array of this IndexExpression. - - :param array: The array of this IndexExpression. - :type: Expression - """ # noqa: E501 - self._array = array - - @property - def index(self): - """Get the index of this IndexExpression. - - :return: The index of this IndexExpression. - :rtype: Expression - """ # noqa: E501 - return self._index - - @index.setter - def index(self, index): - """Set the index of this IndexExpression. - - :param index: The index of this IndexExpression. - :type: Expression - """ # noqa: E501 - self._index = index - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, IndexExpression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/integer_literal.py b/frogpilot/third_party/influxdb_client/domain/integer_literal.py deleted file mode 100644 index dcedf78d3..000000000 --- a/frogpilot/third_party/influxdb_client/domain/integer_literal.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class IntegerLiteral(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'value': 'str' - } - - attribute_map = { - 'type': 'type', - 'value': 'value' - } - - def __init__(self, type=None, value=None): # noqa: E501,D401,D403 - """IntegerLiteral - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._value = None - self.discriminator = None - - if type is not None: - self.type = type - if value is not None: - self.value = value - - @property - def type(self): - """Get the type of this IntegerLiteral. - - Type of AST node - - :return: The type of this IntegerLiteral. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this IntegerLiteral. - - Type of AST node - - :param type: The type of this IntegerLiteral. - :type: str - """ # noqa: E501 - self._type = type - - @property - def value(self): - """Get the value of this IntegerLiteral. - - :return: The value of this IntegerLiteral. - :rtype: str - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this IntegerLiteral. - - :param value: The value of this IntegerLiteral. - :type: str - """ # noqa: E501 - self._value = value - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, IntegerLiteral): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/is_onboarding.py b/frogpilot/third_party/influxdb_client/domain/is_onboarding.py deleted file mode 100644 index 0e14abdb8..000000000 --- a/frogpilot/third_party/influxdb_client/domain/is_onboarding.py +++ /dev/null @@ -1,111 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class IsOnboarding(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'allowed': 'bool' - } - - attribute_map = { - 'allowed': 'allowed' - } - - def __init__(self, allowed=None): # noqa: E501,D401,D403 - """IsOnboarding - a model defined in OpenAPI.""" # noqa: E501 - self._allowed = None - self.discriminator = None - - if allowed is not None: - self.allowed = allowed - - @property - def allowed(self): - """Get the allowed of this IsOnboarding. - - If `true`, the InfluxDB instance hasn't had initial setup; `false` otherwise. - - :return: The allowed of this IsOnboarding. - :rtype: bool - """ # noqa: E501 - return self._allowed - - @allowed.setter - def allowed(self, allowed): - """Set the allowed of this IsOnboarding. - - If `true`, the InfluxDB instance hasn't had initial setup; `false` otherwise. - - :param allowed: The allowed of this IsOnboarding. - :type: bool - """ # noqa: E501 - self._allowed = allowed - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, IsOnboarding): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/label.py b/frogpilot/third_party/influxdb_client/domain/label.py deleted file mode 100644 index cceaab955..000000000 --- a/frogpilot/third_party/influxdb_client/domain/label.py +++ /dev/null @@ -1,180 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Label(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'org_id': 'str', - 'name': 'str', - 'properties': 'dict(str, str)' - } - - attribute_map = { - 'id': 'id', - 'org_id': 'orgID', - 'name': 'name', - 'properties': 'properties' - } - - def __init__(self, id=None, org_id=None, name=None, properties=None): # noqa: E501,D401,D403 - """Label - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._org_id = None - self._name = None - self._properties = None - self.discriminator = None - - if id is not None: - self.id = id - if org_id is not None: - self.org_id = org_id - if name is not None: - self.name = name - if properties is not None: - self.properties = properties - - @property - def id(self): - """Get the id of this Label. - - :return: The id of this Label. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Label. - - :param id: The id of this Label. - :type: str - """ # noqa: E501 - self._id = id - - @property - def org_id(self): - """Get the org_id of this Label. - - :return: The org_id of this Label. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this Label. - - :param org_id: The org_id of this Label. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def name(self): - """Get the name of this Label. - - :return: The name of this Label. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this Label. - - :param name: The name of this Label. - :type: str - """ # noqa: E501 - self._name = name - - @property - def properties(self): - """Get the properties of this Label. - - Key-value pairs associated with this label. To remove a property, send an update with an empty value (`""`) for the key. - - :return: The properties of this Label. - :rtype: dict(str, str) - """ # noqa: E501 - return self._properties - - @properties.setter - def properties(self, properties): - """Set the properties of this Label. - - Key-value pairs associated with this label. To remove a property, send an update with an empty value (`""`) for the key. - - :param properties: The properties of this Label. - :type: dict(str, str) - """ # noqa: E501 - self._properties = properties - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Label): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/label_create_request.py b/frogpilot/third_party/influxdb_client/domain/label_create_request.py deleted file mode 100644 index 73259eea6..000000000 --- a/frogpilot/third_party/influxdb_client/domain/label_create_request.py +++ /dev/null @@ -1,159 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class LabelCreateRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'org_id': 'str', - 'name': 'str', - 'properties': 'dict(str, str)' - } - - attribute_map = { - 'org_id': 'orgID', - 'name': 'name', - 'properties': 'properties' - } - - def __init__(self, org_id=None, name=None, properties=None): # noqa: E501,D401,D403 - """LabelCreateRequest - a model defined in OpenAPI.""" # noqa: E501 - self._org_id = None - self._name = None - self._properties = None - self.discriminator = None - - self.org_id = org_id - self.name = name - if properties is not None: - self.properties = properties - - @property - def org_id(self): - """Get the org_id of this LabelCreateRequest. - - :return: The org_id of this LabelCreateRequest. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this LabelCreateRequest. - - :param org_id: The org_id of this LabelCreateRequest. - :type: str - """ # noqa: E501 - if org_id is None: - raise ValueError("Invalid value for `org_id`, must not be `None`") # noqa: E501 - self._org_id = org_id - - @property - def name(self): - """Get the name of this LabelCreateRequest. - - :return: The name of this LabelCreateRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this LabelCreateRequest. - - :param name: The name of this LabelCreateRequest. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def properties(self): - """Get the properties of this LabelCreateRequest. - - Key-value pairs associated with this label. To remove a property, send an update with an empty value (`""`) for the key. - - :return: The properties of this LabelCreateRequest. - :rtype: dict(str, str) - """ # noqa: E501 - return self._properties - - @properties.setter - def properties(self, properties): - """Set the properties of this LabelCreateRequest. - - Key-value pairs associated with this label. To remove a property, send an update with an empty value (`""`) for the key. - - :param properties: The properties of this LabelCreateRequest. - :type: dict(str, str) - """ # noqa: E501 - self._properties = properties - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, LabelCreateRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/label_mapping.py b/frogpilot/third_party/influxdb_client/domain/label_mapping.py deleted file mode 100644 index 909d1b38a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/label_mapping.py +++ /dev/null @@ -1,112 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class LabelMapping(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'label_id': 'str' - } - - attribute_map = { - 'label_id': 'labelID' - } - - def __init__(self, label_id=None): # noqa: E501,D401,D403 - """LabelMapping - a model defined in OpenAPI.""" # noqa: E501 - self._label_id = None - self.discriminator = None - - self.label_id = label_id - - @property - def label_id(self): - """Get the label_id of this LabelMapping. - - A label ID. Specifies the label to attach. - - :return: The label_id of this LabelMapping. - :rtype: str - """ # noqa: E501 - return self._label_id - - @label_id.setter - def label_id(self, label_id): - """Set the label_id of this LabelMapping. - - A label ID. Specifies the label to attach. - - :param label_id: The label_id of this LabelMapping. - :type: str - """ # noqa: E501 - if label_id is None: - raise ValueError("Invalid value for `label_id`, must not be `None`") # noqa: E501 - self._label_id = label_id - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, LabelMapping): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/label_response.py b/frogpilot/third_party/influxdb_client/domain/label_response.py deleted file mode 100644 index 8eed84067..000000000 --- a/frogpilot/third_party/influxdb_client/domain/label_response.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class LabelResponse(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'label': 'Label', - 'links': 'Links' - } - - attribute_map = { - 'label': 'label', - 'links': 'links' - } - - def __init__(self, label=None, links=None): # noqa: E501,D401,D403 - """LabelResponse - a model defined in OpenAPI.""" # noqa: E501 - self._label = None - self._links = None - self.discriminator = None - - if label is not None: - self.label = label - if links is not None: - self.links = links - - @property - def label(self): - """Get the label of this LabelResponse. - - :return: The label of this LabelResponse. - :rtype: Label - """ # noqa: E501 - return self._label - - @label.setter - def label(self, label): - """Set the label of this LabelResponse. - - :param label: The label of this LabelResponse. - :type: Label - """ # noqa: E501 - self._label = label - - @property - def links(self): - """Get the links of this LabelResponse. - - :return: The links of this LabelResponse. - :rtype: Links - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this LabelResponse. - - :param links: The links of this LabelResponse. - :type: Links - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, LabelResponse): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/label_update.py b/frogpilot/third_party/influxdb_client/domain/label_update.py deleted file mode 100644 index c1a7c7ee7..000000000 --- a/frogpilot/third_party/influxdb_client/domain/label_update.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class LabelUpdate(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'properties': 'dict(str, str)' - } - - attribute_map = { - 'name': 'name', - 'properties': 'properties' - } - - def __init__(self, name=None, properties=None): # noqa: E501,D401,D403 - """LabelUpdate - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._properties = None - self.discriminator = None - - if name is not None: - self.name = name - if properties is not None: - self.properties = properties - - @property - def name(self): - """Get the name of this LabelUpdate. - - :return: The name of this LabelUpdate. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this LabelUpdate. - - :param name: The name of this LabelUpdate. - :type: str - """ # noqa: E501 - self._name = name - - @property - def properties(self): - """Get the properties of this LabelUpdate. - - :return: The properties of this LabelUpdate. - :rtype: dict(str, str) - """ # noqa: E501 - return self._properties - - @properties.setter - def properties(self, properties): - """Set the properties of this LabelUpdate. - - :param properties: The properties of this LabelUpdate. - :type: dict(str, str) - """ # noqa: E501 - self._properties = properties - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, LabelUpdate): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/labels_response.py b/frogpilot/third_party/influxdb_client/domain/labels_response.py deleted file mode 100644 index fee2fdc9c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/labels_response.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class LabelsResponse(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'labels': 'list[Label]', - 'links': 'Links' - } - - attribute_map = { - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, labels=None, links=None): # noqa: E501,D401,D403 - """LabelsResponse - a model defined in OpenAPI.""" # noqa: E501 - self._labels = None - self._links = None - self.discriminator = None - - if labels is not None: - self.labels = labels - if links is not None: - self.links = links - - @property - def labels(self): - """Get the labels of this LabelsResponse. - - :return: The labels of this LabelsResponse. - :rtype: list[Label] - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this LabelsResponse. - - :param labels: The labels of this LabelsResponse. - :type: list[Label] - """ # noqa: E501 - self._labels = labels - - @property - def links(self): - """Get the links of this LabelsResponse. - - :return: The links of this LabelsResponse. - :rtype: Links - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this LabelsResponse. - - :param links: The links of this LabelsResponse. - :type: Links - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, LabelsResponse): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/language_request.py b/frogpilot/third_party/influxdb_client/domain/language_request.py deleted file mode 100644 index 083e70a22..000000000 --- a/frogpilot/third_party/influxdb_client/domain/language_request.py +++ /dev/null @@ -1,112 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class LanguageRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'query': 'str' - } - - attribute_map = { - 'query': 'query' - } - - def __init__(self, query=None): # noqa: E501,D401,D403 - """LanguageRequest - a model defined in OpenAPI.""" # noqa: E501 - self._query = None - self.discriminator = None - - self.query = query - - @property - def query(self): - """Get the query of this LanguageRequest. - - The Flux query script to be analyzed. - - :return: The query of this LanguageRequest. - :rtype: str - """ # noqa: E501 - return self._query - - @query.setter - def query(self, query): - """Set the query of this LanguageRequest. - - The Flux query script to be analyzed. - - :param query: The query of this LanguageRequest. - :type: str - """ # noqa: E501 - if query is None: - raise ValueError("Invalid value for `query`, must not be `None`") # noqa: E501 - self._query = query - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, LanguageRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/legacy_authorization_post_request.py b/frogpilot/third_party/influxdb_client/domain/legacy_authorization_post_request.py deleted file mode 100644 index 2976671b4..000000000 --- a/frogpilot/third_party/influxdb_client/domain/legacy_authorization_post_request.py +++ /dev/null @@ -1,200 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.authorization_update_request import AuthorizationUpdateRequest - - -class LegacyAuthorizationPostRequest(AuthorizationUpdateRequest): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'org_id': 'str', - 'user_id': 'str', - 'token': 'str', - 'permissions': 'list[Permission]', - 'status': 'str', - 'description': 'str' - } - - attribute_map = { - 'org_id': 'orgID', - 'user_id': 'userID', - 'token': 'token', - 'permissions': 'permissions', - 'status': 'status', - 'description': 'description' - } - - def __init__(self, org_id=None, user_id=None, token=None, permissions=None, status='active', description=None): # noqa: E501,D401,D403 - """LegacyAuthorizationPostRequest - a model defined in OpenAPI.""" # noqa: E501 - AuthorizationUpdateRequest.__init__(self, status=status, description=description) # noqa: E501 - - self._org_id = None - self._user_id = None - self._token = None - self._permissions = None - self.discriminator = None - - if org_id is not None: - self.org_id = org_id - if user_id is not None: - self.user_id = user_id - if token is not None: - self.token = token - if permissions is not None: - self.permissions = permissions - - @property - def org_id(self): - """Get the org_id of this LegacyAuthorizationPostRequest. - - ID of org that authorization is scoped to. - - :return: The org_id of this LegacyAuthorizationPostRequest. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this LegacyAuthorizationPostRequest. - - ID of org that authorization is scoped to. - - :param org_id: The org_id of this LegacyAuthorizationPostRequest. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def user_id(self): - """Get the user_id of this LegacyAuthorizationPostRequest. - - ID of user that authorization is scoped to. - - :return: The user_id of this LegacyAuthorizationPostRequest. - :rtype: str - """ # noqa: E501 - return self._user_id - - @user_id.setter - def user_id(self, user_id): - """Set the user_id of this LegacyAuthorizationPostRequest. - - ID of user that authorization is scoped to. - - :param user_id: The user_id of this LegacyAuthorizationPostRequest. - :type: str - """ # noqa: E501 - self._user_id = user_id - - @property - def token(self): - """Get the token of this LegacyAuthorizationPostRequest. - - Token (name) of the authorization - - :return: The token of this LegacyAuthorizationPostRequest. - :rtype: str - """ # noqa: E501 - return self._token - - @token.setter - def token(self, token): - """Set the token of this LegacyAuthorizationPostRequest. - - Token (name) of the authorization - - :param token: The token of this LegacyAuthorizationPostRequest. - :type: str - """ # noqa: E501 - self._token = token - - @property - def permissions(self): - """Get the permissions of this LegacyAuthorizationPostRequest. - - List of permissions for an auth. An auth must have at least one Permission. - - :return: The permissions of this LegacyAuthorizationPostRequest. - :rtype: list[Permission] - """ # noqa: E501 - return self._permissions - - @permissions.setter - def permissions(self, permissions): - """Set the permissions of this LegacyAuthorizationPostRequest. - - List of permissions for an auth. An auth must have at least one Permission. - - :param permissions: The permissions of this LegacyAuthorizationPostRequest. - :type: list[Permission] - """ # noqa: E501 - self._permissions = permissions - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, LegacyAuthorizationPostRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/lesser_threshold.py b/frogpilot/third_party/influxdb_client/domain/lesser_threshold.py deleted file mode 100644 index a75a19e27..000000000 --- a/frogpilot/third_party/influxdb_client/domain/lesser_threshold.py +++ /dev/null @@ -1,140 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.threshold_base import ThresholdBase - - -class LesserThreshold(ThresholdBase): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'value': 'float', - 'level': 'CheckStatusLevel', - 'all_values': 'bool' - } - - attribute_map = { - 'type': 'type', - 'value': 'value', - 'level': 'level', - 'all_values': 'allValues' - } - - def __init__(self, type="lesser", value=None, level=None, all_values=None): # noqa: E501,D401,D403 - """LesserThreshold - a model defined in OpenAPI.""" # noqa: E501 - ThresholdBase.__init__(self, level=level, all_values=all_values) # noqa: E501 - - self._type = None - self._value = None - self.discriminator = None - - self.type = type - self.value = value - - @property - def type(self): - """Get the type of this LesserThreshold. - - :return: The type of this LesserThreshold. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this LesserThreshold. - - :param type: The type of this LesserThreshold. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def value(self): - """Get the value of this LesserThreshold. - - :return: The value of this LesserThreshold. - :rtype: float - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this LesserThreshold. - - :param value: The value of this LesserThreshold. - :type: float - """ # noqa: E501 - if value is None: - raise ValueError("Invalid value for `value`, must not be `None`") # noqa: E501 - self._value = value - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, LesserThreshold): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/line_plus_single_stat_properties.py b/frogpilot/third_party/influxdb_client/domain/line_plus_single_stat_properties.py deleted file mode 100644 index 5196ba03f..000000000 --- a/frogpilot/third_party/influxdb_client/domain/line_plus_single_stat_properties.py +++ /dev/null @@ -1,797 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.view_properties import ViewProperties - - -class LinePlusSingleStatProperties(ViewProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'adaptive_zoom_hide': 'bool', - 'time_format': 'str', - 'type': 'str', - 'queries': 'list[DashboardQuery]', - 'colors': 'list[DashboardColor]', - 'shape': 'str', - 'note': 'str', - 'show_note_when_empty': 'bool', - 'axes': 'Axes', - 'static_legend': 'StaticLegend', - 'x_column': 'str', - 'generate_x_axis_ticks': 'list[str]', - 'x_total_ticks': 'int', - 'x_tick_start': 'float', - 'x_tick_step': 'float', - 'y_column': 'str', - 'generate_y_axis_ticks': 'list[str]', - 'y_total_ticks': 'int', - 'y_tick_start': 'float', - 'y_tick_step': 'float', - 'shade_below': 'bool', - 'hover_dimension': 'str', - 'position': 'str', - 'prefix': 'str', - 'suffix': 'str', - 'decimal_places': 'DecimalPlaces', - 'legend_colorize_rows': 'bool', - 'legend_hide': 'bool', - 'legend_opacity': 'float', - 'legend_orientation_threshold': 'int' - } - - attribute_map = { - 'adaptive_zoom_hide': 'adaptiveZoomHide', - 'time_format': 'timeFormat', - 'type': 'type', - 'queries': 'queries', - 'colors': 'colors', - 'shape': 'shape', - 'note': 'note', - 'show_note_when_empty': 'showNoteWhenEmpty', - 'axes': 'axes', - 'static_legend': 'staticLegend', - 'x_column': 'xColumn', - 'generate_x_axis_ticks': 'generateXAxisTicks', - 'x_total_ticks': 'xTotalTicks', - 'x_tick_start': 'xTickStart', - 'x_tick_step': 'xTickStep', - 'y_column': 'yColumn', - 'generate_y_axis_ticks': 'generateYAxisTicks', - 'y_total_ticks': 'yTotalTicks', - 'y_tick_start': 'yTickStart', - 'y_tick_step': 'yTickStep', - 'shade_below': 'shadeBelow', - 'hover_dimension': 'hoverDimension', - 'position': 'position', - 'prefix': 'prefix', - 'suffix': 'suffix', - 'decimal_places': 'decimalPlaces', - 'legend_colorize_rows': 'legendColorizeRows', - 'legend_hide': 'legendHide', - 'legend_opacity': 'legendOpacity', - 'legend_orientation_threshold': 'legendOrientationThreshold' - } - - def __init__(self, adaptive_zoom_hide=None, time_format=None, type=None, queries=None, colors=None, shape=None, note=None, show_note_when_empty=None, axes=None, static_legend=None, x_column=None, generate_x_axis_ticks=None, x_total_ticks=None, x_tick_start=None, x_tick_step=None, y_column=None, generate_y_axis_ticks=None, y_total_ticks=None, y_tick_start=None, y_tick_step=None, shade_below=None, hover_dimension=None, position=None, prefix=None, suffix=None, decimal_places=None, legend_colorize_rows=None, legend_hide=None, legend_opacity=None, legend_orientation_threshold=None): # noqa: E501,D401,D403 - """LinePlusSingleStatProperties - a model defined in OpenAPI.""" # noqa: E501 - ViewProperties.__init__(self) # noqa: E501 - - self._adaptive_zoom_hide = None - self._time_format = None - self._type = None - self._queries = None - self._colors = None - self._shape = None - self._note = None - self._show_note_when_empty = None - self._axes = None - self._static_legend = None - self._x_column = None - self._generate_x_axis_ticks = None - self._x_total_ticks = None - self._x_tick_start = None - self._x_tick_step = None - self._y_column = None - self._generate_y_axis_ticks = None - self._y_total_ticks = None - self._y_tick_start = None - self._y_tick_step = None - self._shade_below = None - self._hover_dimension = None - self._position = None - self._prefix = None - self._suffix = None - self._decimal_places = None - self._legend_colorize_rows = None - self._legend_hide = None - self._legend_opacity = None - self._legend_orientation_threshold = None - self.discriminator = None - - if adaptive_zoom_hide is not None: - self.adaptive_zoom_hide = adaptive_zoom_hide - if time_format is not None: - self.time_format = time_format - self.type = type - self.queries = queries - self.colors = colors - self.shape = shape - self.note = note - self.show_note_when_empty = show_note_when_empty - self.axes = axes - if static_legend is not None: - self.static_legend = static_legend - if x_column is not None: - self.x_column = x_column - if generate_x_axis_ticks is not None: - self.generate_x_axis_ticks = generate_x_axis_ticks - if x_total_ticks is not None: - self.x_total_ticks = x_total_ticks - if x_tick_start is not None: - self.x_tick_start = x_tick_start - if x_tick_step is not None: - self.x_tick_step = x_tick_step - if y_column is not None: - self.y_column = y_column - if generate_y_axis_ticks is not None: - self.generate_y_axis_ticks = generate_y_axis_ticks - if y_total_ticks is not None: - self.y_total_ticks = y_total_ticks - if y_tick_start is not None: - self.y_tick_start = y_tick_start - if y_tick_step is not None: - self.y_tick_step = y_tick_step - if shade_below is not None: - self.shade_below = shade_below - if hover_dimension is not None: - self.hover_dimension = hover_dimension - self.position = position - self.prefix = prefix - self.suffix = suffix - self.decimal_places = decimal_places - if legend_colorize_rows is not None: - self.legend_colorize_rows = legend_colorize_rows - if legend_hide is not None: - self.legend_hide = legend_hide - if legend_opacity is not None: - self.legend_opacity = legend_opacity - if legend_orientation_threshold is not None: - self.legend_orientation_threshold = legend_orientation_threshold - - @property - def adaptive_zoom_hide(self): - """Get the adaptive_zoom_hide of this LinePlusSingleStatProperties. - - :return: The adaptive_zoom_hide of this LinePlusSingleStatProperties. - :rtype: bool - """ # noqa: E501 - return self._adaptive_zoom_hide - - @adaptive_zoom_hide.setter - def adaptive_zoom_hide(self, adaptive_zoom_hide): - """Set the adaptive_zoom_hide of this LinePlusSingleStatProperties. - - :param adaptive_zoom_hide: The adaptive_zoom_hide of this LinePlusSingleStatProperties. - :type: bool - """ # noqa: E501 - self._adaptive_zoom_hide = adaptive_zoom_hide - - @property - def time_format(self): - """Get the time_format of this LinePlusSingleStatProperties. - - :return: The time_format of this LinePlusSingleStatProperties. - :rtype: str - """ # noqa: E501 - return self._time_format - - @time_format.setter - def time_format(self, time_format): - """Set the time_format of this LinePlusSingleStatProperties. - - :param time_format: The time_format of this LinePlusSingleStatProperties. - :type: str - """ # noqa: E501 - self._time_format = time_format - - @property - def type(self): - """Get the type of this LinePlusSingleStatProperties. - - :return: The type of this LinePlusSingleStatProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this LinePlusSingleStatProperties. - - :param type: The type of this LinePlusSingleStatProperties. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def queries(self): - """Get the queries of this LinePlusSingleStatProperties. - - :return: The queries of this LinePlusSingleStatProperties. - :rtype: list[DashboardQuery] - """ # noqa: E501 - return self._queries - - @queries.setter - def queries(self, queries): - """Set the queries of this LinePlusSingleStatProperties. - - :param queries: The queries of this LinePlusSingleStatProperties. - :type: list[DashboardQuery] - """ # noqa: E501 - if queries is None: - raise ValueError("Invalid value for `queries`, must not be `None`") # noqa: E501 - self._queries = queries - - @property - def colors(self): - """Get the colors of this LinePlusSingleStatProperties. - - Colors define color encoding of data into a visualization - - :return: The colors of this LinePlusSingleStatProperties. - :rtype: list[DashboardColor] - """ # noqa: E501 - return self._colors - - @colors.setter - def colors(self, colors): - """Set the colors of this LinePlusSingleStatProperties. - - Colors define color encoding of data into a visualization - - :param colors: The colors of this LinePlusSingleStatProperties. - :type: list[DashboardColor] - """ # noqa: E501 - if colors is None: - raise ValueError("Invalid value for `colors`, must not be `None`") # noqa: E501 - self._colors = colors - - @property - def shape(self): - """Get the shape of this LinePlusSingleStatProperties. - - :return: The shape of this LinePlusSingleStatProperties. - :rtype: str - """ # noqa: E501 - return self._shape - - @shape.setter - def shape(self, shape): - """Set the shape of this LinePlusSingleStatProperties. - - :param shape: The shape of this LinePlusSingleStatProperties. - :type: str - """ # noqa: E501 - if shape is None: - raise ValueError("Invalid value for `shape`, must not be `None`") # noqa: E501 - self._shape = shape - - @property - def note(self): - """Get the note of this LinePlusSingleStatProperties. - - :return: The note of this LinePlusSingleStatProperties. - :rtype: str - """ # noqa: E501 - return self._note - - @note.setter - def note(self, note): - """Set the note of this LinePlusSingleStatProperties. - - :param note: The note of this LinePlusSingleStatProperties. - :type: str - """ # noqa: E501 - if note is None: - raise ValueError("Invalid value for `note`, must not be `None`") # noqa: E501 - self._note = note - - @property - def show_note_when_empty(self): - """Get the show_note_when_empty of this LinePlusSingleStatProperties. - - If true, will display note when empty - - :return: The show_note_when_empty of this LinePlusSingleStatProperties. - :rtype: bool - """ # noqa: E501 - return self._show_note_when_empty - - @show_note_when_empty.setter - def show_note_when_empty(self, show_note_when_empty): - """Set the show_note_when_empty of this LinePlusSingleStatProperties. - - If true, will display note when empty - - :param show_note_when_empty: The show_note_when_empty of this LinePlusSingleStatProperties. - :type: bool - """ # noqa: E501 - if show_note_when_empty is None: - raise ValueError("Invalid value for `show_note_when_empty`, must not be `None`") # noqa: E501 - self._show_note_when_empty = show_note_when_empty - - @property - def axes(self): - """Get the axes of this LinePlusSingleStatProperties. - - :return: The axes of this LinePlusSingleStatProperties. - :rtype: Axes - """ # noqa: E501 - return self._axes - - @axes.setter - def axes(self, axes): - """Set the axes of this LinePlusSingleStatProperties. - - :param axes: The axes of this LinePlusSingleStatProperties. - :type: Axes - """ # noqa: E501 - if axes is None: - raise ValueError("Invalid value for `axes`, must not be `None`") # noqa: E501 - self._axes = axes - - @property - def static_legend(self): - """Get the static_legend of this LinePlusSingleStatProperties. - - :return: The static_legend of this LinePlusSingleStatProperties. - :rtype: StaticLegend - """ # noqa: E501 - return self._static_legend - - @static_legend.setter - def static_legend(self, static_legend): - """Set the static_legend of this LinePlusSingleStatProperties. - - :param static_legend: The static_legend of this LinePlusSingleStatProperties. - :type: StaticLegend - """ # noqa: E501 - self._static_legend = static_legend - - @property - def x_column(self): - """Get the x_column of this LinePlusSingleStatProperties. - - :return: The x_column of this LinePlusSingleStatProperties. - :rtype: str - """ # noqa: E501 - return self._x_column - - @x_column.setter - def x_column(self, x_column): - """Set the x_column of this LinePlusSingleStatProperties. - - :param x_column: The x_column of this LinePlusSingleStatProperties. - :type: str - """ # noqa: E501 - self._x_column = x_column - - @property - def generate_x_axis_ticks(self): - """Get the generate_x_axis_ticks of this LinePlusSingleStatProperties. - - :return: The generate_x_axis_ticks of this LinePlusSingleStatProperties. - :rtype: list[str] - """ # noqa: E501 - return self._generate_x_axis_ticks - - @generate_x_axis_ticks.setter - def generate_x_axis_ticks(self, generate_x_axis_ticks): - """Set the generate_x_axis_ticks of this LinePlusSingleStatProperties. - - :param generate_x_axis_ticks: The generate_x_axis_ticks of this LinePlusSingleStatProperties. - :type: list[str] - """ # noqa: E501 - self._generate_x_axis_ticks = generate_x_axis_ticks - - @property - def x_total_ticks(self): - """Get the x_total_ticks of this LinePlusSingleStatProperties. - - :return: The x_total_ticks of this LinePlusSingleStatProperties. - :rtype: int - """ # noqa: E501 - return self._x_total_ticks - - @x_total_ticks.setter - def x_total_ticks(self, x_total_ticks): - """Set the x_total_ticks of this LinePlusSingleStatProperties. - - :param x_total_ticks: The x_total_ticks of this LinePlusSingleStatProperties. - :type: int - """ # noqa: E501 - self._x_total_ticks = x_total_ticks - - @property - def x_tick_start(self): - """Get the x_tick_start of this LinePlusSingleStatProperties. - - :return: The x_tick_start of this LinePlusSingleStatProperties. - :rtype: float - """ # noqa: E501 - return self._x_tick_start - - @x_tick_start.setter - def x_tick_start(self, x_tick_start): - """Set the x_tick_start of this LinePlusSingleStatProperties. - - :param x_tick_start: The x_tick_start of this LinePlusSingleStatProperties. - :type: float - """ # noqa: E501 - self._x_tick_start = x_tick_start - - @property - def x_tick_step(self): - """Get the x_tick_step of this LinePlusSingleStatProperties. - - :return: The x_tick_step of this LinePlusSingleStatProperties. - :rtype: float - """ # noqa: E501 - return self._x_tick_step - - @x_tick_step.setter - def x_tick_step(self, x_tick_step): - """Set the x_tick_step of this LinePlusSingleStatProperties. - - :param x_tick_step: The x_tick_step of this LinePlusSingleStatProperties. - :type: float - """ # noqa: E501 - self._x_tick_step = x_tick_step - - @property - def y_column(self): - """Get the y_column of this LinePlusSingleStatProperties. - - :return: The y_column of this LinePlusSingleStatProperties. - :rtype: str - """ # noqa: E501 - return self._y_column - - @y_column.setter - def y_column(self, y_column): - """Set the y_column of this LinePlusSingleStatProperties. - - :param y_column: The y_column of this LinePlusSingleStatProperties. - :type: str - """ # noqa: E501 - self._y_column = y_column - - @property - def generate_y_axis_ticks(self): - """Get the generate_y_axis_ticks of this LinePlusSingleStatProperties. - - :return: The generate_y_axis_ticks of this LinePlusSingleStatProperties. - :rtype: list[str] - """ # noqa: E501 - return self._generate_y_axis_ticks - - @generate_y_axis_ticks.setter - def generate_y_axis_ticks(self, generate_y_axis_ticks): - """Set the generate_y_axis_ticks of this LinePlusSingleStatProperties. - - :param generate_y_axis_ticks: The generate_y_axis_ticks of this LinePlusSingleStatProperties. - :type: list[str] - """ # noqa: E501 - self._generate_y_axis_ticks = generate_y_axis_ticks - - @property - def y_total_ticks(self): - """Get the y_total_ticks of this LinePlusSingleStatProperties. - - :return: The y_total_ticks of this LinePlusSingleStatProperties. - :rtype: int - """ # noqa: E501 - return self._y_total_ticks - - @y_total_ticks.setter - def y_total_ticks(self, y_total_ticks): - """Set the y_total_ticks of this LinePlusSingleStatProperties. - - :param y_total_ticks: The y_total_ticks of this LinePlusSingleStatProperties. - :type: int - """ # noqa: E501 - self._y_total_ticks = y_total_ticks - - @property - def y_tick_start(self): - """Get the y_tick_start of this LinePlusSingleStatProperties. - - :return: The y_tick_start of this LinePlusSingleStatProperties. - :rtype: float - """ # noqa: E501 - return self._y_tick_start - - @y_tick_start.setter - def y_tick_start(self, y_tick_start): - """Set the y_tick_start of this LinePlusSingleStatProperties. - - :param y_tick_start: The y_tick_start of this LinePlusSingleStatProperties. - :type: float - """ # noqa: E501 - self._y_tick_start = y_tick_start - - @property - def y_tick_step(self): - """Get the y_tick_step of this LinePlusSingleStatProperties. - - :return: The y_tick_step of this LinePlusSingleStatProperties. - :rtype: float - """ # noqa: E501 - return self._y_tick_step - - @y_tick_step.setter - def y_tick_step(self, y_tick_step): - """Set the y_tick_step of this LinePlusSingleStatProperties. - - :param y_tick_step: The y_tick_step of this LinePlusSingleStatProperties. - :type: float - """ # noqa: E501 - self._y_tick_step = y_tick_step - - @property - def shade_below(self): - """Get the shade_below of this LinePlusSingleStatProperties. - - :return: The shade_below of this LinePlusSingleStatProperties. - :rtype: bool - """ # noqa: E501 - return self._shade_below - - @shade_below.setter - def shade_below(self, shade_below): - """Set the shade_below of this LinePlusSingleStatProperties. - - :param shade_below: The shade_below of this LinePlusSingleStatProperties. - :type: bool - """ # noqa: E501 - self._shade_below = shade_below - - @property - def hover_dimension(self): - """Get the hover_dimension of this LinePlusSingleStatProperties. - - :return: The hover_dimension of this LinePlusSingleStatProperties. - :rtype: str - """ # noqa: E501 - return self._hover_dimension - - @hover_dimension.setter - def hover_dimension(self, hover_dimension): - """Set the hover_dimension of this LinePlusSingleStatProperties. - - :param hover_dimension: The hover_dimension of this LinePlusSingleStatProperties. - :type: str - """ # noqa: E501 - self._hover_dimension = hover_dimension - - @property - def position(self): - """Get the position of this LinePlusSingleStatProperties. - - :return: The position of this LinePlusSingleStatProperties. - :rtype: str - """ # noqa: E501 - return self._position - - @position.setter - def position(self, position): - """Set the position of this LinePlusSingleStatProperties. - - :param position: The position of this LinePlusSingleStatProperties. - :type: str - """ # noqa: E501 - if position is None: - raise ValueError("Invalid value for `position`, must not be `None`") # noqa: E501 - self._position = position - - @property - def prefix(self): - """Get the prefix of this LinePlusSingleStatProperties. - - :return: The prefix of this LinePlusSingleStatProperties. - :rtype: str - """ # noqa: E501 - return self._prefix - - @prefix.setter - def prefix(self, prefix): - """Set the prefix of this LinePlusSingleStatProperties. - - :param prefix: The prefix of this LinePlusSingleStatProperties. - :type: str - """ # noqa: E501 - if prefix is None: - raise ValueError("Invalid value for `prefix`, must not be `None`") # noqa: E501 - self._prefix = prefix - - @property - def suffix(self): - """Get the suffix of this LinePlusSingleStatProperties. - - :return: The suffix of this LinePlusSingleStatProperties. - :rtype: str - """ # noqa: E501 - return self._suffix - - @suffix.setter - def suffix(self, suffix): - """Set the suffix of this LinePlusSingleStatProperties. - - :param suffix: The suffix of this LinePlusSingleStatProperties. - :type: str - """ # noqa: E501 - if suffix is None: - raise ValueError("Invalid value for `suffix`, must not be `None`") # noqa: E501 - self._suffix = suffix - - @property - def decimal_places(self): - """Get the decimal_places of this LinePlusSingleStatProperties. - - :return: The decimal_places of this LinePlusSingleStatProperties. - :rtype: DecimalPlaces - """ # noqa: E501 - return self._decimal_places - - @decimal_places.setter - def decimal_places(self, decimal_places): - """Set the decimal_places of this LinePlusSingleStatProperties. - - :param decimal_places: The decimal_places of this LinePlusSingleStatProperties. - :type: DecimalPlaces - """ # noqa: E501 - if decimal_places is None: - raise ValueError("Invalid value for `decimal_places`, must not be `None`") # noqa: E501 - self._decimal_places = decimal_places - - @property - def legend_colorize_rows(self): - """Get the legend_colorize_rows of this LinePlusSingleStatProperties. - - :return: The legend_colorize_rows of this LinePlusSingleStatProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_colorize_rows - - @legend_colorize_rows.setter - def legend_colorize_rows(self, legend_colorize_rows): - """Set the legend_colorize_rows of this LinePlusSingleStatProperties. - - :param legend_colorize_rows: The legend_colorize_rows of this LinePlusSingleStatProperties. - :type: bool - """ # noqa: E501 - self._legend_colorize_rows = legend_colorize_rows - - @property - def legend_hide(self): - """Get the legend_hide of this LinePlusSingleStatProperties. - - :return: The legend_hide of this LinePlusSingleStatProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_hide - - @legend_hide.setter - def legend_hide(self, legend_hide): - """Set the legend_hide of this LinePlusSingleStatProperties. - - :param legend_hide: The legend_hide of this LinePlusSingleStatProperties. - :type: bool - """ # noqa: E501 - self._legend_hide = legend_hide - - @property - def legend_opacity(self): - """Get the legend_opacity of this LinePlusSingleStatProperties. - - :return: The legend_opacity of this LinePlusSingleStatProperties. - :rtype: float - """ # noqa: E501 - return self._legend_opacity - - @legend_opacity.setter - def legend_opacity(self, legend_opacity): - """Set the legend_opacity of this LinePlusSingleStatProperties. - - :param legend_opacity: The legend_opacity of this LinePlusSingleStatProperties. - :type: float - """ # noqa: E501 - self._legend_opacity = legend_opacity - - @property - def legend_orientation_threshold(self): - """Get the legend_orientation_threshold of this LinePlusSingleStatProperties. - - :return: The legend_orientation_threshold of this LinePlusSingleStatProperties. - :rtype: int - """ # noqa: E501 - return self._legend_orientation_threshold - - @legend_orientation_threshold.setter - def legend_orientation_threshold(self, legend_orientation_threshold): - """Set the legend_orientation_threshold of this LinePlusSingleStatProperties. - - :param legend_orientation_threshold: The legend_orientation_threshold of this LinePlusSingleStatProperties. - :type: int - """ # noqa: E501 - self._legend_orientation_threshold = legend_orientation_threshold - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, LinePlusSingleStatProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/line_protocol_error.py b/frogpilot/third_party/influxdb_client/domain/line_protocol_error.py deleted file mode 100644 index 2050a8b28..000000000 --- a/frogpilot/third_party/influxdb_client/domain/line_protocol_error.py +++ /dev/null @@ -1,220 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class LineProtocolError(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'code': 'str', - 'message': 'str', - 'op': 'str', - 'err': 'str', - 'line': 'int' - } - - attribute_map = { - 'code': 'code', - 'message': 'message', - 'op': 'op', - 'err': 'err', - 'line': 'line' - } - - def __init__(self, code=None, message=None, op=None, err=None, line=None): # noqa: E501,D401,D403 - """LineProtocolError - a model defined in OpenAPI.""" # noqa: E501 - self._code = None - self._message = None - self._op = None - self._err = None - self._line = None - self.discriminator = None - - self.code = code - if message is not None: - self.message = message - if op is not None: - self.op = op - if err is not None: - self.err = err - if line is not None: - self.line = line - - @property - def code(self): - """Get the code of this LineProtocolError. - - Code is the machine-readable error code. - - :return: The code of this LineProtocolError. - :rtype: str - """ # noqa: E501 - return self._code - - @code.setter - def code(self, code): - """Set the code of this LineProtocolError. - - Code is the machine-readable error code. - - :param code: The code of this LineProtocolError. - :type: str - """ # noqa: E501 - if code is None: - raise ValueError("Invalid value for `code`, must not be `None`") # noqa: E501 - self._code = code - - @property - def message(self): - """Get the message of this LineProtocolError. - - Human-readable message. - - :return: The message of this LineProtocolError. - :rtype: str - """ # noqa: E501 - return self._message - - @message.setter - def message(self, message): - """Set the message of this LineProtocolError. - - Human-readable message. - - :param message: The message of this LineProtocolError. - :type: str - """ # noqa: E501 - self._message = message - - @property - def op(self): - """Get the op of this LineProtocolError. - - Describes the logical code operation when the error occurred. Useful for debugging. - - :return: The op of this LineProtocolError. - :rtype: str - """ # noqa: E501 - return self._op - - @op.setter - def op(self, op): - """Set the op of this LineProtocolError. - - Describes the logical code operation when the error occurred. Useful for debugging. - - :param op: The op of this LineProtocolError. - :type: str - """ # noqa: E501 - self._op = op - - @property - def err(self): - """Get the err of this LineProtocolError. - - Stack of errors that occurred during processing of the request. Useful for debugging. - - :return: The err of this LineProtocolError. - :rtype: str - """ # noqa: E501 - return self._err - - @err.setter - def err(self, err): - """Set the err of this LineProtocolError. - - Stack of errors that occurred during processing of the request. Useful for debugging. - - :param err: The err of this LineProtocolError. - :type: str - """ # noqa: E501 - self._err = err - - @property - def line(self): - """Get the line of this LineProtocolError. - - First line in the request body that contains malformed data. - - :return: The line of this LineProtocolError. - :rtype: int - """ # noqa: E501 - return self._line - - @line.setter - def line(self, line): - """Set the line of this LineProtocolError. - - First line in the request body that contains malformed data. - - :param line: The line of this LineProtocolError. - :type: int - """ # noqa: E501 - self._line = line - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, LineProtocolError): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/line_protocol_length_error.py b/frogpilot/third_party/influxdb_client/domain/line_protocol_length_error.py deleted file mode 100644 index d40aa6ae4..000000000 --- a/frogpilot/third_party/influxdb_client/domain/line_protocol_length_error.py +++ /dev/null @@ -1,140 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class LineProtocolLengthError(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'code': 'str', - 'message': 'str' - } - - attribute_map = { - 'code': 'code', - 'message': 'message' - } - - def __init__(self, code=None, message=None): # noqa: E501,D401,D403 - """LineProtocolLengthError - a model defined in OpenAPI.""" # noqa: E501 - self._code = None - self._message = None - self.discriminator = None - - self.code = code - self.message = message - - @property - def code(self): - """Get the code of this LineProtocolLengthError. - - Code is the machine-readable error code. - - :return: The code of this LineProtocolLengthError. - :rtype: str - """ # noqa: E501 - return self._code - - @code.setter - def code(self, code): - """Set the code of this LineProtocolLengthError. - - Code is the machine-readable error code. - - :param code: The code of this LineProtocolLengthError. - :type: str - """ # noqa: E501 - if code is None: - raise ValueError("Invalid value for `code`, must not be `None`") # noqa: E501 - self._code = code - - @property - def message(self): - """Get the message of this LineProtocolLengthError. - - Human-readable message. - - :return: The message of this LineProtocolLengthError. - :rtype: str - """ # noqa: E501 - return self._message - - @message.setter - def message(self, message): - """Set the message of this LineProtocolLengthError. - - Human-readable message. - - :param message: The message of this LineProtocolLengthError. - :type: str - """ # noqa: E501 - if message is None: - raise ValueError("Invalid value for `message`, must not be `None`") # noqa: E501 - self._message = message - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, LineProtocolLengthError): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/links.py b/frogpilot/third_party/influxdb_client/domain/links.py deleted file mode 100644 index d9844c8b0..000000000 --- a/frogpilot/third_party/influxdb_client/domain/links.py +++ /dev/null @@ -1,166 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Links(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'next': 'str', - '_self': 'str', - 'prev': 'str' - } - - attribute_map = { - 'next': 'next', - '_self': 'self', - 'prev': 'prev' - } - - def __init__(self, next=None, _self=None, prev=None): # noqa: E501,D401,D403 - """Links - a model defined in OpenAPI.""" # noqa: E501 - self._next = None - self.__self = None - self._prev = None - self.discriminator = None - - if next is not None: - self.next = next - self._self = _self - if prev is not None: - self.prev = prev - - @property - def next(self): - """Get the next of this Links. - - URI of resource. - - :return: The next of this Links. - :rtype: str - """ # noqa: E501 - return self._next - - @next.setter - def next(self, next): - """Set the next of this Links. - - URI of resource. - - :param next: The next of this Links. - :type: str - """ # noqa: E501 - self._next = next - - @property - def _self(self): - """Get the _self of this Links. - - URI of resource. - - :return: The _self of this Links. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this Links. - - URI of resource. - - :param _self: The _self of this Links. - :type: str - """ # noqa: E501 - if _self is None: - raise ValueError("Invalid value for `_self`, must not be `None`") # noqa: E501 - self.__self = _self - - @property - def prev(self): - """Get the prev of this Links. - - URI of resource. - - :return: The prev of this Links. - :rtype: str - """ # noqa: E501 - return self._prev - - @prev.setter - def prev(self, prev): - """Set the prev of this Links. - - URI of resource. - - :param prev: The prev of this Links. - :type: str - """ # noqa: E501 - self._prev = prev - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Links): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/list_stacks_response.py b/frogpilot/third_party/influxdb_client/domain/list_stacks_response.py deleted file mode 100644 index 084e34024..000000000 --- a/frogpilot/third_party/influxdb_client/domain/list_stacks_response.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ListStacksResponse(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'stacks': 'list[Stack]' - } - - attribute_map = { - 'stacks': 'stacks' - } - - def __init__(self, stacks=None): # noqa: E501,D401,D403 - """ListStacksResponse - a model defined in OpenAPI.""" # noqa: E501 - self._stacks = None - self.discriminator = None - - if stacks is not None: - self.stacks = stacks - - @property - def stacks(self): - """Get the stacks of this ListStacksResponse. - - :return: The stacks of this ListStacksResponse. - :rtype: list[Stack] - """ # noqa: E501 - return self._stacks - - @stacks.setter - def stacks(self, stacks): - """Set the stacks of this ListStacksResponse. - - :param stacks: The stacks of this ListStacksResponse. - :type: list[Stack] - """ # noqa: E501 - self._stacks = stacks - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ListStacksResponse): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/log_event.py b/frogpilot/third_party/influxdb_client/domain/log_event.py deleted file mode 100644 index 336736e82..000000000 --- a/frogpilot/third_party/influxdb_client/domain/log_event.py +++ /dev/null @@ -1,165 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class LogEvent(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'time': 'datetime', - 'message': 'str', - 'run_id': 'str' - } - - attribute_map = { - 'time': 'time', - 'message': 'message', - 'run_id': 'runID' - } - - def __init__(self, time=None, message=None, run_id=None): # noqa: E501,D401,D403 - """LogEvent - a model defined in OpenAPI.""" # noqa: E501 - self._time = None - self._message = None - self._run_id = None - self.discriminator = None - - if time is not None: - self.time = time - if message is not None: - self.message = message - if run_id is not None: - self.run_id = run_id - - @property - def time(self): - """Get the time of this LogEvent. - - The time ([RFC3339Nano date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339nano-timestamp)) that the event occurred. - - :return: The time of this LogEvent. - :rtype: datetime - """ # noqa: E501 - return self._time - - @time.setter - def time(self, time): - """Set the time of this LogEvent. - - The time ([RFC3339Nano date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339nano-timestamp)) that the event occurred. - - :param time: The time of this LogEvent. - :type: datetime - """ # noqa: E501 - self._time = time - - @property - def message(self): - """Get the message of this LogEvent. - - A description of the event that occurred. - - :return: The message of this LogEvent. - :rtype: str - """ # noqa: E501 - return self._message - - @message.setter - def message(self, message): - """Set the message of this LogEvent. - - A description of the event that occurred. - - :param message: The message of this LogEvent. - :type: str - """ # noqa: E501 - self._message = message - - @property - def run_id(self): - """Get the run_id of this LogEvent. - - The ID of the task run that generated the event. - - :return: The run_id of this LogEvent. - :rtype: str - """ # noqa: E501 - return self._run_id - - @run_id.setter - def run_id(self, run_id): - """Set the run_id of this LogEvent. - - The ID of the task run that generated the event. - - :param run_id: The run_id of this LogEvent. - :type: str - """ # noqa: E501 - self._run_id = run_id - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, LogEvent): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/logical_expression.py b/frogpilot/third_party/influxdb_client/domain/logical_expression.py deleted file mode 100644 index 25a1aa9b1..000000000 --- a/frogpilot/third_party/influxdb_client/domain/logical_expression.py +++ /dev/null @@ -1,184 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class LogicalExpression(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'operator': 'str', - 'left': 'Expression', - 'right': 'Expression' - } - - attribute_map = { - 'type': 'type', - 'operator': 'operator', - 'left': 'left', - 'right': 'right' - } - - def __init__(self, type=None, operator=None, left=None, right=None): # noqa: E501,D401,D403 - """LogicalExpression - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._operator = None - self._left = None - self._right = None - self.discriminator = None - - if type is not None: - self.type = type - if operator is not None: - self.operator = operator - if left is not None: - self.left = left - if right is not None: - self.right = right - - @property - def type(self): - """Get the type of this LogicalExpression. - - Type of AST node - - :return: The type of this LogicalExpression. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this LogicalExpression. - - Type of AST node - - :param type: The type of this LogicalExpression. - :type: str - """ # noqa: E501 - self._type = type - - @property - def operator(self): - """Get the operator of this LogicalExpression. - - :return: The operator of this LogicalExpression. - :rtype: str - """ # noqa: E501 - return self._operator - - @operator.setter - def operator(self, operator): - """Set the operator of this LogicalExpression. - - :param operator: The operator of this LogicalExpression. - :type: str - """ # noqa: E501 - self._operator = operator - - @property - def left(self): - """Get the left of this LogicalExpression. - - :return: The left of this LogicalExpression. - :rtype: Expression - """ # noqa: E501 - return self._left - - @left.setter - def left(self, left): - """Set the left of this LogicalExpression. - - :param left: The left of this LogicalExpression. - :type: Expression - """ # noqa: E501 - self._left = left - - @property - def right(self): - """Get the right of this LogicalExpression. - - :return: The right of this LogicalExpression. - :rtype: Expression - """ # noqa: E501 - return self._right - - @right.setter - def right(self, right): - """Set the right of this LogicalExpression. - - :param right: The right of this LogicalExpression. - :type: Expression - """ # noqa: E501 - self._right = right - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, LogicalExpression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/logs.py b/frogpilot/third_party/influxdb_client/domain/logs.py deleted file mode 100644 index 0dd2acfdc..000000000 --- a/frogpilot/third_party/influxdb_client/domain/logs.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Logs(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'events': 'list[LogEvent]' - } - - attribute_map = { - 'events': 'events' - } - - def __init__(self, events=None): # noqa: E501,D401,D403 - """Logs - a model defined in OpenAPI.""" # noqa: E501 - self._events = None - self.discriminator = None - - if events is not None: - self.events = events - - @property - def events(self): - """Get the events of this Logs. - - :return: The events of this Logs. - :rtype: list[LogEvent] - """ # noqa: E501 - return self._events - - @events.setter - def events(self, events): - """Set the events of this Logs. - - :param events: The events of this Logs. - :type: list[LogEvent] - """ # noqa: E501 - self._events = events - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Logs): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/map_variable_properties.py b/frogpilot/third_party/influxdb_client/domain/map_variable_properties.py deleted file mode 100644 index 8648d9cb9..000000000 --- a/frogpilot/third_party/influxdb_client/domain/map_variable_properties.py +++ /dev/null @@ -1,134 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.variable_properties import VariableProperties - - -class MapVariableProperties(VariableProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'values': 'dict(str, str)' - } - - attribute_map = { - 'type': 'type', - 'values': 'values' - } - - def __init__(self, type=None, values=None): # noqa: E501,D401,D403 - """MapVariableProperties - a model defined in OpenAPI.""" # noqa: E501 - VariableProperties.__init__(self) # noqa: E501 - - self._type = None - self._values = None - self.discriminator = None - - if type is not None: - self.type = type - if values is not None: - self.values = values - - @property - def type(self): - """Get the type of this MapVariableProperties. - - :return: The type of this MapVariableProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this MapVariableProperties. - - :param type: The type of this MapVariableProperties. - :type: str - """ # noqa: E501 - self._type = type - - @property - def values(self): - """Get the values of this MapVariableProperties. - - :return: The values of this MapVariableProperties. - :rtype: dict(str, str) - """ # noqa: E501 - return self._values - - @values.setter - def values(self, values): - """Set the values of this MapVariableProperties. - - :param values: The values of this MapVariableProperties. - :type: dict(str, str) - """ # noqa: E501 - self._values = values - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, MapVariableProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/markdown_view_properties.py b/frogpilot/third_party/influxdb_client/domain/markdown_view_properties.py deleted file mode 100644 index cc797f06d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/markdown_view_properties.py +++ /dev/null @@ -1,160 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.view_properties import ViewProperties - - -class MarkdownViewProperties(ViewProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'shape': 'str', - 'note': 'str' - } - - attribute_map = { - 'type': 'type', - 'shape': 'shape', - 'note': 'note' - } - - def __init__(self, type=None, shape=None, note=None): # noqa: E501,D401,D403 - """MarkdownViewProperties - a model defined in OpenAPI.""" # noqa: E501 - ViewProperties.__init__(self) # noqa: E501 - - self._type = None - self._shape = None - self._note = None - self.discriminator = None - - self.type = type - self.shape = shape - self.note = note - - @property - def type(self): - """Get the type of this MarkdownViewProperties. - - :return: The type of this MarkdownViewProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this MarkdownViewProperties. - - :param type: The type of this MarkdownViewProperties. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def shape(self): - """Get the shape of this MarkdownViewProperties. - - :return: The shape of this MarkdownViewProperties. - :rtype: str - """ # noqa: E501 - return self._shape - - @shape.setter - def shape(self, shape): - """Set the shape of this MarkdownViewProperties. - - :param shape: The shape of this MarkdownViewProperties. - :type: str - """ # noqa: E501 - if shape is None: - raise ValueError("Invalid value for `shape`, must not be `None`") # noqa: E501 - self._shape = shape - - @property - def note(self): - """Get the note of this MarkdownViewProperties. - - :return: The note of this MarkdownViewProperties. - :rtype: str - """ # noqa: E501 - return self._note - - @note.setter - def note(self, note): - """Set the note of this MarkdownViewProperties. - - :param note: The note of this MarkdownViewProperties. - :type: str - """ # noqa: E501 - if note is None: - raise ValueError("Invalid value for `note`, must not be `None`") # noqa: E501 - self._note = note - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, MarkdownViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/measurement_schema.py b/frogpilot/third_party/influxdb_client/domain/measurement_schema.py deleted file mode 100644 index f2a48faa1..000000000 --- a/frogpilot/third_party/influxdb_client/domain/measurement_schema.py +++ /dev/null @@ -1,262 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class MeasurementSchema(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'org_id': 'str', - 'bucket_id': 'str', - 'name': 'str', - 'columns': 'list[MeasurementSchemaColumn]', - 'created_at': 'datetime', - 'updated_at': 'datetime' - } - - attribute_map = { - 'id': 'id', - 'org_id': 'orgID', - 'bucket_id': 'bucketID', - 'name': 'name', - 'columns': 'columns', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt' - } - - def __init__(self, id=None, org_id=None, bucket_id=None, name=None, columns=None, created_at=None, updated_at=None): # noqa: E501,D401,D403 - """MeasurementSchema - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._org_id = None - self._bucket_id = None - self._name = None - self._columns = None - self._created_at = None - self._updated_at = None - self.discriminator = None - - self.id = id - if org_id is not None: - self.org_id = org_id - if bucket_id is not None: - self.bucket_id = bucket_id - self.name = name - self.columns = columns - self.created_at = created_at - self.updated_at = updated_at - - @property - def id(self): - """Get the id of this MeasurementSchema. - - :return: The id of this MeasurementSchema. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this MeasurementSchema. - - :param id: The id of this MeasurementSchema. - :type: str - """ # noqa: E501 - if id is None: - raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 - self._id = id - - @property - def org_id(self): - """Get the org_id of this MeasurementSchema. - - The ID of the organization. - - :return: The org_id of this MeasurementSchema. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this MeasurementSchema. - - The ID of the organization. - - :param org_id: The org_id of this MeasurementSchema. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def bucket_id(self): - """Get the bucket_id of this MeasurementSchema. - - The ID of the bucket that the measurement schema is associated with. - - :return: The bucket_id of this MeasurementSchema. - :rtype: str - """ # noqa: E501 - return self._bucket_id - - @bucket_id.setter - def bucket_id(self, bucket_id): - """Set the bucket_id of this MeasurementSchema. - - The ID of the bucket that the measurement schema is associated with. - - :param bucket_id: The bucket_id of this MeasurementSchema. - :type: str - """ # noqa: E501 - self._bucket_id = bucket_id - - @property - def name(self): - """Get the name of this MeasurementSchema. - - :return: The name of this MeasurementSchema. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this MeasurementSchema. - - :param name: The name of this MeasurementSchema. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def columns(self): - """Get the columns of this MeasurementSchema. - - Ordered collection of column definitions. - - :return: The columns of this MeasurementSchema. - :rtype: list[MeasurementSchemaColumn] - """ # noqa: E501 - return self._columns - - @columns.setter - def columns(self, columns): - """Set the columns of this MeasurementSchema. - - Ordered collection of column definitions. - - :param columns: The columns of this MeasurementSchema. - :type: list[MeasurementSchemaColumn] - """ # noqa: E501 - if columns is None: - raise ValueError("Invalid value for `columns`, must not be `None`") # noqa: E501 - self._columns = columns - - @property - def created_at(self): - """Get the created_at of this MeasurementSchema. - - :return: The created_at of this MeasurementSchema. - :rtype: datetime - """ # noqa: E501 - return self._created_at - - @created_at.setter - def created_at(self, created_at): - """Set the created_at of this MeasurementSchema. - - :param created_at: The created_at of this MeasurementSchema. - :type: datetime - """ # noqa: E501 - if created_at is None: - raise ValueError("Invalid value for `created_at`, must not be `None`") # noqa: E501 - self._created_at = created_at - - @property - def updated_at(self): - """Get the updated_at of this MeasurementSchema. - - :return: The updated_at of this MeasurementSchema. - :rtype: datetime - """ # noqa: E501 - return self._updated_at - - @updated_at.setter - def updated_at(self, updated_at): - """Set the updated_at of this MeasurementSchema. - - :param updated_at: The updated_at of this MeasurementSchema. - :type: datetime - """ # noqa: E501 - if updated_at is None: - raise ValueError("Invalid value for `updated_at`, must not be `None`") # noqa: E501 - self._updated_at = updated_at - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, MeasurementSchema): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/measurement_schema_column.py b/frogpilot/third_party/influxdb_client/domain/measurement_schema_column.py deleted file mode 100644 index 79ee3845f..000000000 --- a/frogpilot/third_party/influxdb_client/domain/measurement_schema_column.py +++ /dev/null @@ -1,155 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class MeasurementSchemaColumn(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'type': 'ColumnSemanticType', - 'data_type': 'ColumnDataType' - } - - attribute_map = { - 'name': 'name', - 'type': 'type', - 'data_type': 'dataType' - } - - def __init__(self, name=None, type=None, data_type=None): # noqa: E501,D401,D403 - """MeasurementSchemaColumn - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._type = None - self._data_type = None - self.discriminator = None - - self.name = name - self.type = type - if data_type is not None: - self.data_type = data_type - - @property - def name(self): - """Get the name of this MeasurementSchemaColumn. - - :return: The name of this MeasurementSchemaColumn. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this MeasurementSchemaColumn. - - :param name: The name of this MeasurementSchemaColumn. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def type(self): - """Get the type of this MeasurementSchemaColumn. - - :return: The type of this MeasurementSchemaColumn. - :rtype: ColumnSemanticType - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this MeasurementSchemaColumn. - - :param type: The type of this MeasurementSchemaColumn. - :type: ColumnSemanticType - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def data_type(self): - """Get the data_type of this MeasurementSchemaColumn. - - :return: The data_type of this MeasurementSchemaColumn. - :rtype: ColumnDataType - """ # noqa: E501 - return self._data_type - - @data_type.setter - def data_type(self, data_type): - """Set the data_type of this MeasurementSchemaColumn. - - :param data_type: The data_type of this MeasurementSchemaColumn. - :type: ColumnDataType - """ # noqa: E501 - self._data_type = data_type - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, MeasurementSchemaColumn): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/measurement_schema_create_request.py b/frogpilot/third_party/influxdb_client/domain/measurement_schema_create_request.py deleted file mode 100644 index 1308a2daa..000000000 --- a/frogpilot/third_party/influxdb_client/domain/measurement_schema_create_request.py +++ /dev/null @@ -1,140 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class MeasurementSchemaCreateRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'columns': 'list[MeasurementSchemaColumn]' - } - - attribute_map = { - 'name': 'name', - 'columns': 'columns' - } - - def __init__(self, name=None, columns=None): # noqa: E501,D401,D403 - """MeasurementSchemaCreateRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._columns = None - self.discriminator = None - - self.name = name - self.columns = columns - - @property - def name(self): - """Get the name of this MeasurementSchemaCreateRequest. - - The [measurement](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#measurement) name. - - :return: The name of this MeasurementSchemaCreateRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this MeasurementSchemaCreateRequest. - - The [measurement](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#measurement) name. - - :param name: The name of this MeasurementSchemaCreateRequest. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def columns(self): - """Get the columns of this MeasurementSchemaCreateRequest. - - Ordered collection of column definitions. - - :return: The columns of this MeasurementSchemaCreateRequest. - :rtype: list[MeasurementSchemaColumn] - """ # noqa: E501 - return self._columns - - @columns.setter - def columns(self, columns): - """Set the columns of this MeasurementSchemaCreateRequest. - - Ordered collection of column definitions. - - :param columns: The columns of this MeasurementSchemaCreateRequest. - :type: list[MeasurementSchemaColumn] - """ # noqa: E501 - if columns is None: - raise ValueError("Invalid value for `columns`, must not be `None`") # noqa: E501 - self._columns = columns - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, MeasurementSchemaCreateRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/measurement_schema_list.py b/frogpilot/third_party/influxdb_client/domain/measurement_schema_list.py deleted file mode 100644 index f8a83ddaa..000000000 --- a/frogpilot/third_party/influxdb_client/domain/measurement_schema_list.py +++ /dev/null @@ -1,108 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class MeasurementSchemaList(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'measurement_schemas': 'list[MeasurementSchema]' - } - - attribute_map = { - 'measurement_schemas': 'measurementSchemas' - } - - def __init__(self, measurement_schemas=None): # noqa: E501,D401,D403 - """MeasurementSchemaList - a model defined in OpenAPI.""" # noqa: E501 - self._measurement_schemas = None - self.discriminator = None - - self.measurement_schemas = measurement_schemas - - @property - def measurement_schemas(self): - """Get the measurement_schemas of this MeasurementSchemaList. - - :return: The measurement_schemas of this MeasurementSchemaList. - :rtype: list[MeasurementSchema] - """ # noqa: E501 - return self._measurement_schemas - - @measurement_schemas.setter - def measurement_schemas(self, measurement_schemas): - """Set the measurement_schemas of this MeasurementSchemaList. - - :param measurement_schemas: The measurement_schemas of this MeasurementSchemaList. - :type: list[MeasurementSchema] - """ # noqa: E501 - if measurement_schemas is None: - raise ValueError("Invalid value for `measurement_schemas`, must not be `None`") # noqa: E501 - self._measurement_schemas = measurement_schemas - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, MeasurementSchemaList): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/measurement_schema_update_request.py b/frogpilot/third_party/influxdb_client/domain/measurement_schema_update_request.py deleted file mode 100644 index bdfa19c29..000000000 --- a/frogpilot/third_party/influxdb_client/domain/measurement_schema_update_request.py +++ /dev/null @@ -1,112 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class MeasurementSchemaUpdateRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'columns': 'list[MeasurementSchemaColumn]' - } - - attribute_map = { - 'columns': 'columns' - } - - def __init__(self, columns=None): # noqa: E501,D401,D403 - """MeasurementSchemaUpdateRequest - a model defined in OpenAPI.""" # noqa: E501 - self._columns = None - self.discriminator = None - - self.columns = columns - - @property - def columns(self): - """Get the columns of this MeasurementSchemaUpdateRequest. - - An ordered collection of column definitions - - :return: The columns of this MeasurementSchemaUpdateRequest. - :rtype: list[MeasurementSchemaColumn] - """ # noqa: E501 - return self._columns - - @columns.setter - def columns(self, columns): - """Set the columns of this MeasurementSchemaUpdateRequest. - - An ordered collection of column definitions - - :param columns: The columns of this MeasurementSchemaUpdateRequest. - :type: list[MeasurementSchemaColumn] - """ # noqa: E501 - if columns is None: - raise ValueError("Invalid value for `columns`, must not be `None`") # noqa: E501 - self._columns = columns - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, MeasurementSchemaUpdateRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/member_assignment.py b/frogpilot/third_party/influxdb_client/domain/member_assignment.py deleted file mode 100644 index 7773b0e40..000000000 --- a/frogpilot/third_party/influxdb_client/domain/member_assignment.py +++ /dev/null @@ -1,161 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.statement import Statement - - -class MemberAssignment(Statement): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'member': 'MemberExpression', - 'init': 'Expression' - } - - attribute_map = { - 'type': 'type', - 'member': 'member', - 'init': 'init' - } - - def __init__(self, type=None, member=None, init=None): # noqa: E501,D401,D403 - """MemberAssignment - a model defined in OpenAPI.""" # noqa: E501 - Statement.__init__(self) # noqa: E501 - - self._type = None - self._member = None - self._init = None - self.discriminator = None - - if type is not None: - self.type = type - if member is not None: - self.member = member - if init is not None: - self.init = init - - @property - def type(self): - """Get the type of this MemberAssignment. - - Type of AST node - - :return: The type of this MemberAssignment. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this MemberAssignment. - - Type of AST node - - :param type: The type of this MemberAssignment. - :type: str - """ # noqa: E501 - self._type = type - - @property - def member(self): - """Get the member of this MemberAssignment. - - :return: The member of this MemberAssignment. - :rtype: MemberExpression - """ # noqa: E501 - return self._member - - @member.setter - def member(self, member): - """Set the member of this MemberAssignment. - - :param member: The member of this MemberAssignment. - :type: MemberExpression - """ # noqa: E501 - self._member = member - - @property - def init(self): - """Get the init of this MemberAssignment. - - :return: The init of this MemberAssignment. - :rtype: Expression - """ # noqa: E501 - return self._init - - @init.setter - def init(self, init): - """Set the init of this MemberAssignment. - - :param init: The init of this MemberAssignment. - :type: Expression - """ # noqa: E501 - self._init = init - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, MemberAssignment): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/member_expression.py b/frogpilot/third_party/influxdb_client/domain/member_expression.py deleted file mode 100644 index decf2c48c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/member_expression.py +++ /dev/null @@ -1,161 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class MemberExpression(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'object': 'Expression', - '_property': 'PropertyKey' - } - - attribute_map = { - 'type': 'type', - 'object': 'object', - '_property': 'property' - } - - def __init__(self, type=None, object=None, _property=None): # noqa: E501,D401,D403 - """MemberExpression - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._object = None - self.__property = None - self.discriminator = None - - if type is not None: - self.type = type - if object is not None: - self.object = object - if _property is not None: - self._property = _property - - @property - def type(self): - """Get the type of this MemberExpression. - - Type of AST node - - :return: The type of this MemberExpression. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this MemberExpression. - - Type of AST node - - :param type: The type of this MemberExpression. - :type: str - """ # noqa: E501 - self._type = type - - @property - def object(self): - """Get the object of this MemberExpression. - - :return: The object of this MemberExpression. - :rtype: Expression - """ # noqa: E501 - return self._object - - @object.setter - def object(self, object): - """Set the object of this MemberExpression. - - :param object: The object of this MemberExpression. - :type: Expression - """ # noqa: E501 - self._object = object - - @property - def _property(self): - """Get the _property of this MemberExpression. - - :return: The _property of this MemberExpression. - :rtype: PropertyKey - """ # noqa: E501 - return self.__property - - @_property.setter - def _property(self, _property): - """Set the _property of this MemberExpression. - - :param _property: The _property of this MemberExpression. - :type: PropertyKey - """ # noqa: E501 - self.__property = _property - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, MemberExpression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/metadata_backup.py b/frogpilot/third_party/influxdb_client/domain/metadata_backup.py deleted file mode 100644 index ebe498fcb..000000000 --- a/frogpilot/third_party/influxdb_client/domain/metadata_backup.py +++ /dev/null @@ -1,156 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class MetadataBackup(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kv': 'file', - 'sql': 'file', - 'buckets': 'list[BucketMetadataManifest]' - } - - attribute_map = { - 'kv': 'kv', - 'sql': 'sql', - 'buckets': 'buckets' - } - - def __init__(self, kv=None, sql=None, buckets=None): # noqa: E501,D401,D403 - """MetadataBackup - a model defined in OpenAPI.""" # noqa: E501 - self._kv = None - self._sql = None - self._buckets = None - self.discriminator = None - - self.kv = kv - self.sql = sql - self.buckets = buckets - - @property - def kv(self): - """Get the kv of this MetadataBackup. - - :return: The kv of this MetadataBackup. - :rtype: file - """ # noqa: E501 - return self._kv - - @kv.setter - def kv(self, kv): - """Set the kv of this MetadataBackup. - - :param kv: The kv of this MetadataBackup. - :type: file - """ # noqa: E501 - if kv is None: - raise ValueError("Invalid value for `kv`, must not be `None`") # noqa: E501 - self._kv = kv - - @property - def sql(self): - """Get the sql of this MetadataBackup. - - :return: The sql of this MetadataBackup. - :rtype: file - """ # noqa: E501 - return self._sql - - @sql.setter - def sql(self, sql): - """Set the sql of this MetadataBackup. - - :param sql: The sql of this MetadataBackup. - :type: file - """ # noqa: E501 - if sql is None: - raise ValueError("Invalid value for `sql`, must not be `None`") # noqa: E501 - self._sql = sql - - @property - def buckets(self): - """Get the buckets of this MetadataBackup. - - :return: The buckets of this MetadataBackup. - :rtype: list[BucketMetadataManifest] - """ # noqa: E501 - return self._buckets - - @buckets.setter - def buckets(self, buckets): - """Set the buckets of this MetadataBackup. - - :param buckets: The buckets of this MetadataBackup. - :type: list[BucketMetadataManifest] - """ # noqa: E501 - if buckets is None: - raise ValueError("Invalid value for `buckets`, must not be `None`") # noqa: E501 - self._buckets = buckets - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, MetadataBackup): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/model_property.py b/frogpilot/third_party/influxdb_client/domain/model_property.py deleted file mode 100644 index cbdcd249d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/model_property.py +++ /dev/null @@ -1,157 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ModelProperty(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'key': 'PropertyKey', - 'value': 'Expression' - } - - attribute_map = { - 'type': 'type', - 'key': 'key', - 'value': 'value' - } - - def __init__(self, type=None, key=None, value=None): # noqa: E501,D401,D403 - """ModelProperty - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self._key = None - self._value = None - self.discriminator = None - - if type is not None: - self.type = type - if key is not None: - self.key = key - if value is not None: - self.value = value - - @property - def type(self): - """Get the type of this ModelProperty. - - Type of AST node - - :return: The type of this ModelProperty. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this ModelProperty. - - Type of AST node - - :param type: The type of this ModelProperty. - :type: str - """ # noqa: E501 - self._type = type - - @property - def key(self): - """Get the key of this ModelProperty. - - :return: The key of this ModelProperty. - :rtype: PropertyKey - """ # noqa: E501 - return self._key - - @key.setter - def key(self, key): - """Set the key of this ModelProperty. - - :param key: The key of this ModelProperty. - :type: PropertyKey - """ # noqa: E501 - self._key = key - - @property - def value(self): - """Get the value of this ModelProperty. - - :return: The value of this ModelProperty. - :rtype: Expression - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this ModelProperty. - - :param value: The value of this ModelProperty. - :type: Expression - """ # noqa: E501 - self._value = value - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ModelProperty): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/mosaic_view_properties.py b/frogpilot/third_party/influxdb_client/domain/mosaic_view_properties.py deleted file mode 100644 index 1ea889724..000000000 --- a/frogpilot/third_party/influxdb_client/domain/mosaic_view_properties.py +++ /dev/null @@ -1,780 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.view_properties import ViewProperties - - -class MosaicViewProperties(ViewProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'time_format': 'str', - 'type': 'str', - 'queries': 'list[DashboardQuery]', - 'colors': 'list[str]', - 'shape': 'str', - 'note': 'str', - 'show_note_when_empty': 'bool', - 'x_column': 'str', - 'generate_x_axis_ticks': 'list[str]', - 'x_total_ticks': 'int', - 'x_tick_start': 'float', - 'x_tick_step': 'float', - 'y_label_column_separator': 'str', - 'y_label_columns': 'list[str]', - 'y_series_columns': 'list[str]', - 'fill_columns': 'list[str]', - 'x_domain': 'list[float]', - 'y_domain': 'list[float]', - 'x_axis_label': 'str', - 'y_axis_label': 'str', - 'x_prefix': 'str', - 'x_suffix': 'str', - 'y_prefix': 'str', - 'y_suffix': 'str', - 'hover_dimension': 'str', - 'legend_colorize_rows': 'bool', - 'legend_hide': 'bool', - 'legend_opacity': 'float', - 'legend_orientation_threshold': 'int' - } - - attribute_map = { - 'time_format': 'timeFormat', - 'type': 'type', - 'queries': 'queries', - 'colors': 'colors', - 'shape': 'shape', - 'note': 'note', - 'show_note_when_empty': 'showNoteWhenEmpty', - 'x_column': 'xColumn', - 'generate_x_axis_ticks': 'generateXAxisTicks', - 'x_total_ticks': 'xTotalTicks', - 'x_tick_start': 'xTickStart', - 'x_tick_step': 'xTickStep', - 'y_label_column_separator': 'yLabelColumnSeparator', - 'y_label_columns': 'yLabelColumns', - 'y_series_columns': 'ySeriesColumns', - 'fill_columns': 'fillColumns', - 'x_domain': 'xDomain', - 'y_domain': 'yDomain', - 'x_axis_label': 'xAxisLabel', - 'y_axis_label': 'yAxisLabel', - 'x_prefix': 'xPrefix', - 'x_suffix': 'xSuffix', - 'y_prefix': 'yPrefix', - 'y_suffix': 'ySuffix', - 'hover_dimension': 'hoverDimension', - 'legend_colorize_rows': 'legendColorizeRows', - 'legend_hide': 'legendHide', - 'legend_opacity': 'legendOpacity', - 'legend_orientation_threshold': 'legendOrientationThreshold' - } - - def __init__(self, time_format=None, type=None, queries=None, colors=None, shape=None, note=None, show_note_when_empty=None, x_column=None, generate_x_axis_ticks=None, x_total_ticks=None, x_tick_start=None, x_tick_step=None, y_label_column_separator=None, y_label_columns=None, y_series_columns=None, fill_columns=None, x_domain=None, y_domain=None, x_axis_label=None, y_axis_label=None, x_prefix=None, x_suffix=None, y_prefix=None, y_suffix=None, hover_dimension=None, legend_colorize_rows=None, legend_hide=None, legend_opacity=None, legend_orientation_threshold=None): # noqa: E501,D401,D403 - """MosaicViewProperties - a model defined in OpenAPI.""" # noqa: E501 - ViewProperties.__init__(self) # noqa: E501 - - self._time_format = None - self._type = None - self._queries = None - self._colors = None - self._shape = None - self._note = None - self._show_note_when_empty = None - self._x_column = None - self._generate_x_axis_ticks = None - self._x_total_ticks = None - self._x_tick_start = None - self._x_tick_step = None - self._y_label_column_separator = None - self._y_label_columns = None - self._y_series_columns = None - self._fill_columns = None - self._x_domain = None - self._y_domain = None - self._x_axis_label = None - self._y_axis_label = None - self._x_prefix = None - self._x_suffix = None - self._y_prefix = None - self._y_suffix = None - self._hover_dimension = None - self._legend_colorize_rows = None - self._legend_hide = None - self._legend_opacity = None - self._legend_orientation_threshold = None - self.discriminator = None - - if time_format is not None: - self.time_format = time_format - self.type = type - self.queries = queries - self.colors = colors - self.shape = shape - self.note = note - self.show_note_when_empty = show_note_when_empty - self.x_column = x_column - if generate_x_axis_ticks is not None: - self.generate_x_axis_ticks = generate_x_axis_ticks - if x_total_ticks is not None: - self.x_total_ticks = x_total_ticks - if x_tick_start is not None: - self.x_tick_start = x_tick_start - if x_tick_step is not None: - self.x_tick_step = x_tick_step - if y_label_column_separator is not None: - self.y_label_column_separator = y_label_column_separator - if y_label_columns is not None: - self.y_label_columns = y_label_columns - self.y_series_columns = y_series_columns - self.fill_columns = fill_columns - self.x_domain = x_domain - self.y_domain = y_domain - self.x_axis_label = x_axis_label - self.y_axis_label = y_axis_label - self.x_prefix = x_prefix - self.x_suffix = x_suffix - self.y_prefix = y_prefix - self.y_suffix = y_suffix - if hover_dimension is not None: - self.hover_dimension = hover_dimension - if legend_colorize_rows is not None: - self.legend_colorize_rows = legend_colorize_rows - if legend_hide is not None: - self.legend_hide = legend_hide - if legend_opacity is not None: - self.legend_opacity = legend_opacity - if legend_orientation_threshold is not None: - self.legend_orientation_threshold = legend_orientation_threshold - - @property - def time_format(self): - """Get the time_format of this MosaicViewProperties. - - :return: The time_format of this MosaicViewProperties. - :rtype: str - """ # noqa: E501 - return self._time_format - - @time_format.setter - def time_format(self, time_format): - """Set the time_format of this MosaicViewProperties. - - :param time_format: The time_format of this MosaicViewProperties. - :type: str - """ # noqa: E501 - self._time_format = time_format - - @property - def type(self): - """Get the type of this MosaicViewProperties. - - :return: The type of this MosaicViewProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this MosaicViewProperties. - - :param type: The type of this MosaicViewProperties. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def queries(self): - """Get the queries of this MosaicViewProperties. - - :return: The queries of this MosaicViewProperties. - :rtype: list[DashboardQuery] - """ # noqa: E501 - return self._queries - - @queries.setter - def queries(self, queries): - """Set the queries of this MosaicViewProperties. - - :param queries: The queries of this MosaicViewProperties. - :type: list[DashboardQuery] - """ # noqa: E501 - if queries is None: - raise ValueError("Invalid value for `queries`, must not be `None`") # noqa: E501 - self._queries = queries - - @property - def colors(self): - """Get the colors of this MosaicViewProperties. - - Colors define color encoding of data into a visualization - - :return: The colors of this MosaicViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._colors - - @colors.setter - def colors(self, colors): - """Set the colors of this MosaicViewProperties. - - Colors define color encoding of data into a visualization - - :param colors: The colors of this MosaicViewProperties. - :type: list[str] - """ # noqa: E501 - if colors is None: - raise ValueError("Invalid value for `colors`, must not be `None`") # noqa: E501 - self._colors = colors - - @property - def shape(self): - """Get the shape of this MosaicViewProperties. - - :return: The shape of this MosaicViewProperties. - :rtype: str - """ # noqa: E501 - return self._shape - - @shape.setter - def shape(self, shape): - """Set the shape of this MosaicViewProperties. - - :param shape: The shape of this MosaicViewProperties. - :type: str - """ # noqa: E501 - if shape is None: - raise ValueError("Invalid value for `shape`, must not be `None`") # noqa: E501 - self._shape = shape - - @property - def note(self): - """Get the note of this MosaicViewProperties. - - :return: The note of this MosaicViewProperties. - :rtype: str - """ # noqa: E501 - return self._note - - @note.setter - def note(self, note): - """Set the note of this MosaicViewProperties. - - :param note: The note of this MosaicViewProperties. - :type: str - """ # noqa: E501 - if note is None: - raise ValueError("Invalid value for `note`, must not be `None`") # noqa: E501 - self._note = note - - @property - def show_note_when_empty(self): - """Get the show_note_when_empty of this MosaicViewProperties. - - If true, will display note when empty - - :return: The show_note_when_empty of this MosaicViewProperties. - :rtype: bool - """ # noqa: E501 - return self._show_note_when_empty - - @show_note_when_empty.setter - def show_note_when_empty(self, show_note_when_empty): - """Set the show_note_when_empty of this MosaicViewProperties. - - If true, will display note when empty - - :param show_note_when_empty: The show_note_when_empty of this MosaicViewProperties. - :type: bool - """ # noqa: E501 - if show_note_when_empty is None: - raise ValueError("Invalid value for `show_note_when_empty`, must not be `None`") # noqa: E501 - self._show_note_when_empty = show_note_when_empty - - @property - def x_column(self): - """Get the x_column of this MosaicViewProperties. - - :return: The x_column of this MosaicViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_column - - @x_column.setter - def x_column(self, x_column): - """Set the x_column of this MosaicViewProperties. - - :param x_column: The x_column of this MosaicViewProperties. - :type: str - """ # noqa: E501 - if x_column is None: - raise ValueError("Invalid value for `x_column`, must not be `None`") # noqa: E501 - self._x_column = x_column - - @property - def generate_x_axis_ticks(self): - """Get the generate_x_axis_ticks of this MosaicViewProperties. - - :return: The generate_x_axis_ticks of this MosaicViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._generate_x_axis_ticks - - @generate_x_axis_ticks.setter - def generate_x_axis_ticks(self, generate_x_axis_ticks): - """Set the generate_x_axis_ticks of this MosaicViewProperties. - - :param generate_x_axis_ticks: The generate_x_axis_ticks of this MosaicViewProperties. - :type: list[str] - """ # noqa: E501 - self._generate_x_axis_ticks = generate_x_axis_ticks - - @property - def x_total_ticks(self): - """Get the x_total_ticks of this MosaicViewProperties. - - :return: The x_total_ticks of this MosaicViewProperties. - :rtype: int - """ # noqa: E501 - return self._x_total_ticks - - @x_total_ticks.setter - def x_total_ticks(self, x_total_ticks): - """Set the x_total_ticks of this MosaicViewProperties. - - :param x_total_ticks: The x_total_ticks of this MosaicViewProperties. - :type: int - """ # noqa: E501 - self._x_total_ticks = x_total_ticks - - @property - def x_tick_start(self): - """Get the x_tick_start of this MosaicViewProperties. - - :return: The x_tick_start of this MosaicViewProperties. - :rtype: float - """ # noqa: E501 - return self._x_tick_start - - @x_tick_start.setter - def x_tick_start(self, x_tick_start): - """Set the x_tick_start of this MosaicViewProperties. - - :param x_tick_start: The x_tick_start of this MosaicViewProperties. - :type: float - """ # noqa: E501 - self._x_tick_start = x_tick_start - - @property - def x_tick_step(self): - """Get the x_tick_step of this MosaicViewProperties. - - :return: The x_tick_step of this MosaicViewProperties. - :rtype: float - """ # noqa: E501 - return self._x_tick_step - - @x_tick_step.setter - def x_tick_step(self, x_tick_step): - """Set the x_tick_step of this MosaicViewProperties. - - :param x_tick_step: The x_tick_step of this MosaicViewProperties. - :type: float - """ # noqa: E501 - self._x_tick_step = x_tick_step - - @property - def y_label_column_separator(self): - """Get the y_label_column_separator of this MosaicViewProperties. - - :return: The y_label_column_separator of this MosaicViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_label_column_separator - - @y_label_column_separator.setter - def y_label_column_separator(self, y_label_column_separator): - """Set the y_label_column_separator of this MosaicViewProperties. - - :param y_label_column_separator: The y_label_column_separator of this MosaicViewProperties. - :type: str - """ # noqa: E501 - self._y_label_column_separator = y_label_column_separator - - @property - def y_label_columns(self): - """Get the y_label_columns of this MosaicViewProperties. - - :return: The y_label_columns of this MosaicViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._y_label_columns - - @y_label_columns.setter - def y_label_columns(self, y_label_columns): - """Set the y_label_columns of this MosaicViewProperties. - - :param y_label_columns: The y_label_columns of this MosaicViewProperties. - :type: list[str] - """ # noqa: E501 - self._y_label_columns = y_label_columns - - @property - def y_series_columns(self): - """Get the y_series_columns of this MosaicViewProperties. - - :return: The y_series_columns of this MosaicViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._y_series_columns - - @y_series_columns.setter - def y_series_columns(self, y_series_columns): - """Set the y_series_columns of this MosaicViewProperties. - - :param y_series_columns: The y_series_columns of this MosaicViewProperties. - :type: list[str] - """ # noqa: E501 - if y_series_columns is None: - raise ValueError("Invalid value for `y_series_columns`, must not be `None`") # noqa: E501 - self._y_series_columns = y_series_columns - - @property - def fill_columns(self): - """Get the fill_columns of this MosaicViewProperties. - - :return: The fill_columns of this MosaicViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._fill_columns - - @fill_columns.setter - def fill_columns(self, fill_columns): - """Set the fill_columns of this MosaicViewProperties. - - :param fill_columns: The fill_columns of this MosaicViewProperties. - :type: list[str] - """ # noqa: E501 - if fill_columns is None: - raise ValueError("Invalid value for `fill_columns`, must not be `None`") # noqa: E501 - self._fill_columns = fill_columns - - @property - def x_domain(self): - """Get the x_domain of this MosaicViewProperties. - - :return: The x_domain of this MosaicViewProperties. - :rtype: list[float] - """ # noqa: E501 - return self._x_domain - - @x_domain.setter - def x_domain(self, x_domain): - """Set the x_domain of this MosaicViewProperties. - - :param x_domain: The x_domain of this MosaicViewProperties. - :type: list[float] - """ # noqa: E501 - if x_domain is None: - raise ValueError("Invalid value for `x_domain`, must not be `None`") # noqa: E501 - self._x_domain = x_domain - - @property - def y_domain(self): - """Get the y_domain of this MosaicViewProperties. - - :return: The y_domain of this MosaicViewProperties. - :rtype: list[float] - """ # noqa: E501 - return self._y_domain - - @y_domain.setter - def y_domain(self, y_domain): - """Set the y_domain of this MosaicViewProperties. - - :param y_domain: The y_domain of this MosaicViewProperties. - :type: list[float] - """ # noqa: E501 - if y_domain is None: - raise ValueError("Invalid value for `y_domain`, must not be `None`") # noqa: E501 - self._y_domain = y_domain - - @property - def x_axis_label(self): - """Get the x_axis_label of this MosaicViewProperties. - - :return: The x_axis_label of this MosaicViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_axis_label - - @x_axis_label.setter - def x_axis_label(self, x_axis_label): - """Set the x_axis_label of this MosaicViewProperties. - - :param x_axis_label: The x_axis_label of this MosaicViewProperties. - :type: str - """ # noqa: E501 - if x_axis_label is None: - raise ValueError("Invalid value for `x_axis_label`, must not be `None`") # noqa: E501 - self._x_axis_label = x_axis_label - - @property - def y_axis_label(self): - """Get the y_axis_label of this MosaicViewProperties. - - :return: The y_axis_label of this MosaicViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_axis_label - - @y_axis_label.setter - def y_axis_label(self, y_axis_label): - """Set the y_axis_label of this MosaicViewProperties. - - :param y_axis_label: The y_axis_label of this MosaicViewProperties. - :type: str - """ # noqa: E501 - if y_axis_label is None: - raise ValueError("Invalid value for `y_axis_label`, must not be `None`") # noqa: E501 - self._y_axis_label = y_axis_label - - @property - def x_prefix(self): - """Get the x_prefix of this MosaicViewProperties. - - :return: The x_prefix of this MosaicViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_prefix - - @x_prefix.setter - def x_prefix(self, x_prefix): - """Set the x_prefix of this MosaicViewProperties. - - :param x_prefix: The x_prefix of this MosaicViewProperties. - :type: str - """ # noqa: E501 - if x_prefix is None: - raise ValueError("Invalid value for `x_prefix`, must not be `None`") # noqa: E501 - self._x_prefix = x_prefix - - @property - def x_suffix(self): - """Get the x_suffix of this MosaicViewProperties. - - :return: The x_suffix of this MosaicViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_suffix - - @x_suffix.setter - def x_suffix(self, x_suffix): - """Set the x_suffix of this MosaicViewProperties. - - :param x_suffix: The x_suffix of this MosaicViewProperties. - :type: str - """ # noqa: E501 - if x_suffix is None: - raise ValueError("Invalid value for `x_suffix`, must not be `None`") # noqa: E501 - self._x_suffix = x_suffix - - @property - def y_prefix(self): - """Get the y_prefix of this MosaicViewProperties. - - :return: The y_prefix of this MosaicViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_prefix - - @y_prefix.setter - def y_prefix(self, y_prefix): - """Set the y_prefix of this MosaicViewProperties. - - :param y_prefix: The y_prefix of this MosaicViewProperties. - :type: str - """ # noqa: E501 - if y_prefix is None: - raise ValueError("Invalid value for `y_prefix`, must not be `None`") # noqa: E501 - self._y_prefix = y_prefix - - @property - def y_suffix(self): - """Get the y_suffix of this MosaicViewProperties. - - :return: The y_suffix of this MosaicViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_suffix - - @y_suffix.setter - def y_suffix(self, y_suffix): - """Set the y_suffix of this MosaicViewProperties. - - :param y_suffix: The y_suffix of this MosaicViewProperties. - :type: str - """ # noqa: E501 - if y_suffix is None: - raise ValueError("Invalid value for `y_suffix`, must not be `None`") # noqa: E501 - self._y_suffix = y_suffix - - @property - def hover_dimension(self): - """Get the hover_dimension of this MosaicViewProperties. - - :return: The hover_dimension of this MosaicViewProperties. - :rtype: str - """ # noqa: E501 - return self._hover_dimension - - @hover_dimension.setter - def hover_dimension(self, hover_dimension): - """Set the hover_dimension of this MosaicViewProperties. - - :param hover_dimension: The hover_dimension of this MosaicViewProperties. - :type: str - """ # noqa: E501 - self._hover_dimension = hover_dimension - - @property - def legend_colorize_rows(self): - """Get the legend_colorize_rows of this MosaicViewProperties. - - :return: The legend_colorize_rows of this MosaicViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_colorize_rows - - @legend_colorize_rows.setter - def legend_colorize_rows(self, legend_colorize_rows): - """Set the legend_colorize_rows of this MosaicViewProperties. - - :param legend_colorize_rows: The legend_colorize_rows of this MosaicViewProperties. - :type: bool - """ # noqa: E501 - self._legend_colorize_rows = legend_colorize_rows - - @property - def legend_hide(self): - """Get the legend_hide of this MosaicViewProperties. - - :return: The legend_hide of this MosaicViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_hide - - @legend_hide.setter - def legend_hide(self, legend_hide): - """Set the legend_hide of this MosaicViewProperties. - - :param legend_hide: The legend_hide of this MosaicViewProperties. - :type: bool - """ # noqa: E501 - self._legend_hide = legend_hide - - @property - def legend_opacity(self): - """Get the legend_opacity of this MosaicViewProperties. - - :return: The legend_opacity of this MosaicViewProperties. - :rtype: float - """ # noqa: E501 - return self._legend_opacity - - @legend_opacity.setter - def legend_opacity(self, legend_opacity): - """Set the legend_opacity of this MosaicViewProperties. - - :param legend_opacity: The legend_opacity of this MosaicViewProperties. - :type: float - """ # noqa: E501 - self._legend_opacity = legend_opacity - - @property - def legend_orientation_threshold(self): - """Get the legend_orientation_threshold of this MosaicViewProperties. - - :return: The legend_orientation_threshold of this MosaicViewProperties. - :rtype: int - """ # noqa: E501 - return self._legend_orientation_threshold - - @legend_orientation_threshold.setter - def legend_orientation_threshold(self, legend_orientation_threshold): - """Set the legend_orientation_threshold of this MosaicViewProperties. - - :param legend_orientation_threshold: The legend_orientation_threshold of this MosaicViewProperties. - :type: int - """ # noqa: E501 - self._legend_orientation_threshold = legend_orientation_threshold - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, MosaicViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/node.py b/frogpilot/third_party/influxdb_client/domain/node.py deleted file mode 100644 index c254c62a4..000000000 --- a/frogpilot/third_party/influxdb_client/domain/node.py +++ /dev/null @@ -1,82 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Node(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """Node - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Node): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoint.py b/frogpilot/third_party/influxdb_client/domain/notification_endpoint.py deleted file mode 100644 index 3d0a886ed..000000000 --- a/frogpilot/third_party/influxdb_client/domain/notification_endpoint.py +++ /dev/null @@ -1,121 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class NotificationEndpoint(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'NotificationEndpointType' - } - - attribute_map = { - 'type': 'type' - } - - discriminator_value_class_map = { - 'slack': 'SlackNotificationEndpoint', - 'pagerduty': 'PagerDutyNotificationEndpoint', - 'http': 'HTTPNotificationEndpoint', - 'telegram': 'TelegramNotificationEndpoint' - } - - def __init__(self, type=None): # noqa: E501,D401,D403 - """NotificationEndpoint - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self.discriminator = 'type' - - self.type = type - - @property - def type(self): - """Get the type of this NotificationEndpoint. - - :return: The type of this NotificationEndpoint. - :rtype: NotificationEndpointType - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this NotificationEndpoint. - - :param type: The type of this NotificationEndpoint. - :type: NotificationEndpointType - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - def get_real_child_model(self, data): - """Return the real base class specified by the discriminator.""" - discriminator_key = self.attribute_map[self.discriminator] - discriminator_value = data[discriminator_key] - return self.discriminator_value_class_map.get(discriminator_value) - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, NotificationEndpoint): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_base.py b/frogpilot/third_party/influxdb_client/domain/notification_endpoint_base.py deleted file mode 100644 index 3ac9da021..000000000 --- a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_base.py +++ /dev/null @@ -1,347 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class NotificationEndpointBase(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'org_id': 'str', - 'user_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'description': 'str', - 'name': 'str', - 'status': 'str', - 'labels': 'list[Label]', - 'links': 'NotificationEndpointBaseLinks', - 'type': 'NotificationEndpointType' - } - - attribute_map = { - 'id': 'id', - 'org_id': 'orgID', - 'user_id': 'userID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'description': 'description', - 'name': 'name', - 'status': 'status', - 'labels': 'labels', - 'links': 'links', - 'type': 'type' - } - - def __init__(self, id=None, org_id=None, user_id=None, created_at=None, updated_at=None, description=None, name=None, status='active', labels=None, links=None, type=None): # noqa: E501,D401,D403 - """NotificationEndpointBase - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._org_id = None - self._user_id = None - self._created_at = None - self._updated_at = None - self._description = None - self._name = None - self._status = None - self._labels = None - self._links = None - self._type = None - self.discriminator = None - - if id is not None: - self.id = id - if org_id is not None: - self.org_id = org_id - if user_id is not None: - self.user_id = user_id - if created_at is not None: - self.created_at = created_at - if updated_at is not None: - self.updated_at = updated_at - if description is not None: - self.description = description - self.name = name - if status is not None: - self.status = status - if labels is not None: - self.labels = labels - if links is not None: - self.links = links - self.type = type - - @property - def id(self): - """Get the id of this NotificationEndpointBase. - - :return: The id of this NotificationEndpointBase. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this NotificationEndpointBase. - - :param id: The id of this NotificationEndpointBase. - :type: str - """ # noqa: E501 - self._id = id - - @property - def org_id(self): - """Get the org_id of this NotificationEndpointBase. - - :return: The org_id of this NotificationEndpointBase. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this NotificationEndpointBase. - - :param org_id: The org_id of this NotificationEndpointBase. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def user_id(self): - """Get the user_id of this NotificationEndpointBase. - - :return: The user_id of this NotificationEndpointBase. - :rtype: str - """ # noqa: E501 - return self._user_id - - @user_id.setter - def user_id(self, user_id): - """Set the user_id of this NotificationEndpointBase. - - :param user_id: The user_id of this NotificationEndpointBase. - :type: str - """ # noqa: E501 - self._user_id = user_id - - @property - def created_at(self): - """Get the created_at of this NotificationEndpointBase. - - :return: The created_at of this NotificationEndpointBase. - :rtype: datetime - """ # noqa: E501 - return self._created_at - - @created_at.setter - def created_at(self, created_at): - """Set the created_at of this NotificationEndpointBase. - - :param created_at: The created_at of this NotificationEndpointBase. - :type: datetime - """ # noqa: E501 - self._created_at = created_at - - @property - def updated_at(self): - """Get the updated_at of this NotificationEndpointBase. - - :return: The updated_at of this NotificationEndpointBase. - :rtype: datetime - """ # noqa: E501 - return self._updated_at - - @updated_at.setter - def updated_at(self, updated_at): - """Set the updated_at of this NotificationEndpointBase. - - :param updated_at: The updated_at of this NotificationEndpointBase. - :type: datetime - """ # noqa: E501 - self._updated_at = updated_at - - @property - def description(self): - """Get the description of this NotificationEndpointBase. - - An optional description of the notification endpoint. - - :return: The description of this NotificationEndpointBase. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this NotificationEndpointBase. - - An optional description of the notification endpoint. - - :param description: The description of this NotificationEndpointBase. - :type: str - """ # noqa: E501 - self._description = description - - @property - def name(self): - """Get the name of this NotificationEndpointBase. - - :return: The name of this NotificationEndpointBase. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this NotificationEndpointBase. - - :param name: The name of this NotificationEndpointBase. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def status(self): - """Get the status of this NotificationEndpointBase. - - The status of the endpoint. - - :return: The status of this NotificationEndpointBase. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this NotificationEndpointBase. - - The status of the endpoint. - - :param status: The status of this NotificationEndpointBase. - :type: str - """ # noqa: E501 - self._status = status - - @property - def labels(self): - """Get the labels of this NotificationEndpointBase. - - :return: The labels of this NotificationEndpointBase. - :rtype: list[Label] - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this NotificationEndpointBase. - - :param labels: The labels of this NotificationEndpointBase. - :type: list[Label] - """ # noqa: E501 - self._labels = labels - - @property - def links(self): - """Get the links of this NotificationEndpointBase. - - :return: The links of this NotificationEndpointBase. - :rtype: NotificationEndpointBaseLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this NotificationEndpointBase. - - :param links: The links of this NotificationEndpointBase. - :type: NotificationEndpointBaseLinks - """ # noqa: E501 - self._links = links - - @property - def type(self): - """Get the type of this NotificationEndpointBase. - - :return: The type of this NotificationEndpointBase. - :rtype: NotificationEndpointType - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this NotificationEndpointBase. - - :param type: The type of this NotificationEndpointBase. - :type: NotificationEndpointType - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, NotificationEndpointBase): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_base_links.py b/frogpilot/third_party/influxdb_client/domain/notification_endpoint_base_links.py deleted file mode 100644 index 4ff93cc7e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_base_links.py +++ /dev/null @@ -1,192 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class NotificationEndpointBaseLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str', - 'labels': 'str', - 'members': 'str', - 'owners': 'str' - } - - attribute_map = { - '_self': 'self', - 'labels': 'labels', - 'members': 'members', - 'owners': 'owners' - } - - def __init__(self, _self=None, labels=None, members=None, owners=None): # noqa: E501,D401,D403 - """NotificationEndpointBaseLinks - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self._labels = None - self._members = None - self._owners = None - self.discriminator = None - - if _self is not None: - self._self = _self - if labels is not None: - self.labels = labels - if members is not None: - self.members = members - if owners is not None: - self.owners = owners - - @property - def _self(self): - """Get the _self of this NotificationEndpointBaseLinks. - - URI of resource. - - :return: The _self of this NotificationEndpointBaseLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this NotificationEndpointBaseLinks. - - URI of resource. - - :param _self: The _self of this NotificationEndpointBaseLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - @property - def labels(self): - """Get the labels of this NotificationEndpointBaseLinks. - - URI of resource. - - :return: The labels of this NotificationEndpointBaseLinks. - :rtype: str - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this NotificationEndpointBaseLinks. - - URI of resource. - - :param labels: The labels of this NotificationEndpointBaseLinks. - :type: str - """ # noqa: E501 - self._labels = labels - - @property - def members(self): - """Get the members of this NotificationEndpointBaseLinks. - - URI of resource. - - :return: The members of this NotificationEndpointBaseLinks. - :rtype: str - """ # noqa: E501 - return self._members - - @members.setter - def members(self, members): - """Set the members of this NotificationEndpointBaseLinks. - - URI of resource. - - :param members: The members of this NotificationEndpointBaseLinks. - :type: str - """ # noqa: E501 - self._members = members - - @property - def owners(self): - """Get the owners of this NotificationEndpointBaseLinks. - - URI of resource. - - :return: The owners of this NotificationEndpointBaseLinks. - :rtype: str - """ # noqa: E501 - return self._owners - - @owners.setter - def owners(self, owners): - """Set the owners of this NotificationEndpointBaseLinks. - - URI of resource. - - :param owners: The owners of this NotificationEndpointBaseLinks. - :type: str - """ # noqa: E501 - self._owners = owners - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, NotificationEndpointBaseLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_discriminator.py b/frogpilot/third_party/influxdb_client/domain/notification_endpoint_discriminator.py deleted file mode 100644 index b285c12d4..000000000 --- a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_discriminator.py +++ /dev/null @@ -1,108 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.notification_endpoint_base import NotificationEndpointBase - - -class NotificationEndpointDiscriminator(NotificationEndpointBase): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'org_id': 'str', - 'user_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'description': 'str', - 'name': 'str', - 'status': 'str', - 'labels': 'list[Label]', - 'links': 'NotificationEndpointBaseLinks', - 'type': 'NotificationEndpointType' - } - - attribute_map = { - 'id': 'id', - 'org_id': 'orgID', - 'user_id': 'userID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'description': 'description', - 'name': 'name', - 'status': 'status', - 'labels': 'labels', - 'links': 'links', - 'type': 'type' - } - - def __init__(self, id=None, org_id=None, user_id=None, created_at=None, updated_at=None, description=None, name=None, status='active', labels=None, links=None, type=None): # noqa: E501,D401,D403 - """NotificationEndpointDiscriminator - a model defined in OpenAPI.""" # noqa: E501 - NotificationEndpointBase.__init__(self, id=id, org_id=org_id, user_id=user_id, created_at=created_at, updated_at=updated_at, description=description, name=name, status=status, labels=labels, links=links, type=type) # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, NotificationEndpointDiscriminator): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_type.py b/frogpilot/third_party/influxdb_client/domain/notification_endpoint_type.py deleted file mode 100644 index 50ae33821..000000000 --- a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_type.py +++ /dev/null @@ -1,90 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class NotificationEndpointType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - SLACK = "slack" - PAGERDUTY = "pagerduty" - HTTP = "http" - TELEGRAM = "telegram" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """NotificationEndpointType - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, NotificationEndpointType): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_update.py b/frogpilot/third_party/influxdb_client/domain/notification_endpoint_update.py deleted file mode 100644 index 4e63b1ff6..000000000 --- a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_update.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class NotificationEndpointUpdate(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'status': 'str' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'status': 'status' - } - - def __init__(self, name=None, description=None, status=None): # noqa: E501,D401,D403 - """NotificationEndpointUpdate - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._status = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - if status is not None: - self.status = status - - @property - def name(self): - """Get the name of this NotificationEndpointUpdate. - - :return: The name of this NotificationEndpointUpdate. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this NotificationEndpointUpdate. - - :param name: The name of this NotificationEndpointUpdate. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this NotificationEndpointUpdate. - - :return: The description of this NotificationEndpointUpdate. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this NotificationEndpointUpdate. - - :param description: The description of this NotificationEndpointUpdate. - :type: str - """ # noqa: E501 - self._description = description - - @property - def status(self): - """Get the status of this NotificationEndpointUpdate. - - :return: The status of this NotificationEndpointUpdate. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this NotificationEndpointUpdate. - - :param status: The status of this NotificationEndpointUpdate. - :type: str - """ # noqa: E501 - self._status = status - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, NotificationEndpointUpdate): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoints.py b/frogpilot/third_party/influxdb_client/domain/notification_endpoints.py deleted file mode 100644 index 55c2ec932..000000000 --- a/frogpilot/third_party/influxdb_client/domain/notification_endpoints.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class NotificationEndpoints(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'notification_endpoints': 'list[NotificationEndpoint]', - 'links': 'Links' - } - - attribute_map = { - 'notification_endpoints': 'notificationEndpoints', - 'links': 'links' - } - - def __init__(self, notification_endpoints=None, links=None): # noqa: E501,D401,D403 - """NotificationEndpoints - a model defined in OpenAPI.""" # noqa: E501 - self._notification_endpoints = None - self._links = None - self.discriminator = None - - if notification_endpoints is not None: - self.notification_endpoints = notification_endpoints - if links is not None: - self.links = links - - @property - def notification_endpoints(self): - """Get the notification_endpoints of this NotificationEndpoints. - - :return: The notification_endpoints of this NotificationEndpoints. - :rtype: list[NotificationEndpoint] - """ # noqa: E501 - return self._notification_endpoints - - @notification_endpoints.setter - def notification_endpoints(self, notification_endpoints): - """Set the notification_endpoints of this NotificationEndpoints. - - :param notification_endpoints: The notification_endpoints of this NotificationEndpoints. - :type: list[NotificationEndpoint] - """ # noqa: E501 - self._notification_endpoints = notification_endpoints - - @property - def links(self): - """Get the links of this NotificationEndpoints. - - :return: The links of this NotificationEndpoints. - :rtype: Links - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this NotificationEndpoints. - - :param links: The links of this NotificationEndpoints. - :type: Links - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, NotificationEndpoints): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/notification_rule.py b/frogpilot/third_party/influxdb_client/domain/notification_rule.py deleted file mode 100644 index b22e53bbe..000000000 --- a/frogpilot/third_party/influxdb_client/domain/notification_rule.py +++ /dev/null @@ -1,126 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class NotificationRule(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str' - } - - attribute_map = { - 'type': 'type' - } - - discriminator_value_class_map = { - 'slack': 'SlackNotificationRule', - 'pagerduty': 'PagerDutyNotificationRule', - 'smtp': 'SMTPNotificationRule', - 'http': 'HTTPNotificationRule', - 'telegram': 'TelegramNotificationRule' - } - - def __init__(self, type=None): # noqa: E501,D401,D403 - """NotificationRule - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self.discriminator = 'type' - - self.type = type - - @property - def type(self): - """Get the type of this NotificationRule. - - The discriminator between other types of notification rules is "telegram". - - :return: The type of this NotificationRule. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this NotificationRule. - - The discriminator between other types of notification rules is "telegram". - - :param type: The type of this NotificationRule. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - def get_real_child_model(self, data): - """Return the real base class specified by the discriminator.""" - discriminator_key = self.attribute_map[self.discriminator] - discriminator_value = data[discriminator_key] - return self.discriminator_value_class_map.get(discriminator_value) - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, NotificationRule): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/notification_rule_base.py b/frogpilot/third_party/influxdb_client/domain/notification_rule_base.py deleted file mode 100644 index 6f3de0027..000000000 --- a/frogpilot/third_party/influxdb_client/domain/notification_rule_base.py +++ /dev/null @@ -1,666 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class NotificationRuleBase(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'id': 'str', - 'endpoint_id': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'status': 'TaskStatusType', - 'name': 'str', - 'sleep_until': 'str', - 'every': 'str', - 'offset': 'str', - 'runbook_link': 'str', - 'limit_every': 'int', - 'limit': 'int', - 'tag_rules': 'list[TagRule]', - 'description': 'str', - 'status_rules': 'list[StatusRule]', - 'labels': 'list[Label]', - 'links': 'NotificationRuleBaseLinks' - } - - attribute_map = { - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'id': 'id', - 'endpoint_id': 'endpointID', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'status': 'status', - 'name': 'name', - 'sleep_until': 'sleepUntil', - 'every': 'every', - 'offset': 'offset', - 'runbook_link': 'runbookLink', - 'limit_every': 'limitEvery', - 'limit': 'limit', - 'tag_rules': 'tagRules', - 'description': 'description', - 'status_rules': 'statusRules', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, latest_completed=None, last_run_status=None, last_run_error=None, id=None, endpoint_id=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, status=None, name=None, sleep_until=None, every=None, offset=None, runbook_link=None, limit_every=None, limit=None, tag_rules=None, description=None, status_rules=None, labels=None, links=None): # noqa: E501,D401,D403 - """NotificationRuleBase - a model defined in OpenAPI.""" # noqa: E501 - self._latest_completed = None - self._last_run_status = None - self._last_run_error = None - self._id = None - self._endpoint_id = None - self._org_id = None - self._task_id = None - self._owner_id = None - self._created_at = None - self._updated_at = None - self._status = None - self._name = None - self._sleep_until = None - self._every = None - self._offset = None - self._runbook_link = None - self._limit_every = None - self._limit = None - self._tag_rules = None - self._description = None - self._status_rules = None - self._labels = None - self._links = None - self.discriminator = None - - if latest_completed is not None: - self.latest_completed = latest_completed - if last_run_status is not None: - self.last_run_status = last_run_status - if last_run_error is not None: - self.last_run_error = last_run_error - if id is not None: - self.id = id - self.endpoint_id = endpoint_id - self.org_id = org_id - if task_id is not None: - self.task_id = task_id - if owner_id is not None: - self.owner_id = owner_id - if created_at is not None: - self.created_at = created_at - if updated_at is not None: - self.updated_at = updated_at - self.status = status - self.name = name - if sleep_until is not None: - self.sleep_until = sleep_until - if every is not None: - self.every = every - if offset is not None: - self.offset = offset - if runbook_link is not None: - self.runbook_link = runbook_link - if limit_every is not None: - self.limit_every = limit_every - if limit is not None: - self.limit = limit - if tag_rules is not None: - self.tag_rules = tag_rules - if description is not None: - self.description = description - self.status_rules = status_rules - if labels is not None: - self.labels = labels - if links is not None: - self.links = links - - @property - def latest_completed(self): - """Get the latest_completed of this NotificationRuleBase. - - A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)) of the latest scheduled and completed run. - - :return: The latest_completed of this NotificationRuleBase. - :rtype: datetime - """ # noqa: E501 - return self._latest_completed - - @latest_completed.setter - def latest_completed(self, latest_completed): - """Set the latest_completed of this NotificationRuleBase. - - A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)) of the latest scheduled and completed run. - - :param latest_completed: The latest_completed of this NotificationRuleBase. - :type: datetime - """ # noqa: E501 - self._latest_completed = latest_completed - - @property - def last_run_status(self): - """Get the last_run_status of this NotificationRuleBase. - - :return: The last_run_status of this NotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._last_run_status - - @last_run_status.setter - def last_run_status(self, last_run_status): - """Set the last_run_status of this NotificationRuleBase. - - :param last_run_status: The last_run_status of this NotificationRuleBase. - :type: str - """ # noqa: E501 - self._last_run_status = last_run_status - - @property - def last_run_error(self): - """Get the last_run_error of this NotificationRuleBase. - - :return: The last_run_error of this NotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._last_run_error - - @last_run_error.setter - def last_run_error(self, last_run_error): - """Set the last_run_error of this NotificationRuleBase. - - :param last_run_error: The last_run_error of this NotificationRuleBase. - :type: str - """ # noqa: E501 - self._last_run_error = last_run_error - - @property - def id(self): - """Get the id of this NotificationRuleBase. - - :return: The id of this NotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this NotificationRuleBase. - - :param id: The id of this NotificationRuleBase. - :type: str - """ # noqa: E501 - self._id = id - - @property - def endpoint_id(self): - """Get the endpoint_id of this NotificationRuleBase. - - :return: The endpoint_id of this NotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._endpoint_id - - @endpoint_id.setter - def endpoint_id(self, endpoint_id): - """Set the endpoint_id of this NotificationRuleBase. - - :param endpoint_id: The endpoint_id of this NotificationRuleBase. - :type: str - """ # noqa: E501 - if endpoint_id is None: - raise ValueError("Invalid value for `endpoint_id`, must not be `None`") # noqa: E501 - self._endpoint_id = endpoint_id - - @property - def org_id(self): - """Get the org_id of this NotificationRuleBase. - - The ID of the organization that owns this notification rule. - - :return: The org_id of this NotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this NotificationRuleBase. - - The ID of the organization that owns this notification rule. - - :param org_id: The org_id of this NotificationRuleBase. - :type: str - """ # noqa: E501 - if org_id is None: - raise ValueError("Invalid value for `org_id`, must not be `None`") # noqa: E501 - self._org_id = org_id - - @property - def task_id(self): - """Get the task_id of this NotificationRuleBase. - - The ID of the task associated with this notification rule. - - :return: The task_id of this NotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._task_id - - @task_id.setter - def task_id(self, task_id): - """Set the task_id of this NotificationRuleBase. - - The ID of the task associated with this notification rule. - - :param task_id: The task_id of this NotificationRuleBase. - :type: str - """ # noqa: E501 - self._task_id = task_id - - @property - def owner_id(self): - """Get the owner_id of this NotificationRuleBase. - - The ID of creator used to create this notification rule. - - :return: The owner_id of this NotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._owner_id - - @owner_id.setter - def owner_id(self, owner_id): - """Set the owner_id of this NotificationRuleBase. - - The ID of creator used to create this notification rule. - - :param owner_id: The owner_id of this NotificationRuleBase. - :type: str - """ # noqa: E501 - self._owner_id = owner_id - - @property - def created_at(self): - """Get the created_at of this NotificationRuleBase. - - :return: The created_at of this NotificationRuleBase. - :rtype: datetime - """ # noqa: E501 - return self._created_at - - @created_at.setter - def created_at(self, created_at): - """Set the created_at of this NotificationRuleBase. - - :param created_at: The created_at of this NotificationRuleBase. - :type: datetime - """ # noqa: E501 - self._created_at = created_at - - @property - def updated_at(self): - """Get the updated_at of this NotificationRuleBase. - - :return: The updated_at of this NotificationRuleBase. - :rtype: datetime - """ # noqa: E501 - return self._updated_at - - @updated_at.setter - def updated_at(self, updated_at): - """Set the updated_at of this NotificationRuleBase. - - :param updated_at: The updated_at of this NotificationRuleBase. - :type: datetime - """ # noqa: E501 - self._updated_at = updated_at - - @property - def status(self): - """Get the status of this NotificationRuleBase. - - :return: The status of this NotificationRuleBase. - :rtype: TaskStatusType - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this NotificationRuleBase. - - :param status: The status of this NotificationRuleBase. - :type: TaskStatusType - """ # noqa: E501 - if status is None: - raise ValueError("Invalid value for `status`, must not be `None`") # noqa: E501 - self._status = status - - @property - def name(self): - """Get the name of this NotificationRuleBase. - - Human-readable name describing the notification rule. - - :return: The name of this NotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this NotificationRuleBase. - - Human-readable name describing the notification rule. - - :param name: The name of this NotificationRuleBase. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def sleep_until(self): - """Get the sleep_until of this NotificationRuleBase. - - :return: The sleep_until of this NotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._sleep_until - - @sleep_until.setter - def sleep_until(self, sleep_until): - """Set the sleep_until of this NotificationRuleBase. - - :param sleep_until: The sleep_until of this NotificationRuleBase. - :type: str - """ # noqa: E501 - self._sleep_until = sleep_until - - @property - def every(self): - """Get the every of this NotificationRuleBase. - - The notification repetition interval. - - :return: The every of this NotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._every - - @every.setter - def every(self, every): - """Set the every of this NotificationRuleBase. - - The notification repetition interval. - - :param every: The every of this NotificationRuleBase. - :type: str - """ # noqa: E501 - self._every = every - - @property - def offset(self): - """Get the offset of this NotificationRuleBase. - - Duration to delay after the schedule, before executing check. - - :return: The offset of this NotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._offset - - @offset.setter - def offset(self, offset): - """Set the offset of this NotificationRuleBase. - - Duration to delay after the schedule, before executing check. - - :param offset: The offset of this NotificationRuleBase. - :type: str - """ # noqa: E501 - self._offset = offset - - @property - def runbook_link(self): - """Get the runbook_link of this NotificationRuleBase. - - :return: The runbook_link of this NotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._runbook_link - - @runbook_link.setter - def runbook_link(self, runbook_link): - """Set the runbook_link of this NotificationRuleBase. - - :param runbook_link: The runbook_link of this NotificationRuleBase. - :type: str - """ # noqa: E501 - self._runbook_link = runbook_link - - @property - def limit_every(self): - """Get the limit_every of this NotificationRuleBase. - - Don't notify me more than times every seconds. If set, limit cannot be empty. - - :return: The limit_every of this NotificationRuleBase. - :rtype: int - """ # noqa: E501 - return self._limit_every - - @limit_every.setter - def limit_every(self, limit_every): - """Set the limit_every of this NotificationRuleBase. - - Don't notify me more than times every seconds. If set, limit cannot be empty. - - :param limit_every: The limit_every of this NotificationRuleBase. - :type: int - """ # noqa: E501 - self._limit_every = limit_every - - @property - def limit(self): - """Get the limit of this NotificationRuleBase. - - Don't notify me more than times every seconds. If set, limitEvery cannot be empty. - - :return: The limit of this NotificationRuleBase. - :rtype: int - """ # noqa: E501 - return self._limit - - @limit.setter - def limit(self, limit): - """Set the limit of this NotificationRuleBase. - - Don't notify me more than times every seconds. If set, limitEvery cannot be empty. - - :param limit: The limit of this NotificationRuleBase. - :type: int - """ # noqa: E501 - self._limit = limit - - @property - def tag_rules(self): - """Get the tag_rules of this NotificationRuleBase. - - List of tag rules the notification rule attempts to match. - - :return: The tag_rules of this NotificationRuleBase. - :rtype: list[TagRule] - """ # noqa: E501 - return self._tag_rules - - @tag_rules.setter - def tag_rules(self, tag_rules): - """Set the tag_rules of this NotificationRuleBase. - - List of tag rules the notification rule attempts to match. - - :param tag_rules: The tag_rules of this NotificationRuleBase. - :type: list[TagRule] - """ # noqa: E501 - self._tag_rules = tag_rules - - @property - def description(self): - """Get the description of this NotificationRuleBase. - - An optional description of the notification rule. - - :return: The description of this NotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this NotificationRuleBase. - - An optional description of the notification rule. - - :param description: The description of this NotificationRuleBase. - :type: str - """ # noqa: E501 - self._description = description - - @property - def status_rules(self): - """Get the status_rules of this NotificationRuleBase. - - List of status rules the notification rule attempts to match. - - :return: The status_rules of this NotificationRuleBase. - :rtype: list[StatusRule] - """ # noqa: E501 - return self._status_rules - - @status_rules.setter - def status_rules(self, status_rules): - """Set the status_rules of this NotificationRuleBase. - - List of status rules the notification rule attempts to match. - - :param status_rules: The status_rules of this NotificationRuleBase. - :type: list[StatusRule] - """ # noqa: E501 - if status_rules is None: - raise ValueError("Invalid value for `status_rules`, must not be `None`") # noqa: E501 - self._status_rules = status_rules - - @property - def labels(self): - """Get the labels of this NotificationRuleBase. - - :return: The labels of this NotificationRuleBase. - :rtype: list[Label] - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this NotificationRuleBase. - - :param labels: The labels of this NotificationRuleBase. - :type: list[Label] - """ # noqa: E501 - self._labels = labels - - @property - def links(self): - """Get the links of this NotificationRuleBase. - - :return: The links of this NotificationRuleBase. - :rtype: NotificationRuleBaseLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this NotificationRuleBase. - - :param links: The links of this NotificationRuleBase. - :type: NotificationRuleBaseLinks - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, NotificationRuleBase): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/notification_rule_base_links.py b/frogpilot/third_party/influxdb_client/domain/notification_rule_base_links.py deleted file mode 100644 index 2f6e1c259..000000000 --- a/frogpilot/third_party/influxdb_client/domain/notification_rule_base_links.py +++ /dev/null @@ -1,219 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class NotificationRuleBaseLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str', - 'labels': 'str', - 'members': 'str', - 'owners': 'str', - 'query': 'str' - } - - attribute_map = { - '_self': 'self', - 'labels': 'labels', - 'members': 'members', - 'owners': 'owners', - 'query': 'query' - } - - def __init__(self, _self=None, labels=None, members=None, owners=None, query=None): # noqa: E501,D401,D403 - """NotificationRuleBaseLinks - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self._labels = None - self._members = None - self._owners = None - self._query = None - self.discriminator = None - - if _self is not None: - self._self = _self - if labels is not None: - self.labels = labels - if members is not None: - self.members = members - if owners is not None: - self.owners = owners - if query is not None: - self.query = query - - @property - def _self(self): - """Get the _self of this NotificationRuleBaseLinks. - - URI of resource. - - :return: The _self of this NotificationRuleBaseLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this NotificationRuleBaseLinks. - - URI of resource. - - :param _self: The _self of this NotificationRuleBaseLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - @property - def labels(self): - """Get the labels of this NotificationRuleBaseLinks. - - URI of resource. - - :return: The labels of this NotificationRuleBaseLinks. - :rtype: str - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this NotificationRuleBaseLinks. - - URI of resource. - - :param labels: The labels of this NotificationRuleBaseLinks. - :type: str - """ # noqa: E501 - self._labels = labels - - @property - def members(self): - """Get the members of this NotificationRuleBaseLinks. - - URI of resource. - - :return: The members of this NotificationRuleBaseLinks. - :rtype: str - """ # noqa: E501 - return self._members - - @members.setter - def members(self, members): - """Set the members of this NotificationRuleBaseLinks. - - URI of resource. - - :param members: The members of this NotificationRuleBaseLinks. - :type: str - """ # noqa: E501 - self._members = members - - @property - def owners(self): - """Get the owners of this NotificationRuleBaseLinks. - - URI of resource. - - :return: The owners of this NotificationRuleBaseLinks. - :rtype: str - """ # noqa: E501 - return self._owners - - @owners.setter - def owners(self, owners): - """Set the owners of this NotificationRuleBaseLinks. - - URI of resource. - - :param owners: The owners of this NotificationRuleBaseLinks. - :type: str - """ # noqa: E501 - self._owners = owners - - @property - def query(self): - """Get the query of this NotificationRuleBaseLinks. - - URI of resource. - - :return: The query of this NotificationRuleBaseLinks. - :rtype: str - """ # noqa: E501 - return self._query - - @query.setter - def query(self, query): - """Set the query of this NotificationRuleBaseLinks. - - URI of resource. - - :param query: The query of this NotificationRuleBaseLinks. - :type: str - """ # noqa: E501 - self._query = query - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, NotificationRuleBaseLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/notification_rule_discriminator.py b/frogpilot/third_party/influxdb_client/domain/notification_rule_discriminator.py deleted file mode 100644 index a677fa523..000000000 --- a/frogpilot/third_party/influxdb_client/domain/notification_rule_discriminator.py +++ /dev/null @@ -1,132 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.notification_rule_base import NotificationRuleBase - - -class NotificationRuleDiscriminator(NotificationRuleBase): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'id': 'str', - 'endpoint_id': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'status': 'TaskStatusType', - 'name': 'str', - 'sleep_until': 'str', - 'every': 'str', - 'offset': 'str', - 'runbook_link': 'str', - 'limit_every': 'int', - 'limit': 'int', - 'tag_rules': 'list[TagRule]', - 'description': 'str', - 'status_rules': 'list[StatusRule]', - 'labels': 'list[Label]', - 'links': 'NotificationRuleBaseLinks' - } - - attribute_map = { - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'id': 'id', - 'endpoint_id': 'endpointID', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'status': 'status', - 'name': 'name', - 'sleep_until': 'sleepUntil', - 'every': 'every', - 'offset': 'offset', - 'runbook_link': 'runbookLink', - 'limit_every': 'limitEvery', - 'limit': 'limit', - 'tag_rules': 'tagRules', - 'description': 'description', - 'status_rules': 'statusRules', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, latest_completed=None, last_run_status=None, last_run_error=None, id=None, endpoint_id=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, status=None, name=None, sleep_until=None, every=None, offset=None, runbook_link=None, limit_every=None, limit=None, tag_rules=None, description=None, status_rules=None, labels=None, links=None): # noqa: E501,D401,D403 - """NotificationRuleDiscriminator - a model defined in OpenAPI.""" # noqa: E501 - NotificationRuleBase.__init__(self, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, id=id, endpoint_id=endpoint_id, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, status=status, name=name, sleep_until=sleep_until, every=every, offset=offset, runbook_link=runbook_link, limit_every=limit_every, limit=limit, tag_rules=tag_rules, description=description, status_rules=status_rules, labels=labels, links=links) # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, NotificationRuleDiscriminator): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/notification_rule_update.py b/frogpilot/third_party/influxdb_client/domain/notification_rule_update.py deleted file mode 100644 index a8e9fa1fc..000000000 --- a/frogpilot/third_party/influxdb_client/domain/notification_rule_update.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class NotificationRuleUpdate(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'status': 'str' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'status': 'status' - } - - def __init__(self, name=None, description=None, status=None): # noqa: E501,D401,D403 - """NotificationRuleUpdate - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._status = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - if status is not None: - self.status = status - - @property - def name(self): - """Get the name of this NotificationRuleUpdate. - - :return: The name of this NotificationRuleUpdate. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this NotificationRuleUpdate. - - :param name: The name of this NotificationRuleUpdate. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this NotificationRuleUpdate. - - :return: The description of this NotificationRuleUpdate. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this NotificationRuleUpdate. - - :param description: The description of this NotificationRuleUpdate. - :type: str - """ # noqa: E501 - self._description = description - - @property - def status(self): - """Get the status of this NotificationRuleUpdate. - - :return: The status of this NotificationRuleUpdate. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this NotificationRuleUpdate. - - :param status: The status of this NotificationRuleUpdate. - :type: str - """ # noqa: E501 - self._status = status - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, NotificationRuleUpdate): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/notification_rules.py b/frogpilot/third_party/influxdb_client/domain/notification_rules.py deleted file mode 100644 index 08eaf6d80..000000000 --- a/frogpilot/third_party/influxdb_client/domain/notification_rules.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class NotificationRules(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'notification_rules': 'list[NotificationRule]', - 'links': 'Links' - } - - attribute_map = { - 'notification_rules': 'notificationRules', - 'links': 'links' - } - - def __init__(self, notification_rules=None, links=None): # noqa: E501,D401,D403 - """NotificationRules - a model defined in OpenAPI.""" # noqa: E501 - self._notification_rules = None - self._links = None - self.discriminator = None - - if notification_rules is not None: - self.notification_rules = notification_rules - if links is not None: - self.links = links - - @property - def notification_rules(self): - """Get the notification_rules of this NotificationRules. - - :return: The notification_rules of this NotificationRules. - :rtype: list[NotificationRule] - """ # noqa: E501 - return self._notification_rules - - @notification_rules.setter - def notification_rules(self, notification_rules): - """Set the notification_rules of this NotificationRules. - - :param notification_rules: The notification_rules of this NotificationRules. - :type: list[NotificationRule] - """ # noqa: E501 - self._notification_rules = notification_rules - - @property - def links(self): - """Get the links of this NotificationRules. - - :return: The links of this NotificationRules. - :rtype: Links - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this NotificationRules. - - :param links: The links of this NotificationRules. - :type: Links - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, NotificationRules): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/object_expression.py b/frogpilot/third_party/influxdb_client/domain/object_expression.py deleted file mode 100644 index 05ca2a058..000000000 --- a/frogpilot/third_party/influxdb_client/domain/object_expression.py +++ /dev/null @@ -1,142 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class ObjectExpression(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'properties': 'list[ModelProperty]' - } - - attribute_map = { - 'type': 'type', - 'properties': 'properties' - } - - def __init__(self, type=None, properties=None): # noqa: E501,D401,D403 - """ObjectExpression - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._properties = None - self.discriminator = None - - if type is not None: - self.type = type - if properties is not None: - self.properties = properties - - @property - def type(self): - """Get the type of this ObjectExpression. - - Type of AST node - - :return: The type of this ObjectExpression. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this ObjectExpression. - - Type of AST node - - :param type: The type of this ObjectExpression. - :type: str - """ # noqa: E501 - self._type = type - - @property - def properties(self): - """Get the properties of this ObjectExpression. - - Object properties - - :return: The properties of this ObjectExpression. - :rtype: list[ModelProperty] - """ # noqa: E501 - return self._properties - - @properties.setter - def properties(self, properties): - """Set the properties of this ObjectExpression. - - Object properties - - :param properties: The properties of this ObjectExpression. - :type: list[ModelProperty] - """ # noqa: E501 - self._properties = properties - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ObjectExpression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/onboarding_request.py b/frogpilot/third_party/influxdb_client/domain/onboarding_request.py deleted file mode 100644 index 7ca4bf0ca..000000000 --- a/frogpilot/third_party/influxdb_client/domain/onboarding_request.py +++ /dev/null @@ -1,256 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class OnboardingRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'username': 'str', - 'password': 'str', - 'org': 'str', - 'bucket': 'str', - 'retention_period_seconds': 'int', - 'retention_period_hrs': 'int', - 'token': 'str' - } - - attribute_map = { - 'username': 'username', - 'password': 'password', - 'org': 'org', - 'bucket': 'bucket', - 'retention_period_seconds': 'retentionPeriodSeconds', - 'retention_period_hrs': 'retentionPeriodHrs', - 'token': 'token' - } - - def __init__(self, username=None, password=None, org=None, bucket=None, retention_period_seconds=None, retention_period_hrs=None, token=None): # noqa: E501,D401,D403 - """OnboardingRequest - a model defined in OpenAPI.""" # noqa: E501 - self._username = None - self._password = None - self._org = None - self._bucket = None - self._retention_period_seconds = None - self._retention_period_hrs = None - self._token = None - self.discriminator = None - - self.username = username - if password is not None: - self.password = password - self.org = org - self.bucket = bucket - if retention_period_seconds is not None: - self.retention_period_seconds = retention_period_seconds - if retention_period_hrs is not None: - self.retention_period_hrs = retention_period_hrs - if token is not None: - self.token = token - - @property - def username(self): - """Get the username of this OnboardingRequest. - - :return: The username of this OnboardingRequest. - :rtype: str - """ # noqa: E501 - return self._username - - @username.setter - def username(self, username): - """Set the username of this OnboardingRequest. - - :param username: The username of this OnboardingRequest. - :type: str - """ # noqa: E501 - if username is None: - raise ValueError("Invalid value for `username`, must not be `None`") # noqa: E501 - self._username = username - - @property - def password(self): - """Get the password of this OnboardingRequest. - - :return: The password of this OnboardingRequest. - :rtype: str - """ # noqa: E501 - return self._password - - @password.setter - def password(self, password): - """Set the password of this OnboardingRequest. - - :param password: The password of this OnboardingRequest. - :type: str - """ # noqa: E501 - self._password = password - - @property - def org(self): - """Get the org of this OnboardingRequest. - - :return: The org of this OnboardingRequest. - :rtype: str - """ # noqa: E501 - return self._org - - @org.setter - def org(self, org): - """Set the org of this OnboardingRequest. - - :param org: The org of this OnboardingRequest. - :type: str - """ # noqa: E501 - if org is None: - raise ValueError("Invalid value for `org`, must not be `None`") # noqa: E501 - self._org = org - - @property - def bucket(self): - """Get the bucket of this OnboardingRequest. - - :return: The bucket of this OnboardingRequest. - :rtype: str - """ # noqa: E501 - return self._bucket - - @bucket.setter - def bucket(self, bucket): - """Set the bucket of this OnboardingRequest. - - :param bucket: The bucket of this OnboardingRequest. - :type: str - """ # noqa: E501 - if bucket is None: - raise ValueError("Invalid value for `bucket`, must not be `None`") # noqa: E501 - self._bucket = bucket - - @property - def retention_period_seconds(self): - """Get the retention_period_seconds of this OnboardingRequest. - - :return: The retention_period_seconds of this OnboardingRequest. - :rtype: int - """ # noqa: E501 - return self._retention_period_seconds - - @retention_period_seconds.setter - def retention_period_seconds(self, retention_period_seconds): - """Set the retention_period_seconds of this OnboardingRequest. - - :param retention_period_seconds: The retention_period_seconds of this OnboardingRequest. - :type: int - """ # noqa: E501 - self._retention_period_seconds = retention_period_seconds - - @property - def retention_period_hrs(self): - """Get the retention_period_hrs of this OnboardingRequest. - - Retention period *in nanoseconds* for the new bucket. This key's name has been misleading since OSS 2.0 GA, please transition to use `retentionPeriodSeconds` - - :return: The retention_period_hrs of this OnboardingRequest. - :rtype: int - """ # noqa: E501 - return self._retention_period_hrs - - @retention_period_hrs.setter - def retention_period_hrs(self, retention_period_hrs): - """Set the retention_period_hrs of this OnboardingRequest. - - Retention period *in nanoseconds* for the new bucket. This key's name has been misleading since OSS 2.0 GA, please transition to use `retentionPeriodSeconds` - - :param retention_period_hrs: The retention_period_hrs of this OnboardingRequest. - :type: int - """ # noqa: E501 - self._retention_period_hrs = retention_period_hrs - - @property - def token(self): - """Get the token of this OnboardingRequest. - - Authentication token to set on the initial user. If not specified, the server will generate a token. - - :return: The token of this OnboardingRequest. - :rtype: str - """ # noqa: E501 - return self._token - - @token.setter - def token(self, token): - """Set the token of this OnboardingRequest. - - Authentication token to set on the initial user. If not specified, the server will generate a token. - - :param token: The token of this OnboardingRequest. - :type: str - """ # noqa: E501 - self._token = token - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, OnboardingRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/onboarding_response.py b/frogpilot/third_party/influxdb_client/domain/onboarding_response.py deleted file mode 100644 index 62db52f5f..000000000 --- a/frogpilot/third_party/influxdb_client/domain/onboarding_response.py +++ /dev/null @@ -1,176 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class OnboardingResponse(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'user': 'UserResponse', - 'org': 'Organization', - 'bucket': 'Bucket', - 'auth': 'Authorization' - } - - attribute_map = { - 'user': 'user', - 'org': 'org', - 'bucket': 'bucket', - 'auth': 'auth' - } - - def __init__(self, user=None, org=None, bucket=None, auth=None): # noqa: E501,D401,D403 - """OnboardingResponse - a model defined in OpenAPI.""" # noqa: E501 - self._user = None - self._org = None - self._bucket = None - self._auth = None - self.discriminator = None - - if user is not None: - self.user = user - if org is not None: - self.org = org - if bucket is not None: - self.bucket = bucket - if auth is not None: - self.auth = auth - - @property - def user(self): - """Get the user of this OnboardingResponse. - - :return: The user of this OnboardingResponse. - :rtype: UserResponse - """ # noqa: E501 - return self._user - - @user.setter - def user(self, user): - """Set the user of this OnboardingResponse. - - :param user: The user of this OnboardingResponse. - :type: UserResponse - """ # noqa: E501 - self._user = user - - @property - def org(self): - """Get the org of this OnboardingResponse. - - :return: The org of this OnboardingResponse. - :rtype: Organization - """ # noqa: E501 - return self._org - - @org.setter - def org(self, org): - """Set the org of this OnboardingResponse. - - :param org: The org of this OnboardingResponse. - :type: Organization - """ # noqa: E501 - self._org = org - - @property - def bucket(self): - """Get the bucket of this OnboardingResponse. - - :return: The bucket of this OnboardingResponse. - :rtype: Bucket - """ # noqa: E501 - return self._bucket - - @bucket.setter - def bucket(self, bucket): - """Set the bucket of this OnboardingResponse. - - :param bucket: The bucket of this OnboardingResponse. - :type: Bucket - """ # noqa: E501 - self._bucket = bucket - - @property - def auth(self): - """Get the auth of this OnboardingResponse. - - :return: The auth of this OnboardingResponse. - :rtype: Authorization - """ # noqa: E501 - return self._auth - - @auth.setter - def auth(self, auth): - """Set the auth of this OnboardingResponse. - - :param auth: The auth of this OnboardingResponse. - :type: Authorization - """ # noqa: E501 - self._auth = auth - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, OnboardingResponse): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/option_statement.py b/frogpilot/third_party/influxdb_client/domain/option_statement.py deleted file mode 100644 index 4ab156998..000000000 --- a/frogpilot/third_party/influxdb_client/domain/option_statement.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.statement import Statement - - -class OptionStatement(Statement): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'assignment': 'object' - } - - attribute_map = { - 'type': 'type', - 'assignment': 'assignment' - } - - def __init__(self, type=None, assignment=None): # noqa: E501,D401,D403 - """OptionStatement - a model defined in OpenAPI.""" # noqa: E501 - Statement.__init__(self) # noqa: E501 - - self._type = None - self._assignment = None - self.discriminator = None - - if type is not None: - self.type = type - if assignment is not None: - self.assignment = assignment - - @property - def type(self): - """Get the type of this OptionStatement. - - Type of AST node - - :return: The type of this OptionStatement. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this OptionStatement. - - Type of AST node - - :param type: The type of this OptionStatement. - :type: str - """ # noqa: E501 - self._type = type - - @property - def assignment(self): - """Get the assignment of this OptionStatement. - - :return: The assignment of this OptionStatement. - :rtype: object - """ # noqa: E501 - return self._assignment - - @assignment.setter - def assignment(self, assignment): - """Set the assignment of this OptionStatement. - - :param assignment: The assignment of this OptionStatement. - :type: object - """ # noqa: E501 - self._assignment = assignment - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, OptionStatement): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/organization.py b/frogpilot/third_party/influxdb_client/domain/organization.py deleted file mode 100644 index 4071964c1..000000000 --- a/frogpilot/third_party/influxdb_client/domain/organization.py +++ /dev/null @@ -1,277 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Organization(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'OrganizationLinks', - 'id': 'str', - 'name': 'str', - 'default_storage_type': 'str', - 'description': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'status': 'str' - } - - attribute_map = { - 'links': 'links', - 'id': 'id', - 'name': 'name', - 'default_storage_type': 'defaultStorageType', - 'description': 'description', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'status': 'status' - } - - def __init__(self, links=None, id=None, name=None, default_storage_type=None, description=None, created_at=None, updated_at=None, status='active'): # noqa: E501,D401,D403 - """Organization - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._id = None - self._name = None - self._default_storage_type = None - self._description = None - self._created_at = None - self._updated_at = None - self._status = None - self.discriminator = None - - if links is not None: - self.links = links - if id is not None: - self.id = id - self.name = name - if default_storage_type is not None: - self.default_storage_type = default_storage_type - if description is not None: - self.description = description - if created_at is not None: - self.created_at = created_at - if updated_at is not None: - self.updated_at = updated_at - if status is not None: - self.status = status - - @property - def links(self): - """Get the links of this Organization. - - :return: The links of this Organization. - :rtype: OrganizationLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Organization. - - :param links: The links of this Organization. - :type: OrganizationLinks - """ # noqa: E501 - self._links = links - - @property - def id(self): - """Get the id of this Organization. - - :return: The id of this Organization. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Organization. - - :param id: The id of this Organization. - :type: str - """ # noqa: E501 - self._id = id - - @property - def name(self): - """Get the name of this Organization. - - :return: The name of this Organization. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this Organization. - - :param name: The name of this Organization. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def default_storage_type(self): - """Get the default_storage_type of this Organization. - - Discloses whether the organization uses TSM or IOx. - - :return: The default_storage_type of this Organization. - :rtype: str - """ # noqa: E501 - return self._default_storage_type - - @default_storage_type.setter - def default_storage_type(self, default_storage_type): - """Set the default_storage_type of this Organization. - - Discloses whether the organization uses TSM or IOx. - - :param default_storage_type: The default_storage_type of this Organization. - :type: str - """ # noqa: E501 - self._default_storage_type = default_storage_type - - @property - def description(self): - """Get the description of this Organization. - - :return: The description of this Organization. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this Organization. - - :param description: The description of this Organization. - :type: str - """ # noqa: E501 - self._description = description - - @property - def created_at(self): - """Get the created_at of this Organization. - - :return: The created_at of this Organization. - :rtype: datetime - """ # noqa: E501 - return self._created_at - - @created_at.setter - def created_at(self, created_at): - """Set the created_at of this Organization. - - :param created_at: The created_at of this Organization. - :type: datetime - """ # noqa: E501 - self._created_at = created_at - - @property - def updated_at(self): - """Get the updated_at of this Organization. - - :return: The updated_at of this Organization. - :rtype: datetime - """ # noqa: E501 - return self._updated_at - - @updated_at.setter - def updated_at(self, updated_at): - """Set the updated_at of this Organization. - - :param updated_at: The updated_at of this Organization. - :type: datetime - """ # noqa: E501 - self._updated_at = updated_at - - @property - def status(self): - """Get the status of this Organization. - - If inactive, the organization is inactive. - - :return: The status of this Organization. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this Organization. - - If inactive, the organization is inactive. - - :param status: The status of this Organization. - :type: str - """ # noqa: E501 - self._status = status - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Organization): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/organization_links.py b/frogpilot/third_party/influxdb_client/domain/organization_links.py deleted file mode 100644 index a2cca0424..000000000 --- a/frogpilot/third_party/influxdb_client/domain/organization_links.py +++ /dev/null @@ -1,300 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class OrganizationLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str', - 'members': 'str', - 'owners': 'str', - 'labels': 'str', - 'secrets': 'str', - 'buckets': 'str', - 'tasks': 'str', - 'dashboards': 'str' - } - - attribute_map = { - '_self': 'self', - 'members': 'members', - 'owners': 'owners', - 'labels': 'labels', - 'secrets': 'secrets', - 'buckets': 'buckets', - 'tasks': 'tasks', - 'dashboards': 'dashboards' - } - - def __init__(self, _self=None, members=None, owners=None, labels=None, secrets=None, buckets=None, tasks=None, dashboards=None): # noqa: E501,D401,D403 - """OrganizationLinks - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self._members = None - self._owners = None - self._labels = None - self._secrets = None - self._buckets = None - self._tasks = None - self._dashboards = None - self.discriminator = None - - if _self is not None: - self._self = _self - if members is not None: - self.members = members - if owners is not None: - self.owners = owners - if labels is not None: - self.labels = labels - if secrets is not None: - self.secrets = secrets - if buckets is not None: - self.buckets = buckets - if tasks is not None: - self.tasks = tasks - if dashboards is not None: - self.dashboards = dashboards - - @property - def _self(self): - """Get the _self of this OrganizationLinks. - - URI of resource. - - :return: The _self of this OrganizationLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this OrganizationLinks. - - URI of resource. - - :param _self: The _self of this OrganizationLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - @property - def members(self): - """Get the members of this OrganizationLinks. - - URI of resource. - - :return: The members of this OrganizationLinks. - :rtype: str - """ # noqa: E501 - return self._members - - @members.setter - def members(self, members): - """Set the members of this OrganizationLinks. - - URI of resource. - - :param members: The members of this OrganizationLinks. - :type: str - """ # noqa: E501 - self._members = members - - @property - def owners(self): - """Get the owners of this OrganizationLinks. - - URI of resource. - - :return: The owners of this OrganizationLinks. - :rtype: str - """ # noqa: E501 - return self._owners - - @owners.setter - def owners(self, owners): - """Set the owners of this OrganizationLinks. - - URI of resource. - - :param owners: The owners of this OrganizationLinks. - :type: str - """ # noqa: E501 - self._owners = owners - - @property - def labels(self): - """Get the labels of this OrganizationLinks. - - URI of resource. - - :return: The labels of this OrganizationLinks. - :rtype: str - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this OrganizationLinks. - - URI of resource. - - :param labels: The labels of this OrganizationLinks. - :type: str - """ # noqa: E501 - self._labels = labels - - @property - def secrets(self): - """Get the secrets of this OrganizationLinks. - - URI of resource. - - :return: The secrets of this OrganizationLinks. - :rtype: str - """ # noqa: E501 - return self._secrets - - @secrets.setter - def secrets(self, secrets): - """Set the secrets of this OrganizationLinks. - - URI of resource. - - :param secrets: The secrets of this OrganizationLinks. - :type: str - """ # noqa: E501 - self._secrets = secrets - - @property - def buckets(self): - """Get the buckets of this OrganizationLinks. - - URI of resource. - - :return: The buckets of this OrganizationLinks. - :rtype: str - """ # noqa: E501 - return self._buckets - - @buckets.setter - def buckets(self, buckets): - """Set the buckets of this OrganizationLinks. - - URI of resource. - - :param buckets: The buckets of this OrganizationLinks. - :type: str - """ # noqa: E501 - self._buckets = buckets - - @property - def tasks(self): - """Get the tasks of this OrganizationLinks. - - URI of resource. - - :return: The tasks of this OrganizationLinks. - :rtype: str - """ # noqa: E501 - return self._tasks - - @tasks.setter - def tasks(self, tasks): - """Set the tasks of this OrganizationLinks. - - URI of resource. - - :param tasks: The tasks of this OrganizationLinks. - :type: str - """ # noqa: E501 - self._tasks = tasks - - @property - def dashboards(self): - """Get the dashboards of this OrganizationLinks. - - URI of resource. - - :return: The dashboards of this OrganizationLinks. - :rtype: str - """ # noqa: E501 - return self._dashboards - - @dashboards.setter - def dashboards(self, dashboards): - """Set the dashboards of this OrganizationLinks. - - URI of resource. - - :param dashboards: The dashboards of this OrganizationLinks. - :type: str - """ # noqa: E501 - self._dashboards = dashboards - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, OrganizationLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/organizations.py b/frogpilot/third_party/influxdb_client/domain/organizations.py deleted file mode 100644 index 844c7faab..000000000 --- a/frogpilot/third_party/influxdb_client/domain/organizations.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Organizations(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'Links', - 'orgs': 'list[Organization]' - } - - attribute_map = { - 'links': 'links', - 'orgs': 'orgs' - } - - def __init__(self, links=None, orgs=None): # noqa: E501,D401,D403 - """Organizations - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._orgs = None - self.discriminator = None - - if links is not None: - self.links = links - if orgs is not None: - self.orgs = orgs - - @property - def links(self): - """Get the links of this Organizations. - - :return: The links of this Organizations. - :rtype: Links - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Organizations. - - :param links: The links of this Organizations. - :type: Links - """ # noqa: E501 - self._links = links - - @property - def orgs(self): - """Get the orgs of this Organizations. - - :return: The orgs of this Organizations. - :rtype: list[Organization] - """ # noqa: E501 - return self._orgs - - @orgs.setter - def orgs(self, orgs): - """Set the orgs of this Organizations. - - :param orgs: The orgs of this Organizations. - :type: list[Organization] - """ # noqa: E501 - self._orgs = orgs - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Organizations): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/package.py b/frogpilot/third_party/influxdb_client/domain/package.py deleted file mode 100644 index 9c328e6f7..000000000 --- a/frogpilot/third_party/influxdb_client/domain/package.py +++ /dev/null @@ -1,192 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Package(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'path': 'str', - 'package': 'str', - 'files': 'list[File]' - } - - attribute_map = { - 'type': 'type', - 'path': 'path', - 'package': 'package', - 'files': 'files' - } - - def __init__(self, type=None, path=None, package=None, files=None): # noqa: E501,D401,D403 - """Package - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self._path = None - self._package = None - self._files = None - self.discriminator = None - - if type is not None: - self.type = type - if path is not None: - self.path = path - if package is not None: - self.package = package - if files is not None: - self.files = files - - @property - def type(self): - """Get the type of this Package. - - Type of AST node - - :return: The type of this Package. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this Package. - - Type of AST node - - :param type: The type of this Package. - :type: str - """ # noqa: E501 - self._type = type - - @property - def path(self): - """Get the path of this Package. - - Package import path - - :return: The path of this Package. - :rtype: str - """ # noqa: E501 - return self._path - - @path.setter - def path(self, path): - """Set the path of this Package. - - Package import path - - :param path: The path of this Package. - :type: str - """ # noqa: E501 - self._path = path - - @property - def package(self): - """Get the package of this Package. - - Package name - - :return: The package of this Package. - :rtype: str - """ # noqa: E501 - return self._package - - @package.setter - def package(self, package): - """Set the package of this Package. - - Package name - - :param package: The package of this Package. - :type: str - """ # noqa: E501 - self._package = package - - @property - def files(self): - """Get the files of this Package. - - Package files - - :return: The files of this Package. - :rtype: list[File] - """ # noqa: E501 - return self._files - - @files.setter - def files(self, files): - """Set the files of this Package. - - Package files - - :param files: The files of this Package. - :type: list[File] - """ # noqa: E501 - self._files = files - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Package): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/package_clause.py b/frogpilot/third_party/influxdb_client/domain/package_clause.py deleted file mode 100644 index b9cb6abc6..000000000 --- a/frogpilot/third_party/influxdb_client/domain/package_clause.py +++ /dev/null @@ -1,134 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PackageClause(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'name': 'Identifier' - } - - attribute_map = { - 'type': 'type', - 'name': 'name' - } - - def __init__(self, type=None, name=None): # noqa: E501,D401,D403 - """PackageClause - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self._name = None - self.discriminator = None - - if type is not None: - self.type = type - if name is not None: - self.name = name - - @property - def type(self): - """Get the type of this PackageClause. - - Type of AST node - - :return: The type of this PackageClause. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this PackageClause. - - Type of AST node - - :param type: The type of this PackageClause. - :type: str - """ # noqa: E501 - self._type = type - - @property - def name(self): - """Get the name of this PackageClause. - - :return: The name of this PackageClause. - :rtype: Identifier - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this PackageClause. - - :param name: The name of this PackageClause. - :type: Identifier - """ # noqa: E501 - self._name = name - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PackageClause): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/pager_duty_notification_endpoint.py b/frogpilot/third_party/influxdb_client/domain/pager_duty_notification_endpoint.py deleted file mode 100644 index f57b6c005..000000000 --- a/frogpilot/third_party/influxdb_client/domain/pager_duty_notification_endpoint.py +++ /dev/null @@ -1,157 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.notification_endpoint_discriminator import NotificationEndpointDiscriminator - - -class PagerDutyNotificationEndpoint(NotificationEndpointDiscriminator): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'client_url': 'str', - 'routing_key': 'str', - 'id': 'str', - 'org_id': 'str', - 'user_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'description': 'str', - 'name': 'str', - 'status': 'str', - 'labels': 'list[Label]', - 'links': 'NotificationEndpointBaseLinks', - 'type': 'NotificationEndpointType' - } - - attribute_map = { - 'client_url': 'clientURL', - 'routing_key': 'routingKey', - 'id': 'id', - 'org_id': 'orgID', - 'user_id': 'userID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'description': 'description', - 'name': 'name', - 'status': 'status', - 'labels': 'labels', - 'links': 'links', - 'type': 'type' - } - - def __init__(self, client_url=None, routing_key=None, id=None, org_id=None, user_id=None, created_at=None, updated_at=None, description=None, name=None, status='active', labels=None, links=None, type="pagerduty"): # noqa: E501,D401,D403 - """PagerDutyNotificationEndpoint - a model defined in OpenAPI.""" # noqa: E501 - NotificationEndpointDiscriminator.__init__(self, id=id, org_id=org_id, user_id=user_id, created_at=created_at, updated_at=updated_at, description=description, name=name, status=status, labels=labels, links=links, type=type) # noqa: E501 - - self._client_url = None - self._routing_key = None - self.discriminator = None - - if client_url is not None: - self.client_url = client_url - self.routing_key = routing_key - - @property - def client_url(self): - """Get the client_url of this PagerDutyNotificationEndpoint. - - :return: The client_url of this PagerDutyNotificationEndpoint. - :rtype: str - """ # noqa: E501 - return self._client_url - - @client_url.setter - def client_url(self, client_url): - """Set the client_url of this PagerDutyNotificationEndpoint. - - :param client_url: The client_url of this PagerDutyNotificationEndpoint. - :type: str - """ # noqa: E501 - self._client_url = client_url - - @property - def routing_key(self): - """Get the routing_key of this PagerDutyNotificationEndpoint. - - :return: The routing_key of this PagerDutyNotificationEndpoint. - :rtype: str - """ # noqa: E501 - return self._routing_key - - @routing_key.setter - def routing_key(self, routing_key): - """Set the routing_key of this PagerDutyNotificationEndpoint. - - :param routing_key: The routing_key of this PagerDutyNotificationEndpoint. - :type: str - """ # noqa: E501 - if routing_key is None: - raise ValueError("Invalid value for `routing_key`, must not be `None`") # noqa: E501 - self._routing_key = routing_key - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PagerDutyNotificationEndpoint): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/pager_duty_notification_rule.py b/frogpilot/third_party/influxdb_client/domain/pager_duty_notification_rule.py deleted file mode 100644 index 8ccf2bd2b..000000000 --- a/frogpilot/third_party/influxdb_client/domain/pager_duty_notification_rule.py +++ /dev/null @@ -1,136 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.pager_duty_notification_rule_base import PagerDutyNotificationRuleBase - - -class PagerDutyNotificationRule(PagerDutyNotificationRuleBase): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'message_template': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'id': 'str', - 'endpoint_id': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'status': 'TaskStatusType', - 'name': 'str', - 'sleep_until': 'str', - 'every': 'str', - 'offset': 'str', - 'runbook_link': 'str', - 'limit_every': 'int', - 'limit': 'int', - 'tag_rules': 'list[TagRule]', - 'description': 'str', - 'status_rules': 'list[StatusRule]', - 'labels': 'list[Label]', - 'links': 'NotificationRuleBaseLinks' - } - - attribute_map = { - 'type': 'type', - 'message_template': 'messageTemplate', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'id': 'id', - 'endpoint_id': 'endpointID', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'status': 'status', - 'name': 'name', - 'sleep_until': 'sleepUntil', - 'every': 'every', - 'offset': 'offset', - 'runbook_link': 'runbookLink', - 'limit_every': 'limitEvery', - 'limit': 'limit', - 'tag_rules': 'tagRules', - 'description': 'description', - 'status_rules': 'statusRules', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, type="pagerduty", message_template=None, latest_completed=None, last_run_status=None, last_run_error=None, id=None, endpoint_id=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, status=None, name=None, sleep_until=None, every=None, offset=None, runbook_link=None, limit_every=None, limit=None, tag_rules=None, description=None, status_rules=None, labels=None, links=None): # noqa: E501,D401,D403 - """PagerDutyNotificationRule - a model defined in OpenAPI.""" # noqa: E501 - PagerDutyNotificationRuleBase.__init__(self, type=type, message_template=message_template, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, id=id, endpoint_id=endpoint_id, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, status=status, name=name, sleep_until=sleep_until, every=every, offset=offset, runbook_link=runbook_link, limit_every=limit_every, limit=limit, tag_rules=tag_rules, description=description, status_rules=status_rules, labels=labels, links=links) # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PagerDutyNotificationRule): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/pager_duty_notification_rule_base.py b/frogpilot/third_party/influxdb_client/domain/pager_duty_notification_rule_base.py deleted file mode 100644 index 8e447743b..000000000 --- a/frogpilot/third_party/influxdb_client/domain/pager_duty_notification_rule_base.py +++ /dev/null @@ -1,182 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.notification_rule_discriminator import NotificationRuleDiscriminator - - -class PagerDutyNotificationRuleBase(NotificationRuleDiscriminator): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'message_template': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'id': 'str', - 'endpoint_id': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'status': 'TaskStatusType', - 'name': 'str', - 'sleep_until': 'str', - 'every': 'str', - 'offset': 'str', - 'runbook_link': 'str', - 'limit_every': 'int', - 'limit': 'int', - 'tag_rules': 'list[TagRule]', - 'description': 'str', - 'status_rules': 'list[StatusRule]', - 'labels': 'list[Label]', - 'links': 'NotificationRuleBaseLinks' - } - - attribute_map = { - 'type': 'type', - 'message_template': 'messageTemplate', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'id': 'id', - 'endpoint_id': 'endpointID', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'status': 'status', - 'name': 'name', - 'sleep_until': 'sleepUntil', - 'every': 'every', - 'offset': 'offset', - 'runbook_link': 'runbookLink', - 'limit_every': 'limitEvery', - 'limit': 'limit', - 'tag_rules': 'tagRules', - 'description': 'description', - 'status_rules': 'statusRules', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, type=None, message_template=None, latest_completed=None, last_run_status=None, last_run_error=None, id=None, endpoint_id=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, status=None, name=None, sleep_until=None, every=None, offset=None, runbook_link=None, limit_every=None, limit=None, tag_rules=None, description=None, status_rules=None, labels=None, links=None): # noqa: E501,D401,D403 - """PagerDutyNotificationRuleBase - a model defined in OpenAPI.""" # noqa: E501 - NotificationRuleDiscriminator.__init__(self, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, id=id, endpoint_id=endpoint_id, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, status=status, name=name, sleep_until=sleep_until, every=every, offset=offset, runbook_link=runbook_link, limit_every=limit_every, limit=limit, tag_rules=tag_rules, description=description, status_rules=status_rules, labels=labels, links=links) # noqa: E501 - - self._type = None - self._message_template = None - self.discriminator = None - - self.type = type - self.message_template = message_template - - @property - def type(self): - """Get the type of this PagerDutyNotificationRuleBase. - - :return: The type of this PagerDutyNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this PagerDutyNotificationRuleBase. - - :param type: The type of this PagerDutyNotificationRuleBase. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def message_template(self): - """Get the message_template of this PagerDutyNotificationRuleBase. - - :return: The message_template of this PagerDutyNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._message_template - - @message_template.setter - def message_template(self, message_template): - """Set the message_template of this PagerDutyNotificationRuleBase. - - :param message_template: The message_template of this PagerDutyNotificationRuleBase. - :type: str - """ # noqa: E501 - if message_template is None: - raise ValueError("Invalid value for `message_template`, must not be `None`") # noqa: E501 - self._message_template = message_template - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PagerDutyNotificationRuleBase): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/paren_expression.py b/frogpilot/third_party/influxdb_client/domain/paren_expression.py deleted file mode 100644 index 68bcfe03c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/paren_expression.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class ParenExpression(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'expression': 'Expression' - } - - attribute_map = { - 'type': 'type', - 'expression': 'expression' - } - - def __init__(self, type=None, expression=None): # noqa: E501,D401,D403 - """ParenExpression - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._expression = None - self.discriminator = None - - if type is not None: - self.type = type - if expression is not None: - self.expression = expression - - @property - def type(self): - """Get the type of this ParenExpression. - - Type of AST node - - :return: The type of this ParenExpression. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this ParenExpression. - - Type of AST node - - :param type: The type of this ParenExpression. - :type: str - """ # noqa: E501 - self._type = type - - @property - def expression(self): - """Get the expression of this ParenExpression. - - :return: The expression of this ParenExpression. - :rtype: Expression - """ # noqa: E501 - return self._expression - - @expression.setter - def expression(self, expression): - """Set the expression of this ParenExpression. - - :param expression: The expression of this ParenExpression. - :type: Expression - """ # noqa: E501 - self._expression = expression - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ParenExpression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/password_reset_body.py b/frogpilot/third_party/influxdb_client/domain/password_reset_body.py deleted file mode 100644 index 22dc5c974..000000000 --- a/frogpilot/third_party/influxdb_client/domain/password_reset_body.py +++ /dev/null @@ -1,108 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PasswordResetBody(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'password': 'str' - } - - attribute_map = { - 'password': 'password' - } - - def __init__(self, password=None): # noqa: E501,D401,D403 - """PasswordResetBody - a model defined in OpenAPI.""" # noqa: E501 - self._password = None - self.discriminator = None - - self.password = password - - @property - def password(self): - """Get the password of this PasswordResetBody. - - :return: The password of this PasswordResetBody. - :rtype: str - """ # noqa: E501 - return self._password - - @password.setter - def password(self, password): - """Set the password of this PasswordResetBody. - - :param password: The password of this PasswordResetBody. - :type: str - """ # noqa: E501 - if password is None: - raise ValueError("Invalid value for `password`, must not be `None`") # noqa: E501 - self._password = password - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PasswordResetBody): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/patch_bucket_request.py b/frogpilot/third_party/influxdb_client/domain/patch_bucket_request.py deleted file mode 100644 index d2416a548..000000000 --- a/frogpilot/third_party/influxdb_client/domain/patch_bucket_request.py +++ /dev/null @@ -1,165 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PatchBucketRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'retention_rules': 'list[PatchRetentionRule]' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'retention_rules': 'retentionRules' - } - - def __init__(self, name=None, description=None, retention_rules=None): # noqa: E501,D401,D403 - """PatchBucketRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._retention_rules = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - if retention_rules is not None: - self.retention_rules = retention_rules - - @property - def name(self): - """Get the name of this PatchBucketRequest. - - The name of the bucket. - - :return: The name of this PatchBucketRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this PatchBucketRequest. - - The name of the bucket. - - :param name: The name of this PatchBucketRequest. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this PatchBucketRequest. - - A description of the bucket. - - :return: The description of this PatchBucketRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this PatchBucketRequest. - - A description of the bucket. - - :param description: The description of this PatchBucketRequest. - :type: str - """ # noqa: E501 - self._description = description - - @property - def retention_rules(self): - """Get the retention_rules of this PatchBucketRequest. - - Updates to rules to expire or retain data. No rules means no updates. - - :return: The retention_rules of this PatchBucketRequest. - :rtype: list[PatchRetentionRule] - """ # noqa: E501 - return self._retention_rules - - @retention_rules.setter - def retention_rules(self, retention_rules): - """Set the retention_rules of this PatchBucketRequest. - - Updates to rules to expire or retain data. No rules means no updates. - - :param retention_rules: The retention_rules of this PatchBucketRequest. - :type: list[PatchRetentionRule] - """ # noqa: E501 - self._retention_rules = retention_rules - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PatchBucketRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/patch_dashboard_request.py b/frogpilot/third_party/influxdb_client/domain/patch_dashboard_request.py deleted file mode 100644 index 8405c3b0f..000000000 --- a/frogpilot/third_party/influxdb_client/domain/patch_dashboard_request.py +++ /dev/null @@ -1,161 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PatchDashboardRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'cells': 'CellWithViewProperties' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'cells': 'cells' - } - - def __init__(self, name=None, description=None, cells=None): # noqa: E501,D401,D403 - """PatchDashboardRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._cells = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - if cells is not None: - self.cells = cells - - @property - def name(self): - """Get the name of this PatchDashboardRequest. - - optional, when provided will replace the name - - :return: The name of this PatchDashboardRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this PatchDashboardRequest. - - optional, when provided will replace the name - - :param name: The name of this PatchDashboardRequest. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this PatchDashboardRequest. - - optional, when provided will replace the description - - :return: The description of this PatchDashboardRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this PatchDashboardRequest. - - optional, when provided will replace the description - - :param description: The description of this PatchDashboardRequest. - :type: str - """ # noqa: E501 - self._description = description - - @property - def cells(self): - """Get the cells of this PatchDashboardRequest. - - :return: The cells of this PatchDashboardRequest. - :rtype: CellWithViewProperties - """ # noqa: E501 - return self._cells - - @cells.setter - def cells(self, cells): - """Set the cells of this PatchDashboardRequest. - - :param cells: The cells of this PatchDashboardRequest. - :type: CellWithViewProperties - """ # noqa: E501 - self._cells = cells - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PatchDashboardRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/patch_organization_request.py b/frogpilot/third_party/influxdb_client/domain/patch_organization_request.py deleted file mode 100644 index ff74e17b0..000000000 --- a/frogpilot/third_party/influxdb_client/domain/patch_organization_request.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PatchOrganizationRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str' - } - - attribute_map = { - 'name': 'name', - 'description': 'description' - } - - def __init__(self, name=None, description=None): # noqa: E501,D401,D403 - """PatchOrganizationRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - - @property - def name(self): - """Get the name of this PatchOrganizationRequest. - - The name of the organization. - - :return: The name of this PatchOrganizationRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this PatchOrganizationRequest. - - The name of the organization. - - :param name: The name of this PatchOrganizationRequest. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this PatchOrganizationRequest. - - The description of the organization. - - :return: The description of this PatchOrganizationRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this PatchOrganizationRequest. - - The description of the organization. - - :param description: The description of this PatchOrganizationRequest. - :type: str - """ # noqa: E501 - self._description = description - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PatchOrganizationRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/patch_retention_rule.py b/frogpilot/third_party/influxdb_client/domain/patch_retention_rule.py deleted file mode 100644 index d02335a1d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/patch_retention_rule.py +++ /dev/null @@ -1,164 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PatchRetentionRule(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'every_seconds': 'int', - 'shard_group_duration_seconds': 'int' - } - - attribute_map = { - 'type': 'type', - 'every_seconds': 'everySeconds', - 'shard_group_duration_seconds': 'shardGroupDurationSeconds' - } - - def __init__(self, type='expire', every_seconds=2592000, shard_group_duration_seconds=None): # noqa: E501,D401,D403 - """PatchRetentionRule - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self._every_seconds = None - self._shard_group_duration_seconds = None - self.discriminator = None - - if type is not None: - self.type = type - self.every_seconds = every_seconds - if shard_group_duration_seconds is not None: - self.shard_group_duration_seconds = shard_group_duration_seconds - - @property - def type(self): - """Get the type of this PatchRetentionRule. - - :return: The type of this PatchRetentionRule. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this PatchRetentionRule. - - :param type: The type of this PatchRetentionRule. - :type: str - """ # noqa: E501 - self._type = type - - @property - def every_seconds(self): - """Get the every_seconds of this PatchRetentionRule. - - The number of seconds to keep data. Default duration is `2592000` (30 days). `0` represents infinite retention. - - :return: The every_seconds of this PatchRetentionRule. - :rtype: int - """ # noqa: E501 - return self._every_seconds - - @every_seconds.setter - def every_seconds(self, every_seconds): - """Set the every_seconds of this PatchRetentionRule. - - The number of seconds to keep data. Default duration is `2592000` (30 days). `0` represents infinite retention. - - :param every_seconds: The every_seconds of this PatchRetentionRule. - :type: int - """ # noqa: E501 - if every_seconds is None: - raise ValueError("Invalid value for `every_seconds`, must not be `None`") # noqa: E501 - if every_seconds is not None and every_seconds < 0: # noqa: E501 - raise ValueError("Invalid value for `every_seconds`, must be a value greater than or equal to `0`") # noqa: E501 - self._every_seconds = every_seconds - - @property - def shard_group_duration_seconds(self): - """Get the shard_group_duration_seconds of this PatchRetentionRule. - - The [shard group duration](https://docs.influxdata.com/influxdb/latest/reference/glossary/#shard). The number of seconds that each shard group covers. #### InfluxDB Cloud - Doesn't use `shardGroupDurationsSeconds`. #### InfluxDB OSS - Default value depends on the [bucket retention period](https://docs.influxdata.com/influxdb/latest/reference/internals/shards/#shard-group-duration). #### Related guides - InfluxDB [shards and shard groups](https://docs.influxdata.com/influxdb/latest/reference/internals/shards/) - - :return: The shard_group_duration_seconds of this PatchRetentionRule. - :rtype: int - """ # noqa: E501 - return self._shard_group_duration_seconds - - @shard_group_duration_seconds.setter - def shard_group_duration_seconds(self, shard_group_duration_seconds): - """Set the shard_group_duration_seconds of this PatchRetentionRule. - - The [shard group duration](https://docs.influxdata.com/influxdb/latest/reference/glossary/#shard). The number of seconds that each shard group covers. #### InfluxDB Cloud - Doesn't use `shardGroupDurationsSeconds`. #### InfluxDB OSS - Default value depends on the [bucket retention period](https://docs.influxdata.com/influxdb/latest/reference/internals/shards/#shard-group-duration). #### Related guides - InfluxDB [shards and shard groups](https://docs.influxdata.com/influxdb/latest/reference/internals/shards/) - - :param shard_group_duration_seconds: The shard_group_duration_seconds of this PatchRetentionRule. - :type: int - """ # noqa: E501 - self._shard_group_duration_seconds = shard_group_duration_seconds - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PatchRetentionRule): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/patch_stack_request.py b/frogpilot/third_party/influxdb_client/domain/patch_stack_request.py deleted file mode 100644 index 917cc3151..000000000 --- a/frogpilot/third_party/influxdb_client/domain/patch_stack_request.py +++ /dev/null @@ -1,173 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PatchStackRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'template_ur_ls': 'list[str]', - 'additional_resources': 'list[PatchStackRequestAdditionalResources]' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'template_ur_ls': 'templateURLs', - 'additional_resources': 'additionalResources' - } - - def __init__(self, name=None, description=None, template_ur_ls=None, additional_resources=None): # noqa: E501,D401,D403 - """PatchStackRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._template_ur_ls = None - self._additional_resources = None - self.discriminator = None - - self.name = name - self.description = description - self.template_ur_ls = template_ur_ls - if additional_resources is not None: - self.additional_resources = additional_resources - - @property - def name(self): - """Get the name of this PatchStackRequest. - - :return: The name of this PatchStackRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this PatchStackRequest. - - :param name: The name of this PatchStackRequest. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this PatchStackRequest. - - :return: The description of this PatchStackRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this PatchStackRequest. - - :param description: The description of this PatchStackRequest. - :type: str - """ # noqa: E501 - self._description = description - - @property - def template_ur_ls(self): - """Get the template_ur_ls of this PatchStackRequest. - - :return: The template_ur_ls of this PatchStackRequest. - :rtype: list[str] - """ # noqa: E501 - return self._template_ur_ls - - @template_ur_ls.setter - def template_ur_ls(self, template_ur_ls): - """Set the template_ur_ls of this PatchStackRequest. - - :param template_ur_ls: The template_ur_ls of this PatchStackRequest. - :type: list[str] - """ # noqa: E501 - self._template_ur_ls = template_ur_ls - - @property - def additional_resources(self): - """Get the additional_resources of this PatchStackRequest. - - :return: The additional_resources of this PatchStackRequest. - :rtype: list[PatchStackRequestAdditionalResources] - """ # noqa: E501 - return self._additional_resources - - @additional_resources.setter - def additional_resources(self, additional_resources): - """Set the additional_resources of this PatchStackRequest. - - :param additional_resources: The additional_resources of this PatchStackRequest. - :type: list[PatchStackRequestAdditionalResources] - """ # noqa: E501 - self._additional_resources = additional_resources - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PatchStackRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/patch_stack_request_additional_resources.py b/frogpilot/third_party/influxdb_client/domain/patch_stack_request_additional_resources.py deleted file mode 100644 index 6df857bbf..000000000 --- a/frogpilot/third_party/influxdb_client/domain/patch_stack_request_additional_resources.py +++ /dev/null @@ -1,155 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PatchStackRequestAdditionalResources(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'resource_id': 'str', - 'kind': 'str', - 'template_meta_name': 'str' - } - - attribute_map = { - 'resource_id': 'resourceID', - 'kind': 'kind', - 'template_meta_name': 'templateMetaName' - } - - def __init__(self, resource_id=None, kind=None, template_meta_name=None): # noqa: E501,D401,D403 - """PatchStackRequestAdditionalResources - a model defined in OpenAPI.""" # noqa: E501 - self._resource_id = None - self._kind = None - self._template_meta_name = None - self.discriminator = None - - self.resource_id = resource_id - self.kind = kind - if template_meta_name is not None: - self.template_meta_name = template_meta_name - - @property - def resource_id(self): - """Get the resource_id of this PatchStackRequestAdditionalResources. - - :return: The resource_id of this PatchStackRequestAdditionalResources. - :rtype: str - """ # noqa: E501 - return self._resource_id - - @resource_id.setter - def resource_id(self, resource_id): - """Set the resource_id of this PatchStackRequestAdditionalResources. - - :param resource_id: The resource_id of this PatchStackRequestAdditionalResources. - :type: str - """ # noqa: E501 - if resource_id is None: - raise ValueError("Invalid value for `resource_id`, must not be `None`") # noqa: E501 - self._resource_id = resource_id - - @property - def kind(self): - """Get the kind of this PatchStackRequestAdditionalResources. - - :return: The kind of this PatchStackRequestAdditionalResources. - :rtype: str - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this PatchStackRequestAdditionalResources. - - :param kind: The kind of this PatchStackRequestAdditionalResources. - :type: str - """ # noqa: E501 - if kind is None: - raise ValueError("Invalid value for `kind`, must not be `None`") # noqa: E501 - self._kind = kind - - @property - def template_meta_name(self): - """Get the template_meta_name of this PatchStackRequestAdditionalResources. - - :return: The template_meta_name of this PatchStackRequestAdditionalResources. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this PatchStackRequestAdditionalResources. - - :param template_meta_name: The template_meta_name of this PatchStackRequestAdditionalResources. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PatchStackRequestAdditionalResources): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/permission.py b/frogpilot/third_party/influxdb_client/domain/permission.py deleted file mode 100644 index 4d25db701..000000000 --- a/frogpilot/third_party/influxdb_client/domain/permission.py +++ /dev/null @@ -1,132 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Permission(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'action': 'str', - 'resource': 'PermissionResource' - } - - attribute_map = { - 'action': 'action', - 'resource': 'resource' - } - - def __init__(self, action=None, resource=None): # noqa: E501,D401,D403 - """Permission - a model defined in OpenAPI.""" # noqa: E501 - self._action = None - self._resource = None - self.discriminator = None - - self.action = action - self.resource = resource - - @property - def action(self): - """Get the action of this Permission. - - :return: The action of this Permission. - :rtype: str - """ # noqa: E501 - return self._action - - @action.setter - def action(self, action): - """Set the action of this Permission. - - :param action: The action of this Permission. - :type: str - """ # noqa: E501 - if action is None: - raise ValueError("Invalid value for `action`, must not be `None`") # noqa: E501 - self._action = action - - @property - def resource(self): - """Get the resource of this Permission. - - :return: The resource of this Permission. - :rtype: PermissionResource - """ # noqa: E501 - return self._resource - - @resource.setter - def resource(self, resource): - """Set the resource of this Permission. - - :param resource: The resource of this Permission. - :type: PermissionResource - """ # noqa: E501 - if resource is None: - raise ValueError("Invalid value for `resource`, must not be `None`") # noqa: E501 - self._resource = resource - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Permission): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/permission_resource.py b/frogpilot/third_party/influxdb_client/domain/permission_resource.py deleted file mode 100644 index 07634a039..000000000 --- a/frogpilot/third_party/influxdb_client/domain/permission_resource.py +++ /dev/null @@ -1,220 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PermissionResource(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'id': 'str', - 'name': 'str', - 'org_id': 'str', - 'org': 'str' - } - - attribute_map = { - 'type': 'type', - 'id': 'id', - 'name': 'name', - 'org_id': 'orgID', - 'org': 'org' - } - - def __init__(self, type=None, id=None, name=None, org_id=None, org=None): # noqa: E501,D401,D403 - """PermissionResource - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self._id = None - self._name = None - self._org_id = None - self._org = None - self.discriminator = None - - self.type = type - if id is not None: - self.id = id - if name is not None: - self.name = name - if org_id is not None: - self.org_id = org_id - if org is not None: - self.org = org - - @property - def type(self): - """Get the type of this PermissionResource. - - A resource type. Identifies the API resource's type (or _kind_). - - :return: The type of this PermissionResource. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this PermissionResource. - - A resource type. Identifies the API resource's type (or _kind_). - - :param type: The type of this PermissionResource. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def id(self): - """Get the id of this PermissionResource. - - A resource ID. Identifies a specific resource. - - :return: The id of this PermissionResource. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this PermissionResource. - - A resource ID. Identifies a specific resource. - - :param id: The id of this PermissionResource. - :type: str - """ # noqa: E501 - self._id = id - - @property - def name(self): - """Get the name of this PermissionResource. - - The name of the resource. _Note: not all resource types have a `name` property_. - - :return: The name of this PermissionResource. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this PermissionResource. - - The name of the resource. _Note: not all resource types have a `name` property_. - - :param name: The name of this PermissionResource. - :type: str - """ # noqa: E501 - self._name = name - - @property - def org_id(self): - """Get the org_id of this PermissionResource. - - An organization ID. Identifies the organization that owns the resource. - - :return: The org_id of this PermissionResource. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this PermissionResource. - - An organization ID. Identifies the organization that owns the resource. - - :param org_id: The org_id of this PermissionResource. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def org(self): - """Get the org of this PermissionResource. - - An organization name. The organization that owns the resource. - - :return: The org of this PermissionResource. - :rtype: str - """ # noqa: E501 - return self._org - - @org.setter - def org(self, org): - """Set the org of this PermissionResource. - - An organization name. The organization that owns the resource. - - :param org: The org of this PermissionResource. - :type: str - """ # noqa: E501 - self._org = org - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PermissionResource): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/pipe_expression.py b/frogpilot/third_party/influxdb_client/domain/pipe_expression.py deleted file mode 100644 index 3f984113b..000000000 --- a/frogpilot/third_party/influxdb_client/domain/pipe_expression.py +++ /dev/null @@ -1,161 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class PipeExpression(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'argument': 'Expression', - 'call': 'CallExpression' - } - - attribute_map = { - 'type': 'type', - 'argument': 'argument', - 'call': 'call' - } - - def __init__(self, type=None, argument=None, call=None): # noqa: E501,D401,D403 - """PipeExpression - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._argument = None - self._call = None - self.discriminator = None - - if type is not None: - self.type = type - if argument is not None: - self.argument = argument - if call is not None: - self.call = call - - @property - def type(self): - """Get the type of this PipeExpression. - - Type of AST node - - :return: The type of this PipeExpression. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this PipeExpression. - - Type of AST node - - :param type: The type of this PipeExpression. - :type: str - """ # noqa: E501 - self._type = type - - @property - def argument(self): - """Get the argument of this PipeExpression. - - :return: The argument of this PipeExpression. - :rtype: Expression - """ # noqa: E501 - return self._argument - - @argument.setter - def argument(self, argument): - """Set the argument of this PipeExpression. - - :param argument: The argument of this PipeExpression. - :type: Expression - """ # noqa: E501 - self._argument = argument - - @property - def call(self): - """Get the call of this PipeExpression. - - :return: The call of this PipeExpression. - :rtype: CallExpression - """ # noqa: E501 - return self._call - - @call.setter - def call(self, call): - """Set the call of this PipeExpression. - - :param call: The call of this PipeExpression. - :type: CallExpression - """ # noqa: E501 - self._call = call - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PipeExpression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/pipe_literal.py b/frogpilot/third_party/influxdb_client/domain/pipe_literal.py deleted file mode 100644 index eea02437e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/pipe_literal.py +++ /dev/null @@ -1,115 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class PipeLiteral(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str' - } - - attribute_map = { - 'type': 'type' - } - - def __init__(self, type=None): # noqa: E501,D401,D403 - """PipeLiteral - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self.discriminator = None - - if type is not None: - self.type = type - - @property - def type(self): - """Get the type of this PipeLiteral. - - Type of AST node - - :return: The type of this PipeLiteral. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this PipeLiteral. - - Type of AST node - - :param type: The type of this PipeLiteral. - :type: str - """ # noqa: E501 - self._type = type - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PipeLiteral): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/post_bucket_request.py b/frogpilot/third_party/influxdb_client/domain/post_bucket_request.py deleted file mode 100644 index 83215a70f..000000000 --- a/frogpilot/third_party/influxdb_client/domain/post_bucket_request.py +++ /dev/null @@ -1,244 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PostBucketRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'org_id': 'str', - 'name': 'str', - 'description': 'str', - 'rp': 'str', - 'retention_rules': 'list[BucketRetentionRules]', - 'schema_type': 'SchemaType' - } - - attribute_map = { - 'org_id': 'orgID', - 'name': 'name', - 'description': 'description', - 'rp': 'rp', - 'retention_rules': 'retentionRules', - 'schema_type': 'schemaType' - } - - def __init__(self, org_id=None, name=None, description=None, rp='0', retention_rules=None, schema_type=None): # noqa: E501,D401,D403 - """PostBucketRequest - a model defined in OpenAPI.""" # noqa: E501 - self._org_id = None - self._name = None - self._description = None - self._rp = None - self._retention_rules = None - self._schema_type = None - self.discriminator = None - - self.org_id = org_id - self.name = name - if description is not None: - self.description = description - if rp is not None: - self.rp = rp - if retention_rules is not None: - self.retention_rules = retention_rules - if schema_type is not None: - self.schema_type = schema_type - - @property - def org_id(self): - """Get the org_id of this PostBucketRequest. - - The organization ID. Specifies the organization that owns the bucket. - - :return: The org_id of this PostBucketRequest. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this PostBucketRequest. - - The organization ID. Specifies the organization that owns the bucket. - - :param org_id: The org_id of this PostBucketRequest. - :type: str - """ # noqa: E501 - if org_id is None: - raise ValueError("Invalid value for `org_id`, must not be `None`") # noqa: E501 - self._org_id = org_id - - @property - def name(self): - """Get the name of this PostBucketRequest. - - The bucket name. - - :return: The name of this PostBucketRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this PostBucketRequest. - - The bucket name. - - :param name: The name of this PostBucketRequest. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this PostBucketRequest. - - A description of the bucket. - - :return: The description of this PostBucketRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this PostBucketRequest. - - A description of the bucket. - - :param description: The description of this PostBucketRequest. - :type: str - """ # noqa: E501 - self._description = description - - @property - def rp(self): - """Get the rp of this PostBucketRequest. - - The retention policy for the bucket. For InfluxDB 1.x, specifies the duration of time that each data point in the retention policy persists. If you need compatibility with InfluxDB 1.x, specify a value for the `rp` property; otherwise, see the `retentionRules` property. [Retention policy](https://docs.influxdata.com/influxdb/v1.8/concepts/glossary/#retention-policy-rp) is an InfluxDB 1.x concept. The InfluxDB 2.x and Cloud equivalent is [retention period](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-period). The InfluxDB `/api/v2` API uses `RetentionRules` to configure the retention period. - - :return: The rp of this PostBucketRequest. - :rtype: str - """ # noqa: E501 - return self._rp - - @rp.setter - def rp(self, rp): - """Set the rp of this PostBucketRequest. - - The retention policy for the bucket. For InfluxDB 1.x, specifies the duration of time that each data point in the retention policy persists. If you need compatibility with InfluxDB 1.x, specify a value for the `rp` property; otherwise, see the `retentionRules` property. [Retention policy](https://docs.influxdata.com/influxdb/v1.8/concepts/glossary/#retention-policy-rp) is an InfluxDB 1.x concept. The InfluxDB 2.x and Cloud equivalent is [retention period](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-period). The InfluxDB `/api/v2` API uses `RetentionRules` to configure the retention period. - - :param rp: The rp of this PostBucketRequest. - :type: str - """ # noqa: E501 - self._rp = rp - - @property - def retention_rules(self): - """Get the retention_rules of this PostBucketRequest. - - Retention rules to expire or retain data. The InfluxDB `/api/v2` API uses `RetentionRules` to configure the [retention period](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-period). #### InfluxDB Cloud - `retentionRules` is required. #### InfluxDB OSS - `retentionRules` isn't required. - - :return: The retention_rules of this PostBucketRequest. - :rtype: list[BucketRetentionRules] - """ # noqa: E501 - return self._retention_rules - - @retention_rules.setter - def retention_rules(self, retention_rules): - """Set the retention_rules of this PostBucketRequest. - - Retention rules to expire or retain data. The InfluxDB `/api/v2` API uses `RetentionRules` to configure the [retention period](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-period). #### InfluxDB Cloud - `retentionRules` is required. #### InfluxDB OSS - `retentionRules` isn't required. - - :param retention_rules: The retention_rules of this PostBucketRequest. - :type: list[BucketRetentionRules] - """ # noqa: E501 - self._retention_rules = retention_rules - - @property - def schema_type(self): - """Get the schema_type of this PostBucketRequest. - - :return: The schema_type of this PostBucketRequest. - :rtype: SchemaType - """ # noqa: E501 - return self._schema_type - - @schema_type.setter - def schema_type(self, schema_type): - """Set the schema_type of this PostBucketRequest. - - :param schema_type: The schema_type of this PostBucketRequest. - :type: SchemaType - """ # noqa: E501 - self._schema_type = schema_type - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PostBucketRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/post_check.py b/frogpilot/third_party/influxdb_client/domain/post_check.py deleted file mode 100644 index 144a72e3a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/post_check.py +++ /dev/null @@ -1,120 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PostCheck(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str' - } - - attribute_map = { - 'type': 'type' - } - - discriminator_value_class_map = { - 'deadman': 'DeadmanCheck', - 'custom': 'CustomCheck', - 'threshold': 'ThresholdCheck' - } - - def __init__(self, type=None): # noqa: E501,D401,D403 - """PostCheck - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self.discriminator = 'type' - - self.type = type - - @property - def type(self): - """Get the type of this PostCheck. - - :return: The type of this PostCheck. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this PostCheck. - - :param type: The type of this PostCheck. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - def get_real_child_model(self, data): - """Return the real base class specified by the discriminator.""" - discriminator_key = self.attribute_map[self.discriminator] - discriminator_value = data[discriminator_key] - return self.discriminator_value_class_map.get(discriminator_value) - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PostCheck): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/post_notification_endpoint.py b/frogpilot/third_party/influxdb_client/domain/post_notification_endpoint.py deleted file mode 100644 index d2d0b3c85..000000000 --- a/frogpilot/third_party/influxdb_client/domain/post_notification_endpoint.py +++ /dev/null @@ -1,121 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PostNotificationEndpoint(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'NotificationEndpointType' - } - - attribute_map = { - 'type': 'type' - } - - discriminator_value_class_map = { - 'slack': 'SlackNotificationEndpoint', - 'pagerduty': 'PagerDutyNotificationEndpoint', - 'http': 'HTTPNotificationEndpoint', - 'telegram': 'TelegramNotificationEndpoint' - } - - def __init__(self, type=None): # noqa: E501,D401,D403 - """PostNotificationEndpoint - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self.discriminator = 'type' - - self.type = type - - @property - def type(self): - """Get the type of this PostNotificationEndpoint. - - :return: The type of this PostNotificationEndpoint. - :rtype: NotificationEndpointType - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this PostNotificationEndpoint. - - :param type: The type of this PostNotificationEndpoint. - :type: NotificationEndpointType - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - def get_real_child_model(self, data): - """Return the real base class specified by the discriminator.""" - discriminator_key = self.attribute_map[self.discriminator] - discriminator_value = data[discriminator_key] - return self.discriminator_value_class_map.get(discriminator_value) - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PostNotificationEndpoint): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/post_notification_rule.py b/frogpilot/third_party/influxdb_client/domain/post_notification_rule.py deleted file mode 100644 index d0a54a0dd..000000000 --- a/frogpilot/third_party/influxdb_client/domain/post_notification_rule.py +++ /dev/null @@ -1,126 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PostNotificationRule(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str' - } - - attribute_map = { - 'type': 'type' - } - - discriminator_value_class_map = { - 'slack': 'SlackNotificationRule', - 'pagerduty': 'PagerDutyNotificationRule', - 'smtp': 'SMTPNotificationRule', - 'http': 'HTTPNotificationRule', - 'telegram': 'TelegramNotificationRule' - } - - def __init__(self, type=None): # noqa: E501,D401,D403 - """PostNotificationRule - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self.discriminator = 'type' - - self.type = type - - @property - def type(self): - """Get the type of this PostNotificationRule. - - The discriminator between other types of notification rules is "telegram". - - :return: The type of this PostNotificationRule. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this PostNotificationRule. - - The discriminator between other types of notification rules is "telegram". - - :param type: The type of this PostNotificationRule. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - def get_real_child_model(self, data): - """Return the real base class specified by the discriminator.""" - discriminator_key = self.attribute_map[self.discriminator] - discriminator_value = data[discriminator_key] - return self.discriminator_value_class_map.get(discriminator_value) - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PostNotificationRule): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/post_organization_request.py b/frogpilot/third_party/influxdb_client/domain/post_organization_request.py deleted file mode 100644 index 5e152d374..000000000 --- a/frogpilot/third_party/influxdb_client/domain/post_organization_request.py +++ /dev/null @@ -1,139 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PostOrganizationRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str' - } - - attribute_map = { - 'name': 'name', - 'description': 'description' - } - - def __init__(self, name=None, description=None): # noqa: E501,D401,D403 - """PostOrganizationRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self.discriminator = None - - self.name = name - if description is not None: - self.description = description - - @property - def name(self): - """Get the name of this PostOrganizationRequest. - - The name of the organization. - - :return: The name of this PostOrganizationRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this PostOrganizationRequest. - - The name of the organization. - - :param name: The name of this PostOrganizationRequest. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this PostOrganizationRequest. - - The description of the organization. - - :return: The description of this PostOrganizationRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this PostOrganizationRequest. - - The description of the organization. - - :param description: The description of this PostOrganizationRequest. - :type: str - """ # noqa: E501 - self._description = description - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PostOrganizationRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/post_restore_kv_response.py b/frogpilot/third_party/influxdb_client/domain/post_restore_kv_response.py deleted file mode 100644 index 5cd5c166d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/post_restore_kv_response.py +++ /dev/null @@ -1,111 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PostRestoreKVResponse(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'token': 'str' - } - - attribute_map = { - 'token': 'token' - } - - def __init__(self, token=None): # noqa: E501,D401,D403 - """PostRestoreKVResponse - a model defined in OpenAPI.""" # noqa: E501 - self._token = None - self.discriminator = None - - if token is not None: - self.token = token - - @property - def token(self): - """Get the token of this PostRestoreKVResponse. - - token is the root token for the instance after restore (this is overwritten during the restore) - - :return: The token of this PostRestoreKVResponse. - :rtype: str - """ # noqa: E501 - return self._token - - @token.setter - def token(self, token): - """Set the token of this PostRestoreKVResponse. - - token is the root token for the instance after restore (this is overwritten during the restore) - - :param token: The token of this PostRestoreKVResponse. - :type: str - """ # noqa: E501 - self._token = token - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PostRestoreKVResponse): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/post_stack_request.py b/frogpilot/third_party/influxdb_client/domain/post_stack_request.py deleted file mode 100644 index ce683035a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/post_stack_request.py +++ /dev/null @@ -1,176 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class PostStackRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'org_id': 'str', - 'name': 'str', - 'description': 'str', - 'urls': 'list[str]' - } - - attribute_map = { - 'org_id': 'orgID', - 'name': 'name', - 'description': 'description', - 'urls': 'urls' - } - - def __init__(self, org_id=None, name=None, description=None, urls=None): # noqa: E501,D401,D403 - """PostStackRequest - a model defined in OpenAPI.""" # noqa: E501 - self._org_id = None - self._name = None - self._description = None - self._urls = None - self.discriminator = None - - if org_id is not None: - self.org_id = org_id - if name is not None: - self.name = name - if description is not None: - self.description = description - if urls is not None: - self.urls = urls - - @property - def org_id(self): - """Get the org_id of this PostStackRequest. - - :return: The org_id of this PostStackRequest. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this PostStackRequest. - - :param org_id: The org_id of this PostStackRequest. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def name(self): - """Get the name of this PostStackRequest. - - :return: The name of this PostStackRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this PostStackRequest. - - :param name: The name of this PostStackRequest. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this PostStackRequest. - - :return: The description of this PostStackRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this PostStackRequest. - - :param description: The description of this PostStackRequest. - :type: str - """ # noqa: E501 - self._description = description - - @property - def urls(self): - """Get the urls of this PostStackRequest. - - :return: The urls of this PostStackRequest. - :rtype: list[str] - """ # noqa: E501 - return self._urls - - @urls.setter - def urls(self, urls): - """Set the urls of this PostStackRequest. - - :param urls: The urls of this PostStackRequest. - :type: list[str] - """ # noqa: E501 - self._urls = urls - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PostStackRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/property_key.py b/frogpilot/third_party/influxdb_client/domain/property_key.py deleted file mode 100644 index e072527b5..000000000 --- a/frogpilot/third_party/influxdb_client/domain/property_key.py +++ /dev/null @@ -1,86 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class PropertyKey(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """PropertyKey - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, PropertyKey): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/query.py b/frogpilot/third_party/influxdb_client/domain/query.py deleted file mode 100644 index 9b69972c6..000000000 --- a/frogpilot/third_party/influxdb_client/domain/query.py +++ /dev/null @@ -1,239 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Query(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'extern': 'File', - 'query': 'str', - 'type': 'str', - 'params': 'dict(str, object)', - 'dialect': 'Dialect', - 'now': 'datetime' - } - - attribute_map = { - 'extern': 'extern', - 'query': 'query', - 'type': 'type', - 'params': 'params', - 'dialect': 'dialect', - 'now': 'now' - } - - def __init__(self, extern=None, query=None, type=None, params=None, dialect=None, now=None): # noqa: E501,D401,D403 - """Query - a model defined in OpenAPI.""" # noqa: E501 - self._extern = None - self._query = None - self._type = None - self._params = None - self._dialect = None - self._now = None - self.discriminator = None - - if extern is not None: - self.extern = extern - self.query = query - if type is not None: - self.type = type - if params is not None: - self.params = params - if dialect is not None: - self.dialect = dialect - if now is not None: - self.now = now - - @property - def extern(self): - """Get the extern of this Query. - - :return: The extern of this Query. - :rtype: File - """ # noqa: E501 - return self._extern - - @extern.setter - def extern(self, extern): - """Set the extern of this Query. - - :param extern: The extern of this Query. - :type: File - """ # noqa: E501 - self._extern = extern - - @property - def query(self): - """Get the query of this Query. - - The query script to execute. - - :return: The query of this Query. - :rtype: str - """ # noqa: E501 - return self._query - - @query.setter - def query(self, query): - """Set the query of this Query. - - The query script to execute. - - :param query: The query of this Query. - :type: str - """ # noqa: E501 - if query is None: - raise ValueError("Invalid value for `query`, must not be `None`") # noqa: E501 - self._query = query - - @property - def type(self): - """Get the type of this Query. - - The type of query. Must be "flux". - - :return: The type of this Query. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this Query. - - The type of query. Must be "flux". - - :param type: The type of this Query. - :type: str - """ # noqa: E501 - self._type = type - - @property - def params(self): - r"""Get the params of this Query. - - Key-value pairs passed as parameters during query execution. To use parameters in your query, pass a _`query`_ with `params` references (in dot notation)--for example: ```json query: "from(bucket: params.mybucket)\\ |> range(start: params.rangeStart) |> limit(n:1)" ``` and pass _`params`_ with the key-value pairs--for example: ```json params: { "mybucket": "environment", "rangeStart": "-30d" } ``` During query execution, InfluxDB passes _`params`_ to your script and substitutes the values. #### Limitations - If you use _`params`_, you can't use _`extern`_. - - :return: The params of this Query. - :rtype: dict(str, object) - """ # noqa: E501 - return self._params - - @params.setter - def params(self, params): - r"""Set the params of this Query. - - Key-value pairs passed as parameters during query execution. To use parameters in your query, pass a _`query`_ with `params` references (in dot notation)--for example: ```json query: "from(bucket: params.mybucket)\\ |> range(start: params.rangeStart) |> limit(n:1)" ``` and pass _`params`_ with the key-value pairs--for example: ```json params: { "mybucket": "environment", "rangeStart": "-30d" } ``` During query execution, InfluxDB passes _`params`_ to your script and substitutes the values. #### Limitations - If you use _`params`_, you can't use _`extern`_. - - :param params: The params of this Query. - :type: dict(str, object) - """ # noqa: E501 - self._params = params - - @property - def dialect(self): - """Get the dialect of this Query. - - :return: The dialect of this Query. - :rtype: Dialect - """ # noqa: E501 - return self._dialect - - @dialect.setter - def dialect(self, dialect): - """Set the dialect of this Query. - - :param dialect: The dialect of this Query. - :type: Dialect - """ # noqa: E501 - self._dialect = dialect - - @property - def now(self): - """Get the now of this Query. - - Specifies the time that should be reported as `now` in the query. Default is the server `now` time. - - :return: The now of this Query. - :rtype: datetime - """ # noqa: E501 - return self._now - - @now.setter - def now(self, now): - """Set the now of this Query. - - Specifies the time that should be reported as `now` in the query. Default is the server `now` time. - - :param now: The now of this Query. - :type: datetime - """ # noqa: E501 - self._now = now - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Query): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/query_edit_mode.py b/frogpilot/third_party/influxdb_client/domain/query_edit_mode.py deleted file mode 100644 index 8a7fba8b0..000000000 --- a/frogpilot/third_party/influxdb_client/domain/query_edit_mode.py +++ /dev/null @@ -1,88 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class QueryEditMode(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - BUILDER = "builder" - ADVANCED = "advanced" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """QueryEditMode - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, QueryEditMode): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/query_variable_properties.py b/frogpilot/third_party/influxdb_client/domain/query_variable_properties.py deleted file mode 100644 index 143bb01e2..000000000 --- a/frogpilot/third_party/influxdb_client/domain/query_variable_properties.py +++ /dev/null @@ -1,134 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.variable_properties import VariableProperties - - -class QueryVariableProperties(VariableProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'values': 'QueryVariablePropertiesValues' - } - - attribute_map = { - 'type': 'type', - 'values': 'values' - } - - def __init__(self, type=None, values=None): # noqa: E501,D401,D403 - """QueryVariableProperties - a model defined in OpenAPI.""" # noqa: E501 - VariableProperties.__init__(self) # noqa: E501 - - self._type = None - self._values = None - self.discriminator = None - - if type is not None: - self.type = type - if values is not None: - self.values = values - - @property - def type(self): - """Get the type of this QueryVariableProperties. - - :return: The type of this QueryVariableProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this QueryVariableProperties. - - :param type: The type of this QueryVariableProperties. - :type: str - """ # noqa: E501 - self._type = type - - @property - def values(self): - """Get the values of this QueryVariableProperties. - - :return: The values of this QueryVariableProperties. - :rtype: QueryVariablePropertiesValues - """ # noqa: E501 - return self._values - - @values.setter - def values(self, values): - """Set the values of this QueryVariableProperties. - - :param values: The values of this QueryVariableProperties. - :type: QueryVariablePropertiesValues - """ # noqa: E501 - self._values = values - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, QueryVariableProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/query_variable_properties_values.py b/frogpilot/third_party/influxdb_client/domain/query_variable_properties_values.py deleted file mode 100644 index a06a174e8..000000000 --- a/frogpilot/third_party/influxdb_client/domain/query_variable_properties_values.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class QueryVariablePropertiesValues(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'query': 'str', - 'language': 'str' - } - - attribute_map = { - 'query': 'query', - 'language': 'language' - } - - def __init__(self, query=None, language=None): # noqa: E501,D401,D403 - """QueryVariablePropertiesValues - a model defined in OpenAPI.""" # noqa: E501 - self._query = None - self._language = None - self.discriminator = None - - if query is not None: - self.query = query - if language is not None: - self.language = language - - @property - def query(self): - """Get the query of this QueryVariablePropertiesValues. - - :return: The query of this QueryVariablePropertiesValues. - :rtype: str - """ # noqa: E501 - return self._query - - @query.setter - def query(self, query): - """Set the query of this QueryVariablePropertiesValues. - - :param query: The query of this QueryVariablePropertiesValues. - :type: str - """ # noqa: E501 - self._query = query - - @property - def language(self): - """Get the language of this QueryVariablePropertiesValues. - - :return: The language of this QueryVariablePropertiesValues. - :rtype: str - """ # noqa: E501 - return self._language - - @language.setter - def language(self, language): - """Set the language of this QueryVariablePropertiesValues. - - :param language: The language of this QueryVariablePropertiesValues. - :type: str - """ # noqa: E501 - self._language = language - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, QueryVariablePropertiesValues): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/range_threshold.py b/frogpilot/third_party/influxdb_client/domain/range_threshold.py deleted file mode 100644 index 68e19860c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/range_threshold.py +++ /dev/null @@ -1,188 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.threshold_base import ThresholdBase - - -class RangeThreshold(ThresholdBase): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'min': 'float', - 'max': 'float', - 'within': 'bool', - 'level': 'CheckStatusLevel', - 'all_values': 'bool' - } - - attribute_map = { - 'type': 'type', - 'min': 'min', - 'max': 'max', - 'within': 'within', - 'level': 'level', - 'all_values': 'allValues' - } - - def __init__(self, type="range", min=None, max=None, within=None, level=None, all_values=None): # noqa: E501,D401,D403 - """RangeThreshold - a model defined in OpenAPI.""" # noqa: E501 - ThresholdBase.__init__(self, level=level, all_values=all_values) # noqa: E501 - - self._type = None - self._min = None - self._max = None - self._within = None - self.discriminator = None - - self.type = type - self.min = min - self.max = max - self.within = within - - @property - def type(self): - """Get the type of this RangeThreshold. - - :return: The type of this RangeThreshold. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this RangeThreshold. - - :param type: The type of this RangeThreshold. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def min(self): - """Get the min of this RangeThreshold. - - :return: The min of this RangeThreshold. - :rtype: float - """ # noqa: E501 - return self._min - - @min.setter - def min(self, min): - """Set the min of this RangeThreshold. - - :param min: The min of this RangeThreshold. - :type: float - """ # noqa: E501 - if min is None: - raise ValueError("Invalid value for `min`, must not be `None`") # noqa: E501 - self._min = min - - @property - def max(self): - """Get the max of this RangeThreshold. - - :return: The max of this RangeThreshold. - :rtype: float - """ # noqa: E501 - return self._max - - @max.setter - def max(self, max): - """Set the max of this RangeThreshold. - - :param max: The max of this RangeThreshold. - :type: float - """ # noqa: E501 - if max is None: - raise ValueError("Invalid value for `max`, must not be `None`") # noqa: E501 - self._max = max - - @property - def within(self): - """Get the within of this RangeThreshold. - - :return: The within of this RangeThreshold. - :rtype: bool - """ # noqa: E501 - return self._within - - @within.setter - def within(self, within): - """Set the within of this RangeThreshold. - - :param within: The within of this RangeThreshold. - :type: bool - """ # noqa: E501 - if within is None: - raise ValueError("Invalid value for `within`, must not be `None`") # noqa: E501 - self._within = within - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RangeThreshold): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/ready.py b/frogpilot/third_party/influxdb_client/domain/ready.py deleted file mode 100644 index 46c4d29bd..000000000 --- a/frogpilot/third_party/influxdb_client/domain/ready.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Ready(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'status': 'str', - 'started': 'datetime', - 'up': 'str' - } - - attribute_map = { - 'status': 'status', - 'started': 'started', - 'up': 'up' - } - - def __init__(self, status=None, started=None, up=None): # noqa: E501,D401,D403 - """Ready - a model defined in OpenAPI.""" # noqa: E501 - self._status = None - self._started = None - self._up = None - self.discriminator = None - - if status is not None: - self.status = status - if started is not None: - self.started = started - if up is not None: - self.up = up - - @property - def status(self): - """Get the status of this Ready. - - :return: The status of this Ready. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this Ready. - - :param status: The status of this Ready. - :type: str - """ # noqa: E501 - self._status = status - - @property - def started(self): - """Get the started of this Ready. - - :return: The started of this Ready. - :rtype: datetime - """ # noqa: E501 - return self._started - - @started.setter - def started(self, started): - """Set the started of this Ready. - - :param started: The started of this Ready. - :type: datetime - """ # noqa: E501 - self._started = started - - @property - def up(self): - """Get the up of this Ready. - - :return: The up of this Ready. - :rtype: str - """ # noqa: E501 - return self._up - - @up.setter - def up(self, up): - """Set the up of this Ready. - - :param up: The up of this Ready. - :type: str - """ # noqa: E501 - self._up = up - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Ready): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/regexp_literal.py b/frogpilot/third_party/influxdb_client/domain/regexp_literal.py deleted file mode 100644 index 95fe4cb16..000000000 --- a/frogpilot/third_party/influxdb_client/domain/regexp_literal.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class RegexpLiteral(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'value': 'str' - } - - attribute_map = { - 'type': 'type', - 'value': 'value' - } - - def __init__(self, type=None, value=None): # noqa: E501,D401,D403 - """RegexpLiteral - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._value = None - self.discriminator = None - - if type is not None: - self.type = type - if value is not None: - self.value = value - - @property - def type(self): - """Get the type of this RegexpLiteral. - - Type of AST node - - :return: The type of this RegexpLiteral. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this RegexpLiteral. - - Type of AST node - - :param type: The type of this RegexpLiteral. - :type: str - """ # noqa: E501 - self._type = type - - @property - def value(self): - """Get the value of this RegexpLiteral. - - :return: The value of this RegexpLiteral. - :rtype: str - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this RegexpLiteral. - - :param value: The value of this RegexpLiteral. - :type: str - """ # noqa: E501 - self._value = value - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RegexpLiteral): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/remote_connection.py b/frogpilot/third_party/influxdb_client/domain/remote_connection.py deleted file mode 100644 index e0c1785c3..000000000 --- a/frogpilot/third_party/influxdb_client/domain/remote_connection.py +++ /dev/null @@ -1,250 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class RemoteConnection(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'name': 'str', - 'org_id': 'str', - 'description': 'str', - 'remote_url': 'str', - 'remote_org_id': 'str', - 'allow_insecure_tls': 'bool' - } - - attribute_map = { - 'id': 'id', - 'name': 'name', - 'org_id': 'orgID', - 'description': 'description', - 'remote_url': 'remoteURL', - 'remote_org_id': 'remoteOrgID', - 'allow_insecure_tls': 'allowInsecureTLS' - } - - def __init__(self, id=None, name=None, org_id=None, description=None, remote_url=None, remote_org_id=None, allow_insecure_tls=False): # noqa: E501,D401,D403 - """RemoteConnection - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._name = None - self._org_id = None - self._description = None - self._remote_url = None - self._remote_org_id = None - self._allow_insecure_tls = None - self.discriminator = None - - self.id = id - self.name = name - self.org_id = org_id - if description is not None: - self.description = description - self.remote_url = remote_url - if remote_org_id is not None: - self.remote_org_id = remote_org_id - self.allow_insecure_tls = allow_insecure_tls - - @property - def id(self): - """Get the id of this RemoteConnection. - - :return: The id of this RemoteConnection. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this RemoteConnection. - - :param id: The id of this RemoteConnection. - :type: str - """ # noqa: E501 - if id is None: - raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 - self._id = id - - @property - def name(self): - """Get the name of this RemoteConnection. - - :return: The name of this RemoteConnection. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this RemoteConnection. - - :param name: The name of this RemoteConnection. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def org_id(self): - """Get the org_id of this RemoteConnection. - - :return: The org_id of this RemoteConnection. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this RemoteConnection. - - :param org_id: The org_id of this RemoteConnection. - :type: str - """ # noqa: E501 - if org_id is None: - raise ValueError("Invalid value for `org_id`, must not be `None`") # noqa: E501 - self._org_id = org_id - - @property - def description(self): - """Get the description of this RemoteConnection. - - :return: The description of this RemoteConnection. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this RemoteConnection. - - :param description: The description of this RemoteConnection. - :type: str - """ # noqa: E501 - self._description = description - - @property - def remote_url(self): - """Get the remote_url of this RemoteConnection. - - :return: The remote_url of this RemoteConnection. - :rtype: str - """ # noqa: E501 - return self._remote_url - - @remote_url.setter - def remote_url(self, remote_url): - """Set the remote_url of this RemoteConnection. - - :param remote_url: The remote_url of this RemoteConnection. - :type: str - """ # noqa: E501 - if remote_url is None: - raise ValueError("Invalid value for `remote_url`, must not be `None`") # noqa: E501 - self._remote_url = remote_url - - @property - def remote_org_id(self): - """Get the remote_org_id of this RemoteConnection. - - :return: The remote_org_id of this RemoteConnection. - :rtype: str - """ # noqa: E501 - return self._remote_org_id - - @remote_org_id.setter - def remote_org_id(self, remote_org_id): - """Set the remote_org_id of this RemoteConnection. - - :param remote_org_id: The remote_org_id of this RemoteConnection. - :type: str - """ # noqa: E501 - self._remote_org_id = remote_org_id - - @property - def allow_insecure_tls(self): - """Get the allow_insecure_tls of this RemoteConnection. - - :return: The allow_insecure_tls of this RemoteConnection. - :rtype: bool - """ # noqa: E501 - return self._allow_insecure_tls - - @allow_insecure_tls.setter - def allow_insecure_tls(self, allow_insecure_tls): - """Set the allow_insecure_tls of this RemoteConnection. - - :param allow_insecure_tls: The allow_insecure_tls of this RemoteConnection. - :type: bool - """ # noqa: E501 - if allow_insecure_tls is None: - raise ValueError("Invalid value for `allow_insecure_tls`, must not be `None`") # noqa: E501 - self._allow_insecure_tls = allow_insecure_tls - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RemoteConnection): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/remote_connection_creation_request.py b/frogpilot/third_party/influxdb_client/domain/remote_connection_creation_request.py deleted file mode 100644 index ba775362e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/remote_connection_creation_request.py +++ /dev/null @@ -1,250 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class RemoteConnectionCreationRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'org_id': 'str', - 'remote_url': 'str', - 'remote_api_token': 'str', - 'remote_org_id': 'str', - 'allow_insecure_tls': 'bool' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'org_id': 'orgID', - 'remote_url': 'remoteURL', - 'remote_api_token': 'remoteAPIToken', - 'remote_org_id': 'remoteOrgID', - 'allow_insecure_tls': 'allowInsecureTLS' - } - - def __init__(self, name=None, description=None, org_id=None, remote_url=None, remote_api_token=None, remote_org_id=None, allow_insecure_tls=False): # noqa: E501,D401,D403 - """RemoteConnectionCreationRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._org_id = None - self._remote_url = None - self._remote_api_token = None - self._remote_org_id = None - self._allow_insecure_tls = None - self.discriminator = None - - self.name = name - if description is not None: - self.description = description - self.org_id = org_id - self.remote_url = remote_url - self.remote_api_token = remote_api_token - if remote_org_id is not None: - self.remote_org_id = remote_org_id - self.allow_insecure_tls = allow_insecure_tls - - @property - def name(self): - """Get the name of this RemoteConnectionCreationRequest. - - :return: The name of this RemoteConnectionCreationRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this RemoteConnectionCreationRequest. - - :param name: The name of this RemoteConnectionCreationRequest. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this RemoteConnectionCreationRequest. - - :return: The description of this RemoteConnectionCreationRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this RemoteConnectionCreationRequest. - - :param description: The description of this RemoteConnectionCreationRequest. - :type: str - """ # noqa: E501 - self._description = description - - @property - def org_id(self): - """Get the org_id of this RemoteConnectionCreationRequest. - - :return: The org_id of this RemoteConnectionCreationRequest. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this RemoteConnectionCreationRequest. - - :param org_id: The org_id of this RemoteConnectionCreationRequest. - :type: str - """ # noqa: E501 - if org_id is None: - raise ValueError("Invalid value for `org_id`, must not be `None`") # noqa: E501 - self._org_id = org_id - - @property - def remote_url(self): - """Get the remote_url of this RemoteConnectionCreationRequest. - - :return: The remote_url of this RemoteConnectionCreationRequest. - :rtype: str - """ # noqa: E501 - return self._remote_url - - @remote_url.setter - def remote_url(self, remote_url): - """Set the remote_url of this RemoteConnectionCreationRequest. - - :param remote_url: The remote_url of this RemoteConnectionCreationRequest. - :type: str - """ # noqa: E501 - if remote_url is None: - raise ValueError("Invalid value for `remote_url`, must not be `None`") # noqa: E501 - self._remote_url = remote_url - - @property - def remote_api_token(self): - """Get the remote_api_token of this RemoteConnectionCreationRequest. - - :return: The remote_api_token of this RemoteConnectionCreationRequest. - :rtype: str - """ # noqa: E501 - return self._remote_api_token - - @remote_api_token.setter - def remote_api_token(self, remote_api_token): - """Set the remote_api_token of this RemoteConnectionCreationRequest. - - :param remote_api_token: The remote_api_token of this RemoteConnectionCreationRequest. - :type: str - """ # noqa: E501 - if remote_api_token is None: - raise ValueError("Invalid value for `remote_api_token`, must not be `None`") # noqa: E501 - self._remote_api_token = remote_api_token - - @property - def remote_org_id(self): - """Get the remote_org_id of this RemoteConnectionCreationRequest. - - :return: The remote_org_id of this RemoteConnectionCreationRequest. - :rtype: str - """ # noqa: E501 - return self._remote_org_id - - @remote_org_id.setter - def remote_org_id(self, remote_org_id): - """Set the remote_org_id of this RemoteConnectionCreationRequest. - - :param remote_org_id: The remote_org_id of this RemoteConnectionCreationRequest. - :type: str - """ # noqa: E501 - self._remote_org_id = remote_org_id - - @property - def allow_insecure_tls(self): - """Get the allow_insecure_tls of this RemoteConnectionCreationRequest. - - :return: The allow_insecure_tls of this RemoteConnectionCreationRequest. - :rtype: bool - """ # noqa: E501 - return self._allow_insecure_tls - - @allow_insecure_tls.setter - def allow_insecure_tls(self, allow_insecure_tls): - """Set the allow_insecure_tls of this RemoteConnectionCreationRequest. - - :param allow_insecure_tls: The allow_insecure_tls of this RemoteConnectionCreationRequest. - :type: bool - """ # noqa: E501 - if allow_insecure_tls is None: - raise ValueError("Invalid value for `allow_insecure_tls`, must not be `None`") # noqa: E501 - self._allow_insecure_tls = allow_insecure_tls - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RemoteConnectionCreationRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/remote_connection_update_request.py b/frogpilot/third_party/influxdb_client/domain/remote_connection_update_request.py deleted file mode 100644 index 54fd9f1c7..000000000 --- a/frogpilot/third_party/influxdb_client/domain/remote_connection_update_request.py +++ /dev/null @@ -1,222 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class RemoteConnectionUpdateRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'remote_url': 'str', - 'remote_api_token': 'str', - 'remote_org_id': 'str', - 'allow_insecure_tls': 'bool' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'remote_url': 'remoteURL', - 'remote_api_token': 'remoteAPIToken', - 'remote_org_id': 'remoteOrgID', - 'allow_insecure_tls': 'allowInsecureTLS' - } - - def __init__(self, name=None, description=None, remote_url=None, remote_api_token=None, remote_org_id=None, allow_insecure_tls=False): # noqa: E501,D401,D403 - """RemoteConnectionUpdateRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._remote_url = None - self._remote_api_token = None - self._remote_org_id = None - self._allow_insecure_tls = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - if remote_url is not None: - self.remote_url = remote_url - if remote_api_token is not None: - self.remote_api_token = remote_api_token - if remote_org_id is not None: - self.remote_org_id = remote_org_id - if allow_insecure_tls is not None: - self.allow_insecure_tls = allow_insecure_tls - - @property - def name(self): - """Get the name of this RemoteConnectionUpdateRequest. - - :return: The name of this RemoteConnectionUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this RemoteConnectionUpdateRequest. - - :param name: The name of this RemoteConnectionUpdateRequest. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this RemoteConnectionUpdateRequest. - - :return: The description of this RemoteConnectionUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this RemoteConnectionUpdateRequest. - - :param description: The description of this RemoteConnectionUpdateRequest. - :type: str - """ # noqa: E501 - self._description = description - - @property - def remote_url(self): - """Get the remote_url of this RemoteConnectionUpdateRequest. - - :return: The remote_url of this RemoteConnectionUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._remote_url - - @remote_url.setter - def remote_url(self, remote_url): - """Set the remote_url of this RemoteConnectionUpdateRequest. - - :param remote_url: The remote_url of this RemoteConnectionUpdateRequest. - :type: str - """ # noqa: E501 - self._remote_url = remote_url - - @property - def remote_api_token(self): - """Get the remote_api_token of this RemoteConnectionUpdateRequest. - - :return: The remote_api_token of this RemoteConnectionUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._remote_api_token - - @remote_api_token.setter - def remote_api_token(self, remote_api_token): - """Set the remote_api_token of this RemoteConnectionUpdateRequest. - - :param remote_api_token: The remote_api_token of this RemoteConnectionUpdateRequest. - :type: str - """ # noqa: E501 - self._remote_api_token = remote_api_token - - @property - def remote_org_id(self): - """Get the remote_org_id of this RemoteConnectionUpdateRequest. - - :return: The remote_org_id of this RemoteConnectionUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._remote_org_id - - @remote_org_id.setter - def remote_org_id(self, remote_org_id): - """Set the remote_org_id of this RemoteConnectionUpdateRequest. - - :param remote_org_id: The remote_org_id of this RemoteConnectionUpdateRequest. - :type: str - """ # noqa: E501 - self._remote_org_id = remote_org_id - - @property - def allow_insecure_tls(self): - """Get the allow_insecure_tls of this RemoteConnectionUpdateRequest. - - :return: The allow_insecure_tls of this RemoteConnectionUpdateRequest. - :rtype: bool - """ # noqa: E501 - return self._allow_insecure_tls - - @allow_insecure_tls.setter - def allow_insecure_tls(self, allow_insecure_tls): - """Set the allow_insecure_tls of this RemoteConnectionUpdateRequest. - - :param allow_insecure_tls: The allow_insecure_tls of this RemoteConnectionUpdateRequest. - :type: bool - """ # noqa: E501 - self._allow_insecure_tls = allow_insecure_tls - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RemoteConnectionUpdateRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/remote_connections.py b/frogpilot/third_party/influxdb_client/domain/remote_connections.py deleted file mode 100644 index ca6d30ce7..000000000 --- a/frogpilot/third_party/influxdb_client/domain/remote_connections.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class RemoteConnections(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'remotes': 'list[RemoteConnection]' - } - - attribute_map = { - 'remotes': 'remotes' - } - - def __init__(self, remotes=None): # noqa: E501,D401,D403 - """RemoteConnections - a model defined in OpenAPI.""" # noqa: E501 - self._remotes = None - self.discriminator = None - - if remotes is not None: - self.remotes = remotes - - @property - def remotes(self): - """Get the remotes of this RemoteConnections. - - :return: The remotes of this RemoteConnections. - :rtype: list[RemoteConnection] - """ # noqa: E501 - return self._remotes - - @remotes.setter - def remotes(self, remotes): - """Set the remotes of this RemoteConnections. - - :param remotes: The remotes of this RemoteConnections. - :type: list[RemoteConnection] - """ # noqa: E501 - self._remotes = remotes - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RemoteConnections): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/renamable_field.py b/frogpilot/third_party/influxdb_client/domain/renamable_field.py deleted file mode 100644 index 088cea3db..000000000 --- a/frogpilot/third_party/influxdb_client/domain/renamable_field.py +++ /dev/null @@ -1,165 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class RenamableField(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'internal_name': 'str', - 'display_name': 'str', - 'visible': 'bool' - } - - attribute_map = { - 'internal_name': 'internalName', - 'display_name': 'displayName', - 'visible': 'visible' - } - - def __init__(self, internal_name=None, display_name=None, visible=None): # noqa: E501,D401,D403 - """RenamableField - a model defined in OpenAPI.""" # noqa: E501 - self._internal_name = None - self._display_name = None - self._visible = None - self.discriminator = None - - if internal_name is not None: - self.internal_name = internal_name - if display_name is not None: - self.display_name = display_name - if visible is not None: - self.visible = visible - - @property - def internal_name(self): - """Get the internal_name of this RenamableField. - - The calculated name of a field. - - :return: The internal_name of this RenamableField. - :rtype: str - """ # noqa: E501 - return self._internal_name - - @internal_name.setter - def internal_name(self, internal_name): - """Set the internal_name of this RenamableField. - - The calculated name of a field. - - :param internal_name: The internal_name of this RenamableField. - :type: str - """ # noqa: E501 - self._internal_name = internal_name - - @property - def display_name(self): - """Get the display_name of this RenamableField. - - The name that a field is renamed to by the user. - - :return: The display_name of this RenamableField. - :rtype: str - """ # noqa: E501 - return self._display_name - - @display_name.setter - def display_name(self, display_name): - """Set the display_name of this RenamableField. - - The name that a field is renamed to by the user. - - :param display_name: The display_name of this RenamableField. - :type: str - """ # noqa: E501 - self._display_name = display_name - - @property - def visible(self): - """Get the visible of this RenamableField. - - Indicates whether this field should be visible on the table. - - :return: The visible of this RenamableField. - :rtype: bool - """ # noqa: E501 - return self._visible - - @visible.setter - def visible(self, visible): - """Set the visible of this RenamableField. - - Indicates whether this field should be visible on the table. - - :param visible: The visible of this RenamableField. - :type: bool - """ # noqa: E501 - self._visible = visible - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RenamableField): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/replication.py b/frogpilot/third_party/influxdb_client/domain/replication.py deleted file mode 100644 index fea45ca38..000000000 --- a/frogpilot/third_party/influxdb_client/domain/replication.py +++ /dev/null @@ -1,412 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Replication(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'name': 'str', - 'description': 'str', - 'org_id': 'str', - 'remote_id': 'str', - 'local_bucket_id': 'str', - 'remote_bucket_id': 'str', - 'remote_bucket_name': 'str', - 'max_queue_size_bytes': 'int', - 'current_queue_size_bytes': 'int', - 'remaining_bytes_to_be_synced': 'int', - 'latest_response_code': 'int', - 'latest_error_message': 'str', - 'drop_non_retryable_data': 'bool' - } - - attribute_map = { - 'id': 'id', - 'name': 'name', - 'description': 'description', - 'org_id': 'orgID', - 'remote_id': 'remoteID', - 'local_bucket_id': 'localBucketID', - 'remote_bucket_id': 'remoteBucketID', - 'remote_bucket_name': 'remoteBucketName', - 'max_queue_size_bytes': 'maxQueueSizeBytes', - 'current_queue_size_bytes': 'currentQueueSizeBytes', - 'remaining_bytes_to_be_synced': 'remainingBytesToBeSynced', - 'latest_response_code': 'latestResponseCode', - 'latest_error_message': 'latestErrorMessage', - 'drop_non_retryable_data': 'dropNonRetryableData' - } - - def __init__(self, id=None, name=None, description=None, org_id=None, remote_id=None, local_bucket_id=None, remote_bucket_id=None, remote_bucket_name=None, max_queue_size_bytes=None, current_queue_size_bytes=None, remaining_bytes_to_be_synced=None, latest_response_code=None, latest_error_message=None, drop_non_retryable_data=None): # noqa: E501,D401,D403 - """Replication - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._name = None - self._description = None - self._org_id = None - self._remote_id = None - self._local_bucket_id = None - self._remote_bucket_id = None - self._remote_bucket_name = None - self._max_queue_size_bytes = None - self._current_queue_size_bytes = None - self._remaining_bytes_to_be_synced = None - self._latest_response_code = None - self._latest_error_message = None - self._drop_non_retryable_data = None - self.discriminator = None - - self.id = id - self.name = name - if description is not None: - self.description = description - self.org_id = org_id - self.remote_id = remote_id - self.local_bucket_id = local_bucket_id - if remote_bucket_id is not None: - self.remote_bucket_id = remote_bucket_id - if remote_bucket_name is not None: - self.remote_bucket_name = remote_bucket_name - self.max_queue_size_bytes = max_queue_size_bytes - if current_queue_size_bytes is not None: - self.current_queue_size_bytes = current_queue_size_bytes - if remaining_bytes_to_be_synced is not None: - self.remaining_bytes_to_be_synced = remaining_bytes_to_be_synced - if latest_response_code is not None: - self.latest_response_code = latest_response_code - if latest_error_message is not None: - self.latest_error_message = latest_error_message - if drop_non_retryable_data is not None: - self.drop_non_retryable_data = drop_non_retryable_data - - @property - def id(self): - """Get the id of this Replication. - - :return: The id of this Replication. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Replication. - - :param id: The id of this Replication. - :type: str - """ # noqa: E501 - if id is None: - raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 - self._id = id - - @property - def name(self): - """Get the name of this Replication. - - :return: The name of this Replication. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this Replication. - - :param name: The name of this Replication. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this Replication. - - :return: The description of this Replication. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this Replication. - - :param description: The description of this Replication. - :type: str - """ # noqa: E501 - self._description = description - - @property - def org_id(self): - """Get the org_id of this Replication. - - :return: The org_id of this Replication. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this Replication. - - :param org_id: The org_id of this Replication. - :type: str - """ # noqa: E501 - if org_id is None: - raise ValueError("Invalid value for `org_id`, must not be `None`") # noqa: E501 - self._org_id = org_id - - @property - def remote_id(self): - """Get the remote_id of this Replication. - - :return: The remote_id of this Replication. - :rtype: str - """ # noqa: E501 - return self._remote_id - - @remote_id.setter - def remote_id(self, remote_id): - """Set the remote_id of this Replication. - - :param remote_id: The remote_id of this Replication. - :type: str - """ # noqa: E501 - if remote_id is None: - raise ValueError("Invalid value for `remote_id`, must not be `None`") # noqa: E501 - self._remote_id = remote_id - - @property - def local_bucket_id(self): - """Get the local_bucket_id of this Replication. - - :return: The local_bucket_id of this Replication. - :rtype: str - """ # noqa: E501 - return self._local_bucket_id - - @local_bucket_id.setter - def local_bucket_id(self, local_bucket_id): - """Set the local_bucket_id of this Replication. - - :param local_bucket_id: The local_bucket_id of this Replication. - :type: str - """ # noqa: E501 - if local_bucket_id is None: - raise ValueError("Invalid value for `local_bucket_id`, must not be `None`") # noqa: E501 - self._local_bucket_id = local_bucket_id - - @property - def remote_bucket_id(self): - """Get the remote_bucket_id of this Replication. - - :return: The remote_bucket_id of this Replication. - :rtype: str - """ # noqa: E501 - return self._remote_bucket_id - - @remote_bucket_id.setter - def remote_bucket_id(self, remote_bucket_id): - """Set the remote_bucket_id of this Replication. - - :param remote_bucket_id: The remote_bucket_id of this Replication. - :type: str - """ # noqa: E501 - self._remote_bucket_id = remote_bucket_id - - @property - def remote_bucket_name(self): - """Get the remote_bucket_name of this Replication. - - :return: The remote_bucket_name of this Replication. - :rtype: str - """ # noqa: E501 - return self._remote_bucket_name - - @remote_bucket_name.setter - def remote_bucket_name(self, remote_bucket_name): - """Set the remote_bucket_name of this Replication. - - :param remote_bucket_name: The remote_bucket_name of this Replication. - :type: str - """ # noqa: E501 - self._remote_bucket_name = remote_bucket_name - - @property - def max_queue_size_bytes(self): - """Get the max_queue_size_bytes of this Replication. - - :return: The max_queue_size_bytes of this Replication. - :rtype: int - """ # noqa: E501 - return self._max_queue_size_bytes - - @max_queue_size_bytes.setter - def max_queue_size_bytes(self, max_queue_size_bytes): - """Set the max_queue_size_bytes of this Replication. - - :param max_queue_size_bytes: The max_queue_size_bytes of this Replication. - :type: int - """ # noqa: E501 - if max_queue_size_bytes is None: - raise ValueError("Invalid value for `max_queue_size_bytes`, must not be `None`") # noqa: E501 - self._max_queue_size_bytes = max_queue_size_bytes - - @property - def current_queue_size_bytes(self): - """Get the current_queue_size_bytes of this Replication. - - :return: The current_queue_size_bytes of this Replication. - :rtype: int - """ # noqa: E501 - return self._current_queue_size_bytes - - @current_queue_size_bytes.setter - def current_queue_size_bytes(self, current_queue_size_bytes): - """Set the current_queue_size_bytes of this Replication. - - :param current_queue_size_bytes: The current_queue_size_bytes of this Replication. - :type: int - """ # noqa: E501 - self._current_queue_size_bytes = current_queue_size_bytes - - @property - def remaining_bytes_to_be_synced(self): - """Get the remaining_bytes_to_be_synced of this Replication. - - :return: The remaining_bytes_to_be_synced of this Replication. - :rtype: int - """ # noqa: E501 - return self._remaining_bytes_to_be_synced - - @remaining_bytes_to_be_synced.setter - def remaining_bytes_to_be_synced(self, remaining_bytes_to_be_synced): - """Set the remaining_bytes_to_be_synced of this Replication. - - :param remaining_bytes_to_be_synced: The remaining_bytes_to_be_synced of this Replication. - :type: int - """ # noqa: E501 - self._remaining_bytes_to_be_synced = remaining_bytes_to_be_synced - - @property - def latest_response_code(self): - """Get the latest_response_code of this Replication. - - :return: The latest_response_code of this Replication. - :rtype: int - """ # noqa: E501 - return self._latest_response_code - - @latest_response_code.setter - def latest_response_code(self, latest_response_code): - """Set the latest_response_code of this Replication. - - :param latest_response_code: The latest_response_code of this Replication. - :type: int - """ # noqa: E501 - self._latest_response_code = latest_response_code - - @property - def latest_error_message(self): - """Get the latest_error_message of this Replication. - - :return: The latest_error_message of this Replication. - :rtype: str - """ # noqa: E501 - return self._latest_error_message - - @latest_error_message.setter - def latest_error_message(self, latest_error_message): - """Set the latest_error_message of this Replication. - - :param latest_error_message: The latest_error_message of this Replication. - :type: str - """ # noqa: E501 - self._latest_error_message = latest_error_message - - @property - def drop_non_retryable_data(self): - """Get the drop_non_retryable_data of this Replication. - - :return: The drop_non_retryable_data of this Replication. - :rtype: bool - """ # noqa: E501 - return self._drop_non_retryable_data - - @drop_non_retryable_data.setter - def drop_non_retryable_data(self, drop_non_retryable_data): - """Set the drop_non_retryable_data of this Replication. - - :param drop_non_retryable_data: The drop_non_retryable_data of this Replication. - :type: bool - """ # noqa: E501 - self._drop_non_retryable_data = drop_non_retryable_data - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Replication): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/replication_creation_request.py b/frogpilot/third_party/influxdb_client/domain/replication_creation_request.py deleted file mode 100644 index 946f2c96a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/replication_creation_request.py +++ /dev/null @@ -1,324 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ReplicationCreationRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'org_id': 'str', - 'remote_id': 'str', - 'local_bucket_id': 'str', - 'remote_bucket_id': 'str', - 'remote_bucket_name': 'str', - 'max_queue_size_bytes': 'int', - 'drop_non_retryable_data': 'bool', - 'max_age_seconds': 'int' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'org_id': 'orgID', - 'remote_id': 'remoteID', - 'local_bucket_id': 'localBucketID', - 'remote_bucket_id': 'remoteBucketID', - 'remote_bucket_name': 'remoteBucketName', - 'max_queue_size_bytes': 'maxQueueSizeBytes', - 'drop_non_retryable_data': 'dropNonRetryableData', - 'max_age_seconds': 'maxAgeSeconds' - } - - def __init__(self, name=None, description=None, org_id=None, remote_id=None, local_bucket_id=None, remote_bucket_id=None, remote_bucket_name=None, max_queue_size_bytes=67108860, drop_non_retryable_data=False, max_age_seconds=604800): # noqa: E501,D401,D403 - """ReplicationCreationRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._org_id = None - self._remote_id = None - self._local_bucket_id = None - self._remote_bucket_id = None - self._remote_bucket_name = None - self._max_queue_size_bytes = None - self._drop_non_retryable_data = None - self._max_age_seconds = None - self.discriminator = None - - self.name = name - if description is not None: - self.description = description - self.org_id = org_id - self.remote_id = remote_id - self.local_bucket_id = local_bucket_id - if remote_bucket_id is not None: - self.remote_bucket_id = remote_bucket_id - if remote_bucket_name is not None: - self.remote_bucket_name = remote_bucket_name - self.max_queue_size_bytes = max_queue_size_bytes - if drop_non_retryable_data is not None: - self.drop_non_retryable_data = drop_non_retryable_data - self.max_age_seconds = max_age_seconds - - @property - def name(self): - """Get the name of this ReplicationCreationRequest. - - :return: The name of this ReplicationCreationRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this ReplicationCreationRequest. - - :param name: The name of this ReplicationCreationRequest. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this ReplicationCreationRequest. - - :return: The description of this ReplicationCreationRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this ReplicationCreationRequest. - - :param description: The description of this ReplicationCreationRequest. - :type: str - """ # noqa: E501 - self._description = description - - @property - def org_id(self): - """Get the org_id of this ReplicationCreationRequest. - - :return: The org_id of this ReplicationCreationRequest. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this ReplicationCreationRequest. - - :param org_id: The org_id of this ReplicationCreationRequest. - :type: str - """ # noqa: E501 - if org_id is None: - raise ValueError("Invalid value for `org_id`, must not be `None`") # noqa: E501 - self._org_id = org_id - - @property - def remote_id(self): - """Get the remote_id of this ReplicationCreationRequest. - - :return: The remote_id of this ReplicationCreationRequest. - :rtype: str - """ # noqa: E501 - return self._remote_id - - @remote_id.setter - def remote_id(self, remote_id): - """Set the remote_id of this ReplicationCreationRequest. - - :param remote_id: The remote_id of this ReplicationCreationRequest. - :type: str - """ # noqa: E501 - if remote_id is None: - raise ValueError("Invalid value for `remote_id`, must not be `None`") # noqa: E501 - self._remote_id = remote_id - - @property - def local_bucket_id(self): - """Get the local_bucket_id of this ReplicationCreationRequest. - - :return: The local_bucket_id of this ReplicationCreationRequest. - :rtype: str - """ # noqa: E501 - return self._local_bucket_id - - @local_bucket_id.setter - def local_bucket_id(self, local_bucket_id): - """Set the local_bucket_id of this ReplicationCreationRequest. - - :param local_bucket_id: The local_bucket_id of this ReplicationCreationRequest. - :type: str - """ # noqa: E501 - if local_bucket_id is None: - raise ValueError("Invalid value for `local_bucket_id`, must not be `None`") # noqa: E501 - self._local_bucket_id = local_bucket_id - - @property - def remote_bucket_id(self): - """Get the remote_bucket_id of this ReplicationCreationRequest. - - :return: The remote_bucket_id of this ReplicationCreationRequest. - :rtype: str - """ # noqa: E501 - return self._remote_bucket_id - - @remote_bucket_id.setter - def remote_bucket_id(self, remote_bucket_id): - """Set the remote_bucket_id of this ReplicationCreationRequest. - - :param remote_bucket_id: The remote_bucket_id of this ReplicationCreationRequest. - :type: str - """ # noqa: E501 - self._remote_bucket_id = remote_bucket_id - - @property - def remote_bucket_name(self): - """Get the remote_bucket_name of this ReplicationCreationRequest. - - :return: The remote_bucket_name of this ReplicationCreationRequest. - :rtype: str - """ # noqa: E501 - return self._remote_bucket_name - - @remote_bucket_name.setter - def remote_bucket_name(self, remote_bucket_name): - """Set the remote_bucket_name of this ReplicationCreationRequest. - - :param remote_bucket_name: The remote_bucket_name of this ReplicationCreationRequest. - :type: str - """ # noqa: E501 - self._remote_bucket_name = remote_bucket_name - - @property - def max_queue_size_bytes(self): - """Get the max_queue_size_bytes of this ReplicationCreationRequest. - - :return: The max_queue_size_bytes of this ReplicationCreationRequest. - :rtype: int - """ # noqa: E501 - return self._max_queue_size_bytes - - @max_queue_size_bytes.setter - def max_queue_size_bytes(self, max_queue_size_bytes): - """Set the max_queue_size_bytes of this ReplicationCreationRequest. - - :param max_queue_size_bytes: The max_queue_size_bytes of this ReplicationCreationRequest. - :type: int - """ # noqa: E501 - if max_queue_size_bytes is None: - raise ValueError("Invalid value for `max_queue_size_bytes`, must not be `None`") # noqa: E501 - if max_queue_size_bytes is not None and max_queue_size_bytes < 33554430: # noqa: E501 - raise ValueError("Invalid value for `max_queue_size_bytes`, must be a value greater than or equal to `33554430`") # noqa: E501 - self._max_queue_size_bytes = max_queue_size_bytes - - @property - def drop_non_retryable_data(self): - """Get the drop_non_retryable_data of this ReplicationCreationRequest. - - :return: The drop_non_retryable_data of this ReplicationCreationRequest. - :rtype: bool - """ # noqa: E501 - return self._drop_non_retryable_data - - @drop_non_retryable_data.setter - def drop_non_retryable_data(self, drop_non_retryable_data): - """Set the drop_non_retryable_data of this ReplicationCreationRequest. - - :param drop_non_retryable_data: The drop_non_retryable_data of this ReplicationCreationRequest. - :type: bool - """ # noqa: E501 - self._drop_non_retryable_data = drop_non_retryable_data - - @property - def max_age_seconds(self): - """Get the max_age_seconds of this ReplicationCreationRequest. - - :return: The max_age_seconds of this ReplicationCreationRequest. - :rtype: int - """ # noqa: E501 - return self._max_age_seconds - - @max_age_seconds.setter - def max_age_seconds(self, max_age_seconds): - """Set the max_age_seconds of this ReplicationCreationRequest. - - :param max_age_seconds: The max_age_seconds of this ReplicationCreationRequest. - :type: int - """ # noqa: E501 - if max_age_seconds is None: - raise ValueError("Invalid value for `max_age_seconds`, must not be `None`") # noqa: E501 - if max_age_seconds is not None and max_age_seconds < 0: # noqa: E501 - raise ValueError("Invalid value for `max_age_seconds`, must be a value greater than or equal to `0`") # noqa: E501 - self._max_age_seconds = max_age_seconds - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ReplicationCreationRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/replication_update_request.py b/frogpilot/third_party/influxdb_client/domain/replication_update_request.py deleted file mode 100644 index 0c40c1173..000000000 --- a/frogpilot/third_party/influxdb_client/domain/replication_update_request.py +++ /dev/null @@ -1,272 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ReplicationUpdateRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'remote_id': 'str', - 'remote_bucket_id': 'str', - 'remote_bucket_name': 'str', - 'max_queue_size_bytes': 'int', - 'drop_non_retryable_data': 'bool', - 'max_age_seconds': 'int' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'remote_id': 'remoteID', - 'remote_bucket_id': 'remoteBucketID', - 'remote_bucket_name': 'remoteBucketName', - 'max_queue_size_bytes': 'maxQueueSizeBytes', - 'drop_non_retryable_data': 'dropNonRetryableData', - 'max_age_seconds': 'maxAgeSeconds' - } - - def __init__(self, name=None, description=None, remote_id=None, remote_bucket_id=None, remote_bucket_name=None, max_queue_size_bytes=None, drop_non_retryable_data=None, max_age_seconds=None): # noqa: E501,D401,D403 - """ReplicationUpdateRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._remote_id = None - self._remote_bucket_id = None - self._remote_bucket_name = None - self._max_queue_size_bytes = None - self._drop_non_retryable_data = None - self._max_age_seconds = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - if remote_id is not None: - self.remote_id = remote_id - if remote_bucket_id is not None: - self.remote_bucket_id = remote_bucket_id - if remote_bucket_name is not None: - self.remote_bucket_name = remote_bucket_name - if max_queue_size_bytes is not None: - self.max_queue_size_bytes = max_queue_size_bytes - if drop_non_retryable_data is not None: - self.drop_non_retryable_data = drop_non_retryable_data - if max_age_seconds is not None: - self.max_age_seconds = max_age_seconds - - @property - def name(self): - """Get the name of this ReplicationUpdateRequest. - - :return: The name of this ReplicationUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this ReplicationUpdateRequest. - - :param name: The name of this ReplicationUpdateRequest. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this ReplicationUpdateRequest. - - :return: The description of this ReplicationUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this ReplicationUpdateRequest. - - :param description: The description of this ReplicationUpdateRequest. - :type: str - """ # noqa: E501 - self._description = description - - @property - def remote_id(self): - """Get the remote_id of this ReplicationUpdateRequest. - - :return: The remote_id of this ReplicationUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._remote_id - - @remote_id.setter - def remote_id(self, remote_id): - """Set the remote_id of this ReplicationUpdateRequest. - - :param remote_id: The remote_id of this ReplicationUpdateRequest. - :type: str - """ # noqa: E501 - self._remote_id = remote_id - - @property - def remote_bucket_id(self): - """Get the remote_bucket_id of this ReplicationUpdateRequest. - - :return: The remote_bucket_id of this ReplicationUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._remote_bucket_id - - @remote_bucket_id.setter - def remote_bucket_id(self, remote_bucket_id): - """Set the remote_bucket_id of this ReplicationUpdateRequest. - - :param remote_bucket_id: The remote_bucket_id of this ReplicationUpdateRequest. - :type: str - """ # noqa: E501 - self._remote_bucket_id = remote_bucket_id - - @property - def remote_bucket_name(self): - """Get the remote_bucket_name of this ReplicationUpdateRequest. - - :return: The remote_bucket_name of this ReplicationUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._remote_bucket_name - - @remote_bucket_name.setter - def remote_bucket_name(self, remote_bucket_name): - """Set the remote_bucket_name of this ReplicationUpdateRequest. - - :param remote_bucket_name: The remote_bucket_name of this ReplicationUpdateRequest. - :type: str - """ # noqa: E501 - self._remote_bucket_name = remote_bucket_name - - @property - def max_queue_size_bytes(self): - """Get the max_queue_size_bytes of this ReplicationUpdateRequest. - - :return: The max_queue_size_bytes of this ReplicationUpdateRequest. - :rtype: int - """ # noqa: E501 - return self._max_queue_size_bytes - - @max_queue_size_bytes.setter - def max_queue_size_bytes(self, max_queue_size_bytes): - """Set the max_queue_size_bytes of this ReplicationUpdateRequest. - - :param max_queue_size_bytes: The max_queue_size_bytes of this ReplicationUpdateRequest. - :type: int - """ # noqa: E501 - if max_queue_size_bytes is not None and max_queue_size_bytes < 33554430: # noqa: E501 - raise ValueError("Invalid value for `max_queue_size_bytes`, must be a value greater than or equal to `33554430`") # noqa: E501 - self._max_queue_size_bytes = max_queue_size_bytes - - @property - def drop_non_retryable_data(self): - """Get the drop_non_retryable_data of this ReplicationUpdateRequest. - - :return: The drop_non_retryable_data of this ReplicationUpdateRequest. - :rtype: bool - """ # noqa: E501 - return self._drop_non_retryable_data - - @drop_non_retryable_data.setter - def drop_non_retryable_data(self, drop_non_retryable_data): - """Set the drop_non_retryable_data of this ReplicationUpdateRequest. - - :param drop_non_retryable_data: The drop_non_retryable_data of this ReplicationUpdateRequest. - :type: bool - """ # noqa: E501 - self._drop_non_retryable_data = drop_non_retryable_data - - @property - def max_age_seconds(self): - """Get the max_age_seconds of this ReplicationUpdateRequest. - - :return: The max_age_seconds of this ReplicationUpdateRequest. - :rtype: int - """ # noqa: E501 - return self._max_age_seconds - - @max_age_seconds.setter - def max_age_seconds(self, max_age_seconds): - """Set the max_age_seconds of this ReplicationUpdateRequest. - - :param max_age_seconds: The max_age_seconds of this ReplicationUpdateRequest. - :type: int - """ # noqa: E501 - if max_age_seconds is not None and max_age_seconds < 0: # noqa: E501 - raise ValueError("Invalid value for `max_age_seconds`, must be a value greater than or equal to `0`") # noqa: E501 - self._max_age_seconds = max_age_seconds - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ReplicationUpdateRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/replications.py b/frogpilot/third_party/influxdb_client/domain/replications.py deleted file mode 100644 index d81cd4539..000000000 --- a/frogpilot/third_party/influxdb_client/domain/replications.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Replications(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'replications': 'list[Replication]' - } - - attribute_map = { - 'replications': 'replications' - } - - def __init__(self, replications=None): # noqa: E501,D401,D403 - """Replications - a model defined in OpenAPI.""" # noqa: E501 - self._replications = None - self.discriminator = None - - if replications is not None: - self.replications = replications - - @property - def replications(self): - """Get the replications of this Replications. - - :return: The replications of this Replications. - :rtype: list[Replication] - """ # noqa: E501 - return self._replications - - @replications.setter - def replications(self, replications): - """Set the replications of this Replications. - - :param replications: The replications of this Replications. - :type: list[Replication] - """ # noqa: E501 - self._replications = replications - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Replications): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/resource_member.py b/frogpilot/third_party/influxdb_client/domain/resource_member.py deleted file mode 100644 index 26e26d732..000000000 --- a/frogpilot/third_party/influxdb_client/domain/resource_member.py +++ /dev/null @@ -1,119 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.user_response import UserResponse - - -class ResourceMember(UserResponse): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'role': 'str', - 'id': 'str', - 'name': 'str', - 'status': 'str', - 'links': 'UserResponseLinks' - } - - attribute_map = { - 'role': 'role', - 'id': 'id', - 'name': 'name', - 'status': 'status', - 'links': 'links' - } - - def __init__(self, role='member', id=None, name=None, status='active', links=None): # noqa: E501,D401,D403 - """ResourceMember - a model defined in OpenAPI.""" # noqa: E501 - UserResponse.__init__(self, id=id, name=name, status=status, links=links) # noqa: E501 - - self._role = None - self.discriminator = None - - if role is not None: - self.role = role - - @property - def role(self): - """Get the role of this ResourceMember. - - :return: The role of this ResourceMember. - :rtype: str - """ # noqa: E501 - return self._role - - @role.setter - def role(self, role): - """Set the role of this ResourceMember. - - :param role: The role of this ResourceMember. - :type: str - """ # noqa: E501 - self._role = role - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ResourceMember): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/resource_members.py b/frogpilot/third_party/influxdb_client/domain/resource_members.py deleted file mode 100644 index 5fde29a9d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/resource_members.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ResourceMembers(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'ResourceMembersLinks', - 'users': 'list[ResourceMember]' - } - - attribute_map = { - 'links': 'links', - 'users': 'users' - } - - def __init__(self, links=None, users=None): # noqa: E501,D401,D403 - """ResourceMembers - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._users = None - self.discriminator = None - - if links is not None: - self.links = links - if users is not None: - self.users = users - - @property - def links(self): - """Get the links of this ResourceMembers. - - :return: The links of this ResourceMembers. - :rtype: ResourceMembersLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this ResourceMembers. - - :param links: The links of this ResourceMembers. - :type: ResourceMembersLinks - """ # noqa: E501 - self._links = links - - @property - def users(self): - """Get the users of this ResourceMembers. - - :return: The users of this ResourceMembers. - :rtype: list[ResourceMember] - """ # noqa: E501 - return self._users - - @users.setter - def users(self, users): - """Set the users of this ResourceMembers. - - :param users: The users of this ResourceMembers. - :type: list[ResourceMember] - """ # noqa: E501 - self._users = users - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ResourceMembers): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/resource_members_links.py b/frogpilot/third_party/influxdb_client/domain/resource_members_links.py deleted file mode 100644 index 26820bb5a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/resource_members_links.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ResourceMembersLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str' - } - - attribute_map = { - '_self': 'self' - } - - def __init__(self, _self=None): # noqa: E501,D401,D403 - """ResourceMembersLinks - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self.discriminator = None - - if _self is not None: - self._self = _self - - @property - def _self(self): - """Get the _self of this ResourceMembersLinks. - - :return: The _self of this ResourceMembersLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this ResourceMembersLinks. - - :param _self: The _self of this ResourceMembersLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ResourceMembersLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/resource_owner.py b/frogpilot/third_party/influxdb_client/domain/resource_owner.py deleted file mode 100644 index 2f73cd7bf..000000000 --- a/frogpilot/third_party/influxdb_client/domain/resource_owner.py +++ /dev/null @@ -1,119 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.user_response import UserResponse - - -class ResourceOwner(UserResponse): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'role': 'str', - 'id': 'str', - 'name': 'str', - 'status': 'str', - 'links': 'UserResponseLinks' - } - - attribute_map = { - 'role': 'role', - 'id': 'id', - 'name': 'name', - 'status': 'status', - 'links': 'links' - } - - def __init__(self, role='owner', id=None, name=None, status='active', links=None): # noqa: E501,D401,D403 - """ResourceOwner - a model defined in OpenAPI.""" # noqa: E501 - UserResponse.__init__(self, id=id, name=name, status=status, links=links) # noqa: E501 - - self._role = None - self.discriminator = None - - if role is not None: - self.role = role - - @property - def role(self): - """Get the role of this ResourceOwner. - - :return: The role of this ResourceOwner. - :rtype: str - """ # noqa: E501 - return self._role - - @role.setter - def role(self, role): - """Set the role of this ResourceOwner. - - :param role: The role of this ResourceOwner. - :type: str - """ # noqa: E501 - self._role = role - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ResourceOwner): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/resource_owners.py b/frogpilot/third_party/influxdb_client/domain/resource_owners.py deleted file mode 100644 index 84a85ff64..000000000 --- a/frogpilot/third_party/influxdb_client/domain/resource_owners.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ResourceOwners(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'ResourceMembersLinks', - 'users': 'list[ResourceOwner]' - } - - attribute_map = { - 'links': 'links', - 'users': 'users' - } - - def __init__(self, links=None, users=None): # noqa: E501,D401,D403 - """ResourceOwners - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._users = None - self.discriminator = None - - if links is not None: - self.links = links - if users is not None: - self.users = users - - @property - def links(self): - """Get the links of this ResourceOwners. - - :return: The links of this ResourceOwners. - :rtype: ResourceMembersLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this ResourceOwners. - - :param links: The links of this ResourceOwners. - :type: ResourceMembersLinks - """ # noqa: E501 - self._links = links - - @property - def users(self): - """Get the users of this ResourceOwners. - - :return: The users of this ResourceOwners. - :rtype: list[ResourceOwner] - """ # noqa: E501 - return self._users - - @users.setter - def users(self, users): - """Set the users of this ResourceOwners. - - :param users: The users of this ResourceOwners. - :type: list[ResourceOwner] - """ # noqa: E501 - self._users = users - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ResourceOwners): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/restored_bucket_mappings.py b/frogpilot/third_party/influxdb_client/domain/restored_bucket_mappings.py deleted file mode 100644 index 2059cbc82..000000000 --- a/frogpilot/third_party/influxdb_client/domain/restored_bucket_mappings.py +++ /dev/null @@ -1,160 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class RestoredBucketMappings(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'name': 'str', - 'shard_mappings': 'list[BucketShardMapping]' - } - - attribute_map = { - 'id': 'id', - 'name': 'name', - 'shard_mappings': 'shardMappings' - } - - def __init__(self, id=None, name=None, shard_mappings=None): # noqa: E501,D401,D403 - """RestoredBucketMappings - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._name = None - self._shard_mappings = None - self.discriminator = None - - self.id = id - self.name = name - self.shard_mappings = shard_mappings - - @property - def id(self): - """Get the id of this RestoredBucketMappings. - - New ID of the restored bucket - - :return: The id of this RestoredBucketMappings. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this RestoredBucketMappings. - - New ID of the restored bucket - - :param id: The id of this RestoredBucketMappings. - :type: str - """ # noqa: E501 - if id is None: - raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 - self._id = id - - @property - def name(self): - """Get the name of this RestoredBucketMappings. - - :return: The name of this RestoredBucketMappings. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this RestoredBucketMappings. - - :param name: The name of this RestoredBucketMappings. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def shard_mappings(self): - """Get the shard_mappings of this RestoredBucketMappings. - - :return: The shard_mappings of this RestoredBucketMappings. - :rtype: list[BucketShardMapping] - """ # noqa: E501 - return self._shard_mappings - - @shard_mappings.setter - def shard_mappings(self, shard_mappings): - """Set the shard_mappings of this RestoredBucketMappings. - - :param shard_mappings: The shard_mappings of this RestoredBucketMappings. - :type: list[BucketShardMapping] - """ # noqa: E501 - if shard_mappings is None: - raise ValueError("Invalid value for `shard_mappings`, must not be `None`") # noqa: E501 - self._shard_mappings = shard_mappings - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RestoredBucketMappings): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/retention_policy_manifest.py b/frogpilot/third_party/influxdb_client/domain/retention_policy_manifest.py deleted file mode 100644 index a0b314c86..000000000 --- a/frogpilot/third_party/influxdb_client/domain/retention_policy_manifest.py +++ /dev/null @@ -1,228 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class RetentionPolicyManifest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'replica_n': 'int', - 'duration': 'int', - 'shard_group_duration': 'int', - 'shard_groups': 'list[ShardGroupManifest]', - 'subscriptions': 'list[SubscriptionManifest]' - } - - attribute_map = { - 'name': 'name', - 'replica_n': 'replicaN', - 'duration': 'duration', - 'shard_group_duration': 'shardGroupDuration', - 'shard_groups': 'shardGroups', - 'subscriptions': 'subscriptions' - } - - def __init__(self, name=None, replica_n=None, duration=None, shard_group_duration=None, shard_groups=None, subscriptions=None): # noqa: E501,D401,D403 - """RetentionPolicyManifest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._replica_n = None - self._duration = None - self._shard_group_duration = None - self._shard_groups = None - self._subscriptions = None - self.discriminator = None - - self.name = name - self.replica_n = replica_n - self.duration = duration - self.shard_group_duration = shard_group_duration - self.shard_groups = shard_groups - self.subscriptions = subscriptions - - @property - def name(self): - """Get the name of this RetentionPolicyManifest. - - :return: The name of this RetentionPolicyManifest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this RetentionPolicyManifest. - - :param name: The name of this RetentionPolicyManifest. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def replica_n(self): - """Get the replica_n of this RetentionPolicyManifest. - - :return: The replica_n of this RetentionPolicyManifest. - :rtype: int - """ # noqa: E501 - return self._replica_n - - @replica_n.setter - def replica_n(self, replica_n): - """Set the replica_n of this RetentionPolicyManifest. - - :param replica_n: The replica_n of this RetentionPolicyManifest. - :type: int - """ # noqa: E501 - if replica_n is None: - raise ValueError("Invalid value for `replica_n`, must not be `None`") # noqa: E501 - self._replica_n = replica_n - - @property - def duration(self): - """Get the duration of this RetentionPolicyManifest. - - :return: The duration of this RetentionPolicyManifest. - :rtype: int - """ # noqa: E501 - return self._duration - - @duration.setter - def duration(self, duration): - """Set the duration of this RetentionPolicyManifest. - - :param duration: The duration of this RetentionPolicyManifest. - :type: int - """ # noqa: E501 - if duration is None: - raise ValueError("Invalid value for `duration`, must not be `None`") # noqa: E501 - self._duration = duration - - @property - def shard_group_duration(self): - """Get the shard_group_duration of this RetentionPolicyManifest. - - :return: The shard_group_duration of this RetentionPolicyManifest. - :rtype: int - """ # noqa: E501 - return self._shard_group_duration - - @shard_group_duration.setter - def shard_group_duration(self, shard_group_duration): - """Set the shard_group_duration of this RetentionPolicyManifest. - - :param shard_group_duration: The shard_group_duration of this RetentionPolicyManifest. - :type: int - """ # noqa: E501 - if shard_group_duration is None: - raise ValueError("Invalid value for `shard_group_duration`, must not be `None`") # noqa: E501 - self._shard_group_duration = shard_group_duration - - @property - def shard_groups(self): - """Get the shard_groups of this RetentionPolicyManifest. - - :return: The shard_groups of this RetentionPolicyManifest. - :rtype: list[ShardGroupManifest] - """ # noqa: E501 - return self._shard_groups - - @shard_groups.setter - def shard_groups(self, shard_groups): - """Set the shard_groups of this RetentionPolicyManifest. - - :param shard_groups: The shard_groups of this RetentionPolicyManifest. - :type: list[ShardGroupManifest] - """ # noqa: E501 - if shard_groups is None: - raise ValueError("Invalid value for `shard_groups`, must not be `None`") # noqa: E501 - self._shard_groups = shard_groups - - @property - def subscriptions(self): - """Get the subscriptions of this RetentionPolicyManifest. - - :return: The subscriptions of this RetentionPolicyManifest. - :rtype: list[SubscriptionManifest] - """ # noqa: E501 - return self._subscriptions - - @subscriptions.setter - def subscriptions(self, subscriptions): - """Set the subscriptions of this RetentionPolicyManifest. - - :param subscriptions: The subscriptions of this RetentionPolicyManifest. - :type: list[SubscriptionManifest] - """ # noqa: E501 - if subscriptions is None: - raise ValueError("Invalid value for `subscriptions`, must not be `None`") # noqa: E501 - self._subscriptions = subscriptions - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RetentionPolicyManifest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/return_statement.py b/frogpilot/third_party/influxdb_client/domain/return_statement.py deleted file mode 100644 index aa4b48d9b..000000000 --- a/frogpilot/third_party/influxdb_client/domain/return_statement.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.statement import Statement - - -class ReturnStatement(Statement): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'argument': 'Expression' - } - - attribute_map = { - 'type': 'type', - 'argument': 'argument' - } - - def __init__(self, type=None, argument=None): # noqa: E501,D401,D403 - """ReturnStatement - a model defined in OpenAPI.""" # noqa: E501 - Statement.__init__(self) # noqa: E501 - - self._type = None - self._argument = None - self.discriminator = None - - if type is not None: - self.type = type - if argument is not None: - self.argument = argument - - @property - def type(self): - """Get the type of this ReturnStatement. - - Type of AST node - - :return: The type of this ReturnStatement. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this ReturnStatement. - - Type of AST node - - :param type: The type of this ReturnStatement. - :type: str - """ # noqa: E501 - self._type = type - - @property - def argument(self): - """Get the argument of this ReturnStatement. - - :return: The argument of this ReturnStatement. - :rtype: Expression - """ # noqa: E501 - return self._argument - - @argument.setter - def argument(self, argument): - """Set the argument of this ReturnStatement. - - :param argument: The argument of this ReturnStatement. - :type: Expression - """ # noqa: E501 - self._argument = argument - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ReturnStatement): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/routes.py b/frogpilot/third_party/influxdb_client/domain/routes.py deleted file mode 100644 index 2a7a77e68..000000000 --- a/frogpilot/third_party/influxdb_client/domain/routes.py +++ /dev/null @@ -1,498 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Routes(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'authorizations': 'str', - 'buckets': 'str', - 'dashboards': 'str', - 'external': 'RoutesExternal', - 'variables': 'str', - 'me': 'str', - 'flags': 'str', - 'orgs': 'str', - 'query': 'RoutesQuery', - 'setup': 'str', - 'signin': 'str', - 'signout': 'str', - 'sources': 'str', - 'system': 'RoutesSystem', - 'tasks': 'str', - 'telegrafs': 'str', - 'users': 'str', - 'write': 'str' - } - - attribute_map = { - 'authorizations': 'authorizations', - 'buckets': 'buckets', - 'dashboards': 'dashboards', - 'external': 'external', - 'variables': 'variables', - 'me': 'me', - 'flags': 'flags', - 'orgs': 'orgs', - 'query': 'query', - 'setup': 'setup', - 'signin': 'signin', - 'signout': 'signout', - 'sources': 'sources', - 'system': 'system', - 'tasks': 'tasks', - 'telegrafs': 'telegrafs', - 'users': 'users', - 'write': 'write' - } - - def __init__(self, authorizations=None, buckets=None, dashboards=None, external=None, variables=None, me=None, flags=None, orgs=None, query=None, setup=None, signin=None, signout=None, sources=None, system=None, tasks=None, telegrafs=None, users=None, write=None): # noqa: E501,D401,D403 - """Routes - a model defined in OpenAPI.""" # noqa: E501 - self._authorizations = None - self._buckets = None - self._dashboards = None - self._external = None - self._variables = None - self._me = None - self._flags = None - self._orgs = None - self._query = None - self._setup = None - self._signin = None - self._signout = None - self._sources = None - self._system = None - self._tasks = None - self._telegrafs = None - self._users = None - self._write = None - self.discriminator = None - - if authorizations is not None: - self.authorizations = authorizations - if buckets is not None: - self.buckets = buckets - if dashboards is not None: - self.dashboards = dashboards - if external is not None: - self.external = external - if variables is not None: - self.variables = variables - if me is not None: - self.me = me - if flags is not None: - self.flags = flags - if orgs is not None: - self.orgs = orgs - if query is not None: - self.query = query - if setup is not None: - self.setup = setup - if signin is not None: - self.signin = signin - if signout is not None: - self.signout = signout - if sources is not None: - self.sources = sources - if system is not None: - self.system = system - if tasks is not None: - self.tasks = tasks - if telegrafs is not None: - self.telegrafs = telegrafs - if users is not None: - self.users = users - if write is not None: - self.write = write - - @property - def authorizations(self): - """Get the authorizations of this Routes. - - :return: The authorizations of this Routes. - :rtype: str - """ # noqa: E501 - return self._authorizations - - @authorizations.setter - def authorizations(self, authorizations): - """Set the authorizations of this Routes. - - :param authorizations: The authorizations of this Routes. - :type: str - """ # noqa: E501 - self._authorizations = authorizations - - @property - def buckets(self): - """Get the buckets of this Routes. - - :return: The buckets of this Routes. - :rtype: str - """ # noqa: E501 - return self._buckets - - @buckets.setter - def buckets(self, buckets): - """Set the buckets of this Routes. - - :param buckets: The buckets of this Routes. - :type: str - """ # noqa: E501 - self._buckets = buckets - - @property - def dashboards(self): - """Get the dashboards of this Routes. - - :return: The dashboards of this Routes. - :rtype: str - """ # noqa: E501 - return self._dashboards - - @dashboards.setter - def dashboards(self, dashboards): - """Set the dashboards of this Routes. - - :param dashboards: The dashboards of this Routes. - :type: str - """ # noqa: E501 - self._dashboards = dashboards - - @property - def external(self): - """Get the external of this Routes. - - :return: The external of this Routes. - :rtype: RoutesExternal - """ # noqa: E501 - return self._external - - @external.setter - def external(self, external): - """Set the external of this Routes. - - :param external: The external of this Routes. - :type: RoutesExternal - """ # noqa: E501 - self._external = external - - @property - def variables(self): - """Get the variables of this Routes. - - :return: The variables of this Routes. - :rtype: str - """ # noqa: E501 - return self._variables - - @variables.setter - def variables(self, variables): - """Set the variables of this Routes. - - :param variables: The variables of this Routes. - :type: str - """ # noqa: E501 - self._variables = variables - - @property - def me(self): - """Get the me of this Routes. - - :return: The me of this Routes. - :rtype: str - """ # noqa: E501 - return self._me - - @me.setter - def me(self, me): - """Set the me of this Routes. - - :param me: The me of this Routes. - :type: str - """ # noqa: E501 - self._me = me - - @property - def flags(self): - """Get the flags of this Routes. - - :return: The flags of this Routes. - :rtype: str - """ # noqa: E501 - return self._flags - - @flags.setter - def flags(self, flags): - """Set the flags of this Routes. - - :param flags: The flags of this Routes. - :type: str - """ # noqa: E501 - self._flags = flags - - @property - def orgs(self): - """Get the orgs of this Routes. - - :return: The orgs of this Routes. - :rtype: str - """ # noqa: E501 - return self._orgs - - @orgs.setter - def orgs(self, orgs): - """Set the orgs of this Routes. - - :param orgs: The orgs of this Routes. - :type: str - """ # noqa: E501 - self._orgs = orgs - - @property - def query(self): - """Get the query of this Routes. - - :return: The query of this Routes. - :rtype: RoutesQuery - """ # noqa: E501 - return self._query - - @query.setter - def query(self, query): - """Set the query of this Routes. - - :param query: The query of this Routes. - :type: RoutesQuery - """ # noqa: E501 - self._query = query - - @property - def setup(self): - """Get the setup of this Routes. - - :return: The setup of this Routes. - :rtype: str - """ # noqa: E501 - return self._setup - - @setup.setter - def setup(self, setup): - """Set the setup of this Routes. - - :param setup: The setup of this Routes. - :type: str - """ # noqa: E501 - self._setup = setup - - @property - def signin(self): - """Get the signin of this Routes. - - :return: The signin of this Routes. - :rtype: str - """ # noqa: E501 - return self._signin - - @signin.setter - def signin(self, signin): - """Set the signin of this Routes. - - :param signin: The signin of this Routes. - :type: str - """ # noqa: E501 - self._signin = signin - - @property - def signout(self): - """Get the signout of this Routes. - - :return: The signout of this Routes. - :rtype: str - """ # noqa: E501 - return self._signout - - @signout.setter - def signout(self, signout): - """Set the signout of this Routes. - - :param signout: The signout of this Routes. - :type: str - """ # noqa: E501 - self._signout = signout - - @property - def sources(self): - """Get the sources of this Routes. - - :return: The sources of this Routes. - :rtype: str - """ # noqa: E501 - return self._sources - - @sources.setter - def sources(self, sources): - """Set the sources of this Routes. - - :param sources: The sources of this Routes. - :type: str - """ # noqa: E501 - self._sources = sources - - @property - def system(self): - """Get the system of this Routes. - - :return: The system of this Routes. - :rtype: RoutesSystem - """ # noqa: E501 - return self._system - - @system.setter - def system(self, system): - """Set the system of this Routes. - - :param system: The system of this Routes. - :type: RoutesSystem - """ # noqa: E501 - self._system = system - - @property - def tasks(self): - """Get the tasks of this Routes. - - :return: The tasks of this Routes. - :rtype: str - """ # noqa: E501 - return self._tasks - - @tasks.setter - def tasks(self, tasks): - """Set the tasks of this Routes. - - :param tasks: The tasks of this Routes. - :type: str - """ # noqa: E501 - self._tasks = tasks - - @property - def telegrafs(self): - """Get the telegrafs of this Routes. - - :return: The telegrafs of this Routes. - :rtype: str - """ # noqa: E501 - return self._telegrafs - - @telegrafs.setter - def telegrafs(self, telegrafs): - """Set the telegrafs of this Routes. - - :param telegrafs: The telegrafs of this Routes. - :type: str - """ # noqa: E501 - self._telegrafs = telegrafs - - @property - def users(self): - """Get the users of this Routes. - - :return: The users of this Routes. - :rtype: str - """ # noqa: E501 - return self._users - - @users.setter - def users(self, users): - """Set the users of this Routes. - - :param users: The users of this Routes. - :type: str - """ # noqa: E501 - self._users = users - - @property - def write(self): - """Get the write of this Routes. - - :return: The write of this Routes. - :rtype: str - """ # noqa: E501 - return self._write - - @write.setter - def write(self, write): - """Set the write of this Routes. - - :param write: The write of this Routes. - :type: str - """ # noqa: E501 - self._write = write - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Routes): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/routes_external.py b/frogpilot/third_party/influxdb_client/domain/routes_external.py deleted file mode 100644 index 87c49f980..000000000 --- a/frogpilot/third_party/influxdb_client/domain/routes_external.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class RoutesExternal(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'status_feed': 'str' - } - - attribute_map = { - 'status_feed': 'statusFeed' - } - - def __init__(self, status_feed=None): # noqa: E501,D401,D403 - """RoutesExternal - a model defined in OpenAPI.""" # noqa: E501 - self._status_feed = None - self.discriminator = None - - if status_feed is not None: - self.status_feed = status_feed - - @property - def status_feed(self): - """Get the status_feed of this RoutesExternal. - - :return: The status_feed of this RoutesExternal. - :rtype: str - """ # noqa: E501 - return self._status_feed - - @status_feed.setter - def status_feed(self, status_feed): - """Set the status_feed of this RoutesExternal. - - :param status_feed: The status_feed of this RoutesExternal. - :type: str - """ # noqa: E501 - self._status_feed = status_feed - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RoutesExternal): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/routes_query.py b/frogpilot/third_party/influxdb_client/domain/routes_query.py deleted file mode 100644 index 82ae34e17..000000000 --- a/frogpilot/third_party/influxdb_client/domain/routes_query.py +++ /dev/null @@ -1,176 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class RoutesQuery(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str', - 'ast': 'str', - 'analyze': 'str', - 'suggestions': 'str' - } - - attribute_map = { - '_self': 'self', - 'ast': 'ast', - 'analyze': 'analyze', - 'suggestions': 'suggestions' - } - - def __init__(self, _self=None, ast=None, analyze=None, suggestions=None): # noqa: E501,D401,D403 - """RoutesQuery - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self._ast = None - self._analyze = None - self._suggestions = None - self.discriminator = None - - if _self is not None: - self._self = _self - if ast is not None: - self.ast = ast - if analyze is not None: - self.analyze = analyze - if suggestions is not None: - self.suggestions = suggestions - - @property - def _self(self): - """Get the _self of this RoutesQuery. - - :return: The _self of this RoutesQuery. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this RoutesQuery. - - :param _self: The _self of this RoutesQuery. - :type: str - """ # noqa: E501 - self.__self = _self - - @property - def ast(self): - """Get the ast of this RoutesQuery. - - :return: The ast of this RoutesQuery. - :rtype: str - """ # noqa: E501 - return self._ast - - @ast.setter - def ast(self, ast): - """Set the ast of this RoutesQuery. - - :param ast: The ast of this RoutesQuery. - :type: str - """ # noqa: E501 - self._ast = ast - - @property - def analyze(self): - """Get the analyze of this RoutesQuery. - - :return: The analyze of this RoutesQuery. - :rtype: str - """ # noqa: E501 - return self._analyze - - @analyze.setter - def analyze(self, analyze): - """Set the analyze of this RoutesQuery. - - :param analyze: The analyze of this RoutesQuery. - :type: str - """ # noqa: E501 - self._analyze = analyze - - @property - def suggestions(self): - """Get the suggestions of this RoutesQuery. - - :return: The suggestions of this RoutesQuery. - :rtype: str - """ # noqa: E501 - return self._suggestions - - @suggestions.setter - def suggestions(self, suggestions): - """Set the suggestions of this RoutesQuery. - - :param suggestions: The suggestions of this RoutesQuery. - :type: str - """ # noqa: E501 - self._suggestions = suggestions - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RoutesQuery): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/routes_system.py b/frogpilot/third_party/influxdb_client/domain/routes_system.py deleted file mode 100644 index 73ac677b2..000000000 --- a/frogpilot/third_party/influxdb_client/domain/routes_system.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class RoutesSystem(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'metrics': 'str', - 'debug': 'str', - 'health': 'str' - } - - attribute_map = { - 'metrics': 'metrics', - 'debug': 'debug', - 'health': 'health' - } - - def __init__(self, metrics=None, debug=None, health=None): # noqa: E501,D401,D403 - """RoutesSystem - a model defined in OpenAPI.""" # noqa: E501 - self._metrics = None - self._debug = None - self._health = None - self.discriminator = None - - if metrics is not None: - self.metrics = metrics - if debug is not None: - self.debug = debug - if health is not None: - self.health = health - - @property - def metrics(self): - """Get the metrics of this RoutesSystem. - - :return: The metrics of this RoutesSystem. - :rtype: str - """ # noqa: E501 - return self._metrics - - @metrics.setter - def metrics(self, metrics): - """Set the metrics of this RoutesSystem. - - :param metrics: The metrics of this RoutesSystem. - :type: str - """ # noqa: E501 - self._metrics = metrics - - @property - def debug(self): - """Get the debug of this RoutesSystem. - - :return: The debug of this RoutesSystem. - :rtype: str - """ # noqa: E501 - return self._debug - - @debug.setter - def debug(self, debug): - """Set the debug of this RoutesSystem. - - :param debug: The debug of this RoutesSystem. - :type: str - """ # noqa: E501 - self._debug = debug - - @property - def health(self): - """Get the health of this RoutesSystem. - - :return: The health of this RoutesSystem. - :rtype: str - """ # noqa: E501 - return self._health - - @health.setter - def health(self, health): - """Set the health of this RoutesSystem. - - :param health: The health of this RoutesSystem. - :type: str - """ # noqa: E501 - self._health = health - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RoutesSystem): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/rule_status_level.py b/frogpilot/third_party/influxdb_client/domain/rule_status_level.py deleted file mode 100644 index 9d9f4249e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/rule_status_level.py +++ /dev/null @@ -1,92 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class RuleStatusLevel(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - UNKNOWN = "UNKNOWN" - OK = "OK" - INFO = "INFO" - CRIT = "CRIT" - WARN = "WARN" - ANY = "ANY" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """RuleStatusLevel - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RuleStatusLevel): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/run.py b/frogpilot/third_party/influxdb_client/domain/run.py deleted file mode 100644 index 32634aca6..000000000 --- a/frogpilot/third_party/influxdb_client/domain/run.py +++ /dev/null @@ -1,338 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Run(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'task_id': 'str', - 'status': 'str', - 'scheduled_for': 'datetime', - 'log': 'list[LogEvent]', - 'flux': 'str', - 'started_at': 'datetime', - 'finished_at': 'datetime', - 'requested_at': 'datetime', - 'links': 'RunLinks' - } - - attribute_map = { - 'id': 'id', - 'task_id': 'taskID', - 'status': 'status', - 'scheduled_for': 'scheduledFor', - 'log': 'log', - 'flux': 'flux', - 'started_at': 'startedAt', - 'finished_at': 'finishedAt', - 'requested_at': 'requestedAt', - 'links': 'links' - } - - def __init__(self, id=None, task_id=None, status=None, scheduled_for=None, log=None, flux=None, started_at=None, finished_at=None, requested_at=None, links=None): # noqa: E501,D401,D403 - """Run - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._task_id = None - self._status = None - self._scheduled_for = None - self._log = None - self._flux = None - self._started_at = None - self._finished_at = None - self._requested_at = None - self._links = None - self.discriminator = None - - if id is not None: - self.id = id - if task_id is not None: - self.task_id = task_id - if status is not None: - self.status = status - if scheduled_for is not None: - self.scheduled_for = scheduled_for - if log is not None: - self.log = log - if flux is not None: - self.flux = flux - if started_at is not None: - self.started_at = started_at - if finished_at is not None: - self.finished_at = finished_at - if requested_at is not None: - self.requested_at = requested_at - if links is not None: - self.links = links - - @property - def id(self): - """Get the id of this Run. - - :return: The id of this Run. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Run. - - :param id: The id of this Run. - :type: str - """ # noqa: E501 - self._id = id - - @property - def task_id(self): - """Get the task_id of this Run. - - :return: The task_id of this Run. - :rtype: str - """ # noqa: E501 - return self._task_id - - @task_id.setter - def task_id(self, task_id): - """Set the task_id of this Run. - - :param task_id: The task_id of this Run. - :type: str - """ # noqa: E501 - self._task_id = task_id - - @property - def status(self): - """Get the status of this Run. - - :return: The status of this Run. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this Run. - - :param status: The status of this Run. - :type: str - """ # noqa: E501 - self._status = status - - @property - def scheduled_for(self): - """Get the scheduled_for of this Run. - - The time [RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp) used for the run's `now` option. - - :return: The scheduled_for of this Run. - :rtype: datetime - """ # noqa: E501 - return self._scheduled_for - - @scheduled_for.setter - def scheduled_for(self, scheduled_for): - """Set the scheduled_for of this Run. - - The time [RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp) used for the run's `now` option. - - :param scheduled_for: The scheduled_for of this Run. - :type: datetime - """ # noqa: E501 - self._scheduled_for = scheduled_for - - @property - def log(self): - """Get the log of this Run. - - An array of logs associated with the run. - - :return: The log of this Run. - :rtype: list[LogEvent] - """ # noqa: E501 - return self._log - - @log.setter - def log(self, log): - """Set the log of this Run. - - An array of logs associated with the run. - - :param log: The log of this Run. - :type: list[LogEvent] - """ # noqa: E501 - self._log = log - - @property - def flux(self): - """Get the flux of this Run. - - Flux used for the task - - :return: The flux of this Run. - :rtype: str - """ # noqa: E501 - return self._flux - - @flux.setter - def flux(self, flux): - """Set the flux of this Run. - - Flux used for the task - - :param flux: The flux of this Run. - :type: str - """ # noqa: E501 - self._flux = flux - - @property - def started_at(self): - """Get the started_at of this Run. - - The time ([RFC3339Nano date/time format](https://go.dev/src/time/format.go)) the run started executing. - - :return: The started_at of this Run. - :rtype: datetime - """ # noqa: E501 - return self._started_at - - @started_at.setter - def started_at(self, started_at): - """Set the started_at of this Run. - - The time ([RFC3339Nano date/time format](https://go.dev/src/time/format.go)) the run started executing. - - :param started_at: The started_at of this Run. - :type: datetime - """ # noqa: E501 - self._started_at = started_at - - @property - def finished_at(self): - """Get the finished_at of this Run. - - The time ([RFC3339Nano date/time format](https://go.dev/src/time/format.go)) the run finished executing. - - :return: The finished_at of this Run. - :rtype: datetime - """ # noqa: E501 - return self._finished_at - - @finished_at.setter - def finished_at(self, finished_at): - """Set the finished_at of this Run. - - The time ([RFC3339Nano date/time format](https://go.dev/src/time/format.go)) the run finished executing. - - :param finished_at: The finished_at of this Run. - :type: datetime - """ # noqa: E501 - self._finished_at = finished_at - - @property - def requested_at(self): - """Get the requested_at of this Run. - - The time ([RFC3339Nano date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339nano-timestamp)) the run was manually requested. - - :return: The requested_at of this Run. - :rtype: datetime - """ # noqa: E501 - return self._requested_at - - @requested_at.setter - def requested_at(self, requested_at): - """Set the requested_at of this Run. - - The time ([RFC3339Nano date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339nano-timestamp)) the run was manually requested. - - :param requested_at: The requested_at of this Run. - :type: datetime - """ # noqa: E501 - self._requested_at = requested_at - - @property - def links(self): - """Get the links of this Run. - - :return: The links of this Run. - :rtype: RunLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Run. - - :param links: The links of this Run. - :type: RunLinks - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Run): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/run_links.py b/frogpilot/third_party/influxdb_client/domain/run_links.py deleted file mode 100644 index 08c0533f0..000000000 --- a/frogpilot/third_party/influxdb_client/domain/run_links.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class RunLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str', - 'task': 'str', - 'retry': 'str' - } - - attribute_map = { - '_self': 'self', - 'task': 'task', - 'retry': 'retry' - } - - def __init__(self, _self=None, task=None, retry=None): # noqa: E501,D401,D403 - """RunLinks - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self._task = None - self._retry = None - self.discriminator = None - - if _self is not None: - self._self = _self - if task is not None: - self.task = task - if retry is not None: - self.retry = retry - - @property - def _self(self): - """Get the _self of this RunLinks. - - :return: The _self of this RunLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this RunLinks. - - :param _self: The _self of this RunLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - @property - def task(self): - """Get the task of this RunLinks. - - :return: The task of this RunLinks. - :rtype: str - """ # noqa: E501 - return self._task - - @task.setter - def task(self, task): - """Set the task of this RunLinks. - - :param task: The task of this RunLinks. - :type: str - """ # noqa: E501 - self._task = task - - @property - def retry(self): - """Get the retry of this RunLinks. - - :return: The retry of this RunLinks. - :rtype: str - """ # noqa: E501 - return self._retry - - @retry.setter - def retry(self, retry): - """Set the retry of this RunLinks. - - :param retry: The retry of this RunLinks. - :type: str - """ # noqa: E501 - self._retry = retry - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RunLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/run_manually.py b/frogpilot/third_party/influxdb_client/domain/run_manually.py deleted file mode 100644 index c32608319..000000000 --- a/frogpilot/third_party/influxdb_client/domain/run_manually.py +++ /dev/null @@ -1,110 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class RunManually(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'scheduled_for': 'datetime' - } - - attribute_map = { - 'scheduled_for': 'scheduledFor' - } - - def __init__(self, scheduled_for=None): # noqa: E501,D401,D403 - """RunManually - a model defined in OpenAPI.""" # noqa: E501 - self._scheduled_for = None - self.discriminator = None - - self.scheduled_for = scheduled_for - - @property - def scheduled_for(self): - """Get the scheduled_for of this RunManually. - - The time [RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp) used for the run's `now` option. Default is the server _now_ time. - - :return: The scheduled_for of this RunManually. - :rtype: datetime - """ # noqa: E501 - return self._scheduled_for - - @scheduled_for.setter - def scheduled_for(self, scheduled_for): - """Set the scheduled_for of this RunManually. - - The time [RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp) used for the run's `now` option. Default is the server _now_ time. - - :param scheduled_for: The scheduled_for of this RunManually. - :type: datetime - """ # noqa: E501 - self._scheduled_for = scheduled_for - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, RunManually): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/runs.py b/frogpilot/third_party/influxdb_client/domain/runs.py deleted file mode 100644 index 5f926301e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/runs.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Runs(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'Links', - 'runs': 'list[Run]' - } - - attribute_map = { - 'links': 'links', - 'runs': 'runs' - } - - def __init__(self, links=None, runs=None): # noqa: E501,D401,D403 - """Runs - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._runs = None - self.discriminator = None - - if links is not None: - self.links = links - if runs is not None: - self.runs = runs - - @property - def links(self): - """Get the links of this Runs. - - :return: The links of this Runs. - :rtype: Links - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Runs. - - :param links: The links of this Runs. - :type: Links - """ # noqa: E501 - self._links = links - - @property - def runs(self): - """Get the runs of this Runs. - - :return: The runs of this Runs. - :rtype: list[Run] - """ # noqa: E501 - return self._runs - - @runs.setter - def runs(self, runs): - """Set the runs of this Runs. - - :param runs: The runs of this Runs. - :type: list[Run] - """ # noqa: E501 - self._runs = runs - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Runs): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/scatter_view_properties.py b/frogpilot/third_party/influxdb_client/domain/scatter_view_properties.py deleted file mode 100644 index 783a87cb7..000000000 --- a/frogpilot/third_party/influxdb_client/domain/scatter_view_properties.py +++ /dev/null @@ -1,850 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.view_properties import ViewProperties - - -class ScatterViewProperties(ViewProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'adaptive_zoom_hide': 'bool', - 'time_format': 'str', - 'type': 'str', - 'queries': 'list[DashboardQuery]', - 'colors': 'list[str]', - 'shape': 'str', - 'note': 'str', - 'show_note_when_empty': 'bool', - 'x_column': 'str', - 'generate_x_axis_ticks': 'list[str]', - 'x_total_ticks': 'int', - 'x_tick_start': 'float', - 'x_tick_step': 'float', - 'y_column': 'str', - 'generate_y_axis_ticks': 'list[str]', - 'y_total_ticks': 'int', - 'y_tick_start': 'float', - 'y_tick_step': 'float', - 'fill_columns': 'list[str]', - 'symbol_columns': 'list[str]', - 'x_domain': 'list[float]', - 'y_domain': 'list[float]', - 'x_axis_label': 'str', - 'y_axis_label': 'str', - 'x_prefix': 'str', - 'x_suffix': 'str', - 'y_prefix': 'str', - 'y_suffix': 'str', - 'legend_colorize_rows': 'bool', - 'legend_hide': 'bool', - 'legend_opacity': 'float', - 'legend_orientation_threshold': 'int' - } - - attribute_map = { - 'adaptive_zoom_hide': 'adaptiveZoomHide', - 'time_format': 'timeFormat', - 'type': 'type', - 'queries': 'queries', - 'colors': 'colors', - 'shape': 'shape', - 'note': 'note', - 'show_note_when_empty': 'showNoteWhenEmpty', - 'x_column': 'xColumn', - 'generate_x_axis_ticks': 'generateXAxisTicks', - 'x_total_ticks': 'xTotalTicks', - 'x_tick_start': 'xTickStart', - 'x_tick_step': 'xTickStep', - 'y_column': 'yColumn', - 'generate_y_axis_ticks': 'generateYAxisTicks', - 'y_total_ticks': 'yTotalTicks', - 'y_tick_start': 'yTickStart', - 'y_tick_step': 'yTickStep', - 'fill_columns': 'fillColumns', - 'symbol_columns': 'symbolColumns', - 'x_domain': 'xDomain', - 'y_domain': 'yDomain', - 'x_axis_label': 'xAxisLabel', - 'y_axis_label': 'yAxisLabel', - 'x_prefix': 'xPrefix', - 'x_suffix': 'xSuffix', - 'y_prefix': 'yPrefix', - 'y_suffix': 'ySuffix', - 'legend_colorize_rows': 'legendColorizeRows', - 'legend_hide': 'legendHide', - 'legend_opacity': 'legendOpacity', - 'legend_orientation_threshold': 'legendOrientationThreshold' - } - - def __init__(self, adaptive_zoom_hide=None, time_format=None, type=None, queries=None, colors=None, shape=None, note=None, show_note_when_empty=None, x_column=None, generate_x_axis_ticks=None, x_total_ticks=None, x_tick_start=None, x_tick_step=None, y_column=None, generate_y_axis_ticks=None, y_total_ticks=None, y_tick_start=None, y_tick_step=None, fill_columns=None, symbol_columns=None, x_domain=None, y_domain=None, x_axis_label=None, y_axis_label=None, x_prefix=None, x_suffix=None, y_prefix=None, y_suffix=None, legend_colorize_rows=None, legend_hide=None, legend_opacity=None, legend_orientation_threshold=None): # noqa: E501,D401,D403 - """ScatterViewProperties - a model defined in OpenAPI.""" # noqa: E501 - ViewProperties.__init__(self) # noqa: E501 - - self._adaptive_zoom_hide = None - self._time_format = None - self._type = None - self._queries = None - self._colors = None - self._shape = None - self._note = None - self._show_note_when_empty = None - self._x_column = None - self._generate_x_axis_ticks = None - self._x_total_ticks = None - self._x_tick_start = None - self._x_tick_step = None - self._y_column = None - self._generate_y_axis_ticks = None - self._y_total_ticks = None - self._y_tick_start = None - self._y_tick_step = None - self._fill_columns = None - self._symbol_columns = None - self._x_domain = None - self._y_domain = None - self._x_axis_label = None - self._y_axis_label = None - self._x_prefix = None - self._x_suffix = None - self._y_prefix = None - self._y_suffix = None - self._legend_colorize_rows = None - self._legend_hide = None - self._legend_opacity = None - self._legend_orientation_threshold = None - self.discriminator = None - - if adaptive_zoom_hide is not None: - self.adaptive_zoom_hide = adaptive_zoom_hide - if time_format is not None: - self.time_format = time_format - self.type = type - self.queries = queries - self.colors = colors - self.shape = shape - self.note = note - self.show_note_when_empty = show_note_when_empty - self.x_column = x_column - if generate_x_axis_ticks is not None: - self.generate_x_axis_ticks = generate_x_axis_ticks - if x_total_ticks is not None: - self.x_total_ticks = x_total_ticks - if x_tick_start is not None: - self.x_tick_start = x_tick_start - if x_tick_step is not None: - self.x_tick_step = x_tick_step - self.y_column = y_column - if generate_y_axis_ticks is not None: - self.generate_y_axis_ticks = generate_y_axis_ticks - if y_total_ticks is not None: - self.y_total_ticks = y_total_ticks - if y_tick_start is not None: - self.y_tick_start = y_tick_start - if y_tick_step is not None: - self.y_tick_step = y_tick_step - self.fill_columns = fill_columns - self.symbol_columns = symbol_columns - self.x_domain = x_domain - self.y_domain = y_domain - self.x_axis_label = x_axis_label - self.y_axis_label = y_axis_label - self.x_prefix = x_prefix - self.x_suffix = x_suffix - self.y_prefix = y_prefix - self.y_suffix = y_suffix - if legend_colorize_rows is not None: - self.legend_colorize_rows = legend_colorize_rows - if legend_hide is not None: - self.legend_hide = legend_hide - if legend_opacity is not None: - self.legend_opacity = legend_opacity - if legend_orientation_threshold is not None: - self.legend_orientation_threshold = legend_orientation_threshold - - @property - def adaptive_zoom_hide(self): - """Get the adaptive_zoom_hide of this ScatterViewProperties. - - :return: The adaptive_zoom_hide of this ScatterViewProperties. - :rtype: bool - """ # noqa: E501 - return self._adaptive_zoom_hide - - @adaptive_zoom_hide.setter - def adaptive_zoom_hide(self, adaptive_zoom_hide): - """Set the adaptive_zoom_hide of this ScatterViewProperties. - - :param adaptive_zoom_hide: The adaptive_zoom_hide of this ScatterViewProperties. - :type: bool - """ # noqa: E501 - self._adaptive_zoom_hide = adaptive_zoom_hide - - @property - def time_format(self): - """Get the time_format of this ScatterViewProperties. - - :return: The time_format of this ScatterViewProperties. - :rtype: str - """ # noqa: E501 - return self._time_format - - @time_format.setter - def time_format(self, time_format): - """Set the time_format of this ScatterViewProperties. - - :param time_format: The time_format of this ScatterViewProperties. - :type: str - """ # noqa: E501 - self._time_format = time_format - - @property - def type(self): - """Get the type of this ScatterViewProperties. - - :return: The type of this ScatterViewProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this ScatterViewProperties. - - :param type: The type of this ScatterViewProperties. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def queries(self): - """Get the queries of this ScatterViewProperties. - - :return: The queries of this ScatterViewProperties. - :rtype: list[DashboardQuery] - """ # noqa: E501 - return self._queries - - @queries.setter - def queries(self, queries): - """Set the queries of this ScatterViewProperties. - - :param queries: The queries of this ScatterViewProperties. - :type: list[DashboardQuery] - """ # noqa: E501 - if queries is None: - raise ValueError("Invalid value for `queries`, must not be `None`") # noqa: E501 - self._queries = queries - - @property - def colors(self): - """Get the colors of this ScatterViewProperties. - - Colors define color encoding of data into a visualization - - :return: The colors of this ScatterViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._colors - - @colors.setter - def colors(self, colors): - """Set the colors of this ScatterViewProperties. - - Colors define color encoding of data into a visualization - - :param colors: The colors of this ScatterViewProperties. - :type: list[str] - """ # noqa: E501 - if colors is None: - raise ValueError("Invalid value for `colors`, must not be `None`") # noqa: E501 - self._colors = colors - - @property - def shape(self): - """Get the shape of this ScatterViewProperties. - - :return: The shape of this ScatterViewProperties. - :rtype: str - """ # noqa: E501 - return self._shape - - @shape.setter - def shape(self, shape): - """Set the shape of this ScatterViewProperties. - - :param shape: The shape of this ScatterViewProperties. - :type: str - """ # noqa: E501 - if shape is None: - raise ValueError("Invalid value for `shape`, must not be `None`") # noqa: E501 - self._shape = shape - - @property - def note(self): - """Get the note of this ScatterViewProperties. - - :return: The note of this ScatterViewProperties. - :rtype: str - """ # noqa: E501 - return self._note - - @note.setter - def note(self, note): - """Set the note of this ScatterViewProperties. - - :param note: The note of this ScatterViewProperties. - :type: str - """ # noqa: E501 - if note is None: - raise ValueError("Invalid value for `note`, must not be `None`") # noqa: E501 - self._note = note - - @property - def show_note_when_empty(self): - """Get the show_note_when_empty of this ScatterViewProperties. - - If true, will display note when empty - - :return: The show_note_when_empty of this ScatterViewProperties. - :rtype: bool - """ # noqa: E501 - return self._show_note_when_empty - - @show_note_when_empty.setter - def show_note_when_empty(self, show_note_when_empty): - """Set the show_note_when_empty of this ScatterViewProperties. - - If true, will display note when empty - - :param show_note_when_empty: The show_note_when_empty of this ScatterViewProperties. - :type: bool - """ # noqa: E501 - if show_note_when_empty is None: - raise ValueError("Invalid value for `show_note_when_empty`, must not be `None`") # noqa: E501 - self._show_note_when_empty = show_note_when_empty - - @property - def x_column(self): - """Get the x_column of this ScatterViewProperties. - - :return: The x_column of this ScatterViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_column - - @x_column.setter - def x_column(self, x_column): - """Set the x_column of this ScatterViewProperties. - - :param x_column: The x_column of this ScatterViewProperties. - :type: str - """ # noqa: E501 - if x_column is None: - raise ValueError("Invalid value for `x_column`, must not be `None`") # noqa: E501 - self._x_column = x_column - - @property - def generate_x_axis_ticks(self): - """Get the generate_x_axis_ticks of this ScatterViewProperties. - - :return: The generate_x_axis_ticks of this ScatterViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._generate_x_axis_ticks - - @generate_x_axis_ticks.setter - def generate_x_axis_ticks(self, generate_x_axis_ticks): - """Set the generate_x_axis_ticks of this ScatterViewProperties. - - :param generate_x_axis_ticks: The generate_x_axis_ticks of this ScatterViewProperties. - :type: list[str] - """ # noqa: E501 - self._generate_x_axis_ticks = generate_x_axis_ticks - - @property - def x_total_ticks(self): - """Get the x_total_ticks of this ScatterViewProperties. - - :return: The x_total_ticks of this ScatterViewProperties. - :rtype: int - """ # noqa: E501 - return self._x_total_ticks - - @x_total_ticks.setter - def x_total_ticks(self, x_total_ticks): - """Set the x_total_ticks of this ScatterViewProperties. - - :param x_total_ticks: The x_total_ticks of this ScatterViewProperties. - :type: int - """ # noqa: E501 - self._x_total_ticks = x_total_ticks - - @property - def x_tick_start(self): - """Get the x_tick_start of this ScatterViewProperties. - - :return: The x_tick_start of this ScatterViewProperties. - :rtype: float - """ # noqa: E501 - return self._x_tick_start - - @x_tick_start.setter - def x_tick_start(self, x_tick_start): - """Set the x_tick_start of this ScatterViewProperties. - - :param x_tick_start: The x_tick_start of this ScatterViewProperties. - :type: float - """ # noqa: E501 - self._x_tick_start = x_tick_start - - @property - def x_tick_step(self): - """Get the x_tick_step of this ScatterViewProperties. - - :return: The x_tick_step of this ScatterViewProperties. - :rtype: float - """ # noqa: E501 - return self._x_tick_step - - @x_tick_step.setter - def x_tick_step(self, x_tick_step): - """Set the x_tick_step of this ScatterViewProperties. - - :param x_tick_step: The x_tick_step of this ScatterViewProperties. - :type: float - """ # noqa: E501 - self._x_tick_step = x_tick_step - - @property - def y_column(self): - """Get the y_column of this ScatterViewProperties. - - :return: The y_column of this ScatterViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_column - - @y_column.setter - def y_column(self, y_column): - """Set the y_column of this ScatterViewProperties. - - :param y_column: The y_column of this ScatterViewProperties. - :type: str - """ # noqa: E501 - if y_column is None: - raise ValueError("Invalid value for `y_column`, must not be `None`") # noqa: E501 - self._y_column = y_column - - @property - def generate_y_axis_ticks(self): - """Get the generate_y_axis_ticks of this ScatterViewProperties. - - :return: The generate_y_axis_ticks of this ScatterViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._generate_y_axis_ticks - - @generate_y_axis_ticks.setter - def generate_y_axis_ticks(self, generate_y_axis_ticks): - """Set the generate_y_axis_ticks of this ScatterViewProperties. - - :param generate_y_axis_ticks: The generate_y_axis_ticks of this ScatterViewProperties. - :type: list[str] - """ # noqa: E501 - self._generate_y_axis_ticks = generate_y_axis_ticks - - @property - def y_total_ticks(self): - """Get the y_total_ticks of this ScatterViewProperties. - - :return: The y_total_ticks of this ScatterViewProperties. - :rtype: int - """ # noqa: E501 - return self._y_total_ticks - - @y_total_ticks.setter - def y_total_ticks(self, y_total_ticks): - """Set the y_total_ticks of this ScatterViewProperties. - - :param y_total_ticks: The y_total_ticks of this ScatterViewProperties. - :type: int - """ # noqa: E501 - self._y_total_ticks = y_total_ticks - - @property - def y_tick_start(self): - """Get the y_tick_start of this ScatterViewProperties. - - :return: The y_tick_start of this ScatterViewProperties. - :rtype: float - """ # noqa: E501 - return self._y_tick_start - - @y_tick_start.setter - def y_tick_start(self, y_tick_start): - """Set the y_tick_start of this ScatterViewProperties. - - :param y_tick_start: The y_tick_start of this ScatterViewProperties. - :type: float - """ # noqa: E501 - self._y_tick_start = y_tick_start - - @property - def y_tick_step(self): - """Get the y_tick_step of this ScatterViewProperties. - - :return: The y_tick_step of this ScatterViewProperties. - :rtype: float - """ # noqa: E501 - return self._y_tick_step - - @y_tick_step.setter - def y_tick_step(self, y_tick_step): - """Set the y_tick_step of this ScatterViewProperties. - - :param y_tick_step: The y_tick_step of this ScatterViewProperties. - :type: float - """ # noqa: E501 - self._y_tick_step = y_tick_step - - @property - def fill_columns(self): - """Get the fill_columns of this ScatterViewProperties. - - :return: The fill_columns of this ScatterViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._fill_columns - - @fill_columns.setter - def fill_columns(self, fill_columns): - """Set the fill_columns of this ScatterViewProperties. - - :param fill_columns: The fill_columns of this ScatterViewProperties. - :type: list[str] - """ # noqa: E501 - if fill_columns is None: - raise ValueError("Invalid value for `fill_columns`, must not be `None`") # noqa: E501 - self._fill_columns = fill_columns - - @property - def symbol_columns(self): - """Get the symbol_columns of this ScatterViewProperties. - - :return: The symbol_columns of this ScatterViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._symbol_columns - - @symbol_columns.setter - def symbol_columns(self, symbol_columns): - """Set the symbol_columns of this ScatterViewProperties. - - :param symbol_columns: The symbol_columns of this ScatterViewProperties. - :type: list[str] - """ # noqa: E501 - if symbol_columns is None: - raise ValueError("Invalid value for `symbol_columns`, must not be `None`") # noqa: E501 - self._symbol_columns = symbol_columns - - @property - def x_domain(self): - """Get the x_domain of this ScatterViewProperties. - - :return: The x_domain of this ScatterViewProperties. - :rtype: list[float] - """ # noqa: E501 - return self._x_domain - - @x_domain.setter - def x_domain(self, x_domain): - """Set the x_domain of this ScatterViewProperties. - - :param x_domain: The x_domain of this ScatterViewProperties. - :type: list[float] - """ # noqa: E501 - if x_domain is None: - raise ValueError("Invalid value for `x_domain`, must not be `None`") # noqa: E501 - self._x_domain = x_domain - - @property - def y_domain(self): - """Get the y_domain of this ScatterViewProperties. - - :return: The y_domain of this ScatterViewProperties. - :rtype: list[float] - """ # noqa: E501 - return self._y_domain - - @y_domain.setter - def y_domain(self, y_domain): - """Set the y_domain of this ScatterViewProperties. - - :param y_domain: The y_domain of this ScatterViewProperties. - :type: list[float] - """ # noqa: E501 - if y_domain is None: - raise ValueError("Invalid value for `y_domain`, must not be `None`") # noqa: E501 - self._y_domain = y_domain - - @property - def x_axis_label(self): - """Get the x_axis_label of this ScatterViewProperties. - - :return: The x_axis_label of this ScatterViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_axis_label - - @x_axis_label.setter - def x_axis_label(self, x_axis_label): - """Set the x_axis_label of this ScatterViewProperties. - - :param x_axis_label: The x_axis_label of this ScatterViewProperties. - :type: str - """ # noqa: E501 - if x_axis_label is None: - raise ValueError("Invalid value for `x_axis_label`, must not be `None`") # noqa: E501 - self._x_axis_label = x_axis_label - - @property - def y_axis_label(self): - """Get the y_axis_label of this ScatterViewProperties. - - :return: The y_axis_label of this ScatterViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_axis_label - - @y_axis_label.setter - def y_axis_label(self, y_axis_label): - """Set the y_axis_label of this ScatterViewProperties. - - :param y_axis_label: The y_axis_label of this ScatterViewProperties. - :type: str - """ # noqa: E501 - if y_axis_label is None: - raise ValueError("Invalid value for `y_axis_label`, must not be `None`") # noqa: E501 - self._y_axis_label = y_axis_label - - @property - def x_prefix(self): - """Get the x_prefix of this ScatterViewProperties. - - :return: The x_prefix of this ScatterViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_prefix - - @x_prefix.setter - def x_prefix(self, x_prefix): - """Set the x_prefix of this ScatterViewProperties. - - :param x_prefix: The x_prefix of this ScatterViewProperties. - :type: str - """ # noqa: E501 - if x_prefix is None: - raise ValueError("Invalid value for `x_prefix`, must not be `None`") # noqa: E501 - self._x_prefix = x_prefix - - @property - def x_suffix(self): - """Get the x_suffix of this ScatterViewProperties. - - :return: The x_suffix of this ScatterViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_suffix - - @x_suffix.setter - def x_suffix(self, x_suffix): - """Set the x_suffix of this ScatterViewProperties. - - :param x_suffix: The x_suffix of this ScatterViewProperties. - :type: str - """ # noqa: E501 - if x_suffix is None: - raise ValueError("Invalid value for `x_suffix`, must not be `None`") # noqa: E501 - self._x_suffix = x_suffix - - @property - def y_prefix(self): - """Get the y_prefix of this ScatterViewProperties. - - :return: The y_prefix of this ScatterViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_prefix - - @y_prefix.setter - def y_prefix(self, y_prefix): - """Set the y_prefix of this ScatterViewProperties. - - :param y_prefix: The y_prefix of this ScatterViewProperties. - :type: str - """ # noqa: E501 - if y_prefix is None: - raise ValueError("Invalid value for `y_prefix`, must not be `None`") # noqa: E501 - self._y_prefix = y_prefix - - @property - def y_suffix(self): - """Get the y_suffix of this ScatterViewProperties. - - :return: The y_suffix of this ScatterViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_suffix - - @y_suffix.setter - def y_suffix(self, y_suffix): - """Set the y_suffix of this ScatterViewProperties. - - :param y_suffix: The y_suffix of this ScatterViewProperties. - :type: str - """ # noqa: E501 - if y_suffix is None: - raise ValueError("Invalid value for `y_suffix`, must not be `None`") # noqa: E501 - self._y_suffix = y_suffix - - @property - def legend_colorize_rows(self): - """Get the legend_colorize_rows of this ScatterViewProperties. - - :return: The legend_colorize_rows of this ScatterViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_colorize_rows - - @legend_colorize_rows.setter - def legend_colorize_rows(self, legend_colorize_rows): - """Set the legend_colorize_rows of this ScatterViewProperties. - - :param legend_colorize_rows: The legend_colorize_rows of this ScatterViewProperties. - :type: bool - """ # noqa: E501 - self._legend_colorize_rows = legend_colorize_rows - - @property - def legend_hide(self): - """Get the legend_hide of this ScatterViewProperties. - - :return: The legend_hide of this ScatterViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_hide - - @legend_hide.setter - def legend_hide(self, legend_hide): - """Set the legend_hide of this ScatterViewProperties. - - :param legend_hide: The legend_hide of this ScatterViewProperties. - :type: bool - """ # noqa: E501 - self._legend_hide = legend_hide - - @property - def legend_opacity(self): - """Get the legend_opacity of this ScatterViewProperties. - - :return: The legend_opacity of this ScatterViewProperties. - :rtype: float - """ # noqa: E501 - return self._legend_opacity - - @legend_opacity.setter - def legend_opacity(self, legend_opacity): - """Set the legend_opacity of this ScatterViewProperties. - - :param legend_opacity: The legend_opacity of this ScatterViewProperties. - :type: float - """ # noqa: E501 - self._legend_opacity = legend_opacity - - @property - def legend_orientation_threshold(self): - """Get the legend_orientation_threshold of this ScatterViewProperties. - - :return: The legend_orientation_threshold of this ScatterViewProperties. - :rtype: int - """ # noqa: E501 - return self._legend_orientation_threshold - - @legend_orientation_threshold.setter - def legend_orientation_threshold(self, legend_orientation_threshold): - """Set the legend_orientation_threshold of this ScatterViewProperties. - - :param legend_orientation_threshold: The legend_orientation_threshold of this ScatterViewProperties. - :type: int - """ # noqa: E501 - self._legend_orientation_threshold = legend_orientation_threshold - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ScatterViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/schema_type.py b/frogpilot/third_party/influxdb_client/domain/schema_type.py deleted file mode 100644 index c8612b55d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/schema_type.py +++ /dev/null @@ -1,88 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class SchemaType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - IMPLICIT = "implicit" - EXPLICIT = "explicit" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """SchemaType - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, SchemaType): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/scraper_target_request.py b/frogpilot/third_party/influxdb_client/domain/scraper_target_request.py deleted file mode 100644 index ae9606789..000000000 --- a/frogpilot/third_party/influxdb_client/domain/scraper_target_request.py +++ /dev/null @@ -1,246 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ScraperTargetRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'type': 'str', - 'url': 'str', - 'org_id': 'str', - 'bucket_id': 'str', - 'allow_insecure': 'bool' - } - - attribute_map = { - 'name': 'name', - 'type': 'type', - 'url': 'url', - 'org_id': 'orgID', - 'bucket_id': 'bucketID', - 'allow_insecure': 'allowInsecure' - } - - def __init__(self, name=None, type=None, url=None, org_id=None, bucket_id=None, allow_insecure=False): # noqa: E501,D401,D403 - """ScraperTargetRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._type = None - self._url = None - self._org_id = None - self._bucket_id = None - self._allow_insecure = None - self.discriminator = None - - if name is not None: - self.name = name - if type is not None: - self.type = type - if url is not None: - self.url = url - if org_id is not None: - self.org_id = org_id - if bucket_id is not None: - self.bucket_id = bucket_id - if allow_insecure is not None: - self.allow_insecure = allow_insecure - - @property - def name(self): - """Get the name of this ScraperTargetRequest. - - The name of the scraper target. - - :return: The name of this ScraperTargetRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this ScraperTargetRequest. - - The name of the scraper target. - - :param name: The name of this ScraperTargetRequest. - :type: str - """ # noqa: E501 - self._name = name - - @property - def type(self): - """Get the type of this ScraperTargetRequest. - - The type of the metrics to be parsed. - - :return: The type of this ScraperTargetRequest. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this ScraperTargetRequest. - - The type of the metrics to be parsed. - - :param type: The type of this ScraperTargetRequest. - :type: str - """ # noqa: E501 - self._type = type - - @property - def url(self): - """Get the url of this ScraperTargetRequest. - - The URL of the metrics endpoint. - - :return: The url of this ScraperTargetRequest. - :rtype: str - """ # noqa: E501 - return self._url - - @url.setter - def url(self, url): - """Set the url of this ScraperTargetRequest. - - The URL of the metrics endpoint. - - :param url: The url of this ScraperTargetRequest. - :type: str - """ # noqa: E501 - self._url = url - - @property - def org_id(self): - """Get the org_id of this ScraperTargetRequest. - - The organization ID. - - :return: The org_id of this ScraperTargetRequest. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this ScraperTargetRequest. - - The organization ID. - - :param org_id: The org_id of this ScraperTargetRequest. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def bucket_id(self): - """Get the bucket_id of this ScraperTargetRequest. - - The ID of the bucket to write to. - - :return: The bucket_id of this ScraperTargetRequest. - :rtype: str - """ # noqa: E501 - return self._bucket_id - - @bucket_id.setter - def bucket_id(self, bucket_id): - """Set the bucket_id of this ScraperTargetRequest. - - The ID of the bucket to write to. - - :param bucket_id: The bucket_id of this ScraperTargetRequest. - :type: str - """ # noqa: E501 - self._bucket_id = bucket_id - - @property - def allow_insecure(self): - """Get the allow_insecure of this ScraperTargetRequest. - - Skip TLS verification on endpoint. - - :return: The allow_insecure of this ScraperTargetRequest. - :rtype: bool - """ # noqa: E501 - return self._allow_insecure - - @allow_insecure.setter - def allow_insecure(self, allow_insecure): - """Set the allow_insecure of this ScraperTargetRequest. - - Skip TLS verification on endpoint. - - :param allow_insecure: The allow_insecure of this ScraperTargetRequest. - :type: bool - """ # noqa: E501 - self._allow_insecure = allow_insecure - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ScraperTargetRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/scraper_target_response.py b/frogpilot/third_party/influxdb_client/domain/scraper_target_response.py deleted file mode 100644 index 8f40ae0da..000000000 --- a/frogpilot/third_party/influxdb_client/domain/scraper_target_response.py +++ /dev/null @@ -1,200 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.scraper_target_request import ScraperTargetRequest - - -class ScraperTargetResponse(ScraperTargetRequest): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'org': 'str', - 'bucket': 'str', - 'links': 'object', - 'name': 'str', - 'type': 'str', - 'url': 'str', - 'org_id': 'str', - 'bucket_id': 'str', - 'allow_insecure': 'bool' - } - - attribute_map = { - 'id': 'id', - 'org': 'org', - 'bucket': 'bucket', - 'links': 'links', - 'name': 'name', - 'type': 'type', - 'url': 'url', - 'org_id': 'orgID', - 'bucket_id': 'bucketID', - 'allow_insecure': 'allowInsecure' - } - - def __init__(self, id=None, org=None, bucket=None, links=None, name=None, type=None, url=None, org_id=None, bucket_id=None, allow_insecure=False): # noqa: E501,D401,D403 - """ScraperTargetResponse - a model defined in OpenAPI.""" # noqa: E501 - ScraperTargetRequest.__init__(self, name=name, type=type, url=url, org_id=org_id, bucket_id=bucket_id, allow_insecure=allow_insecure) # noqa: E501 - - self._id = None - self._org = None - self._bucket = None - self._links = None - self.discriminator = None - - if id is not None: - self.id = id - if org is not None: - self.org = org - if bucket is not None: - self.bucket = bucket - if links is not None: - self.links = links - - @property - def id(self): - """Get the id of this ScraperTargetResponse. - - :return: The id of this ScraperTargetResponse. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this ScraperTargetResponse. - - :param id: The id of this ScraperTargetResponse. - :type: str - """ # noqa: E501 - self._id = id - - @property - def org(self): - """Get the org of this ScraperTargetResponse. - - The name of the organization. - - :return: The org of this ScraperTargetResponse. - :rtype: str - """ # noqa: E501 - return self._org - - @org.setter - def org(self, org): - """Set the org of this ScraperTargetResponse. - - The name of the organization. - - :param org: The org of this ScraperTargetResponse. - :type: str - """ # noqa: E501 - self._org = org - - @property - def bucket(self): - """Get the bucket of this ScraperTargetResponse. - - The bucket name. - - :return: The bucket of this ScraperTargetResponse. - :rtype: str - """ # noqa: E501 - return self._bucket - - @bucket.setter - def bucket(self, bucket): - """Set the bucket of this ScraperTargetResponse. - - The bucket name. - - :param bucket: The bucket of this ScraperTargetResponse. - :type: str - """ # noqa: E501 - self._bucket = bucket - - @property - def links(self): - """Get the links of this ScraperTargetResponse. - - :return: The links of this ScraperTargetResponse. - :rtype: object - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this ScraperTargetResponse. - - :param links: The links of this ScraperTargetResponse. - :type: object - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ScraperTargetResponse): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/scraper_target_responses.py b/frogpilot/third_party/influxdb_client/domain/scraper_target_responses.py deleted file mode 100644 index 7e4e477e9..000000000 --- a/frogpilot/third_party/influxdb_client/domain/scraper_target_responses.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ScraperTargetResponses(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'configurations': 'list[ScraperTargetResponse]' - } - - attribute_map = { - 'configurations': 'configurations' - } - - def __init__(self, configurations=None): # noqa: E501,D401,D403 - """ScraperTargetResponses - a model defined in OpenAPI.""" # noqa: E501 - self._configurations = None - self.discriminator = None - - if configurations is not None: - self.configurations = configurations - - @property - def configurations(self): - """Get the configurations of this ScraperTargetResponses. - - :return: The configurations of this ScraperTargetResponses. - :rtype: list[ScraperTargetResponse] - """ # noqa: E501 - return self._configurations - - @configurations.setter - def configurations(self, configurations): - """Set the configurations of this ScraperTargetResponses. - - :param configurations: The configurations of this ScraperTargetResponses. - :type: list[ScraperTargetResponse] - """ # noqa: E501 - self._configurations = configurations - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ScraperTargetResponses): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/script.py b/frogpilot/third_party/influxdb_client/domain/script.py deleted file mode 100644 index ea2296f70..000000000 --- a/frogpilot/third_party/influxdb_client/domain/script.py +++ /dev/null @@ -1,302 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Script(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'name': 'str', - 'description': 'str', - 'org_id': 'str', - 'script': 'str', - 'language': 'ScriptLanguage', - 'url': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime' - } - - attribute_map = { - 'id': 'id', - 'name': 'name', - 'description': 'description', - 'org_id': 'orgID', - 'script': 'script', - 'language': 'language', - 'url': 'url', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt' - } - - def __init__(self, id=None, name=None, description=None, org_id=None, script=None, language=None, url=None, created_at=None, updated_at=None): # noqa: E501,D401,D403 - """Script - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._name = None - self._description = None - self._org_id = None - self._script = None - self._language = None - self._url = None - self._created_at = None - self._updated_at = None - self.discriminator = None - - if id is not None: - self.id = id - self.name = name - if description is not None: - self.description = description - self.org_id = org_id - self.script = script - if language is not None: - self.language = language - if url is not None: - self.url = url - if created_at is not None: - self.created_at = created_at - if updated_at is not None: - self.updated_at = updated_at - - @property - def id(self): - """Get the id of this Script. - - :return: The id of this Script. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Script. - - :param id: The id of this Script. - :type: str - """ # noqa: E501 - self._id = id - - @property - def name(self): - """Get the name of this Script. - - :return: The name of this Script. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this Script. - - :param name: The name of this Script. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this Script. - - :return: The description of this Script. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this Script. - - :param description: The description of this Script. - :type: str - """ # noqa: E501 - self._description = description - - @property - def org_id(self): - """Get the org_id of this Script. - - :return: The org_id of this Script. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this Script. - - :param org_id: The org_id of this Script. - :type: str - """ # noqa: E501 - if org_id is None: - raise ValueError("Invalid value for `org_id`, must not be `None`") # noqa: E501 - self._org_id = org_id - - @property - def script(self): - """Get the script of this Script. - - The script to execute. - - :return: The script of this Script. - :rtype: str - """ # noqa: E501 - return self._script - - @script.setter - def script(self, script): - """Set the script of this Script. - - The script to execute. - - :param script: The script of this Script. - :type: str - """ # noqa: E501 - if script is None: - raise ValueError("Invalid value for `script`, must not be `None`") # noqa: E501 - self._script = script - - @property - def language(self): - """Get the language of this Script. - - :return: The language of this Script. - :rtype: ScriptLanguage - """ # noqa: E501 - return self._language - - @language.setter - def language(self, language): - """Set the language of this Script. - - :param language: The language of this Script. - :type: ScriptLanguage - """ # noqa: E501 - self._language = language - - @property - def url(self): - """Get the url of this Script. - - The invocation endpoint address. - - :return: The url of this Script. - :rtype: str - """ # noqa: E501 - return self._url - - @url.setter - def url(self, url): - """Set the url of this Script. - - The invocation endpoint address. - - :param url: The url of this Script. - :type: str - """ # noqa: E501 - self._url = url - - @property - def created_at(self): - """Get the created_at of this Script. - - :return: The created_at of this Script. - :rtype: datetime - """ # noqa: E501 - return self._created_at - - @created_at.setter - def created_at(self, created_at): - """Set the created_at of this Script. - - :param created_at: The created_at of this Script. - :type: datetime - """ # noqa: E501 - self._created_at = created_at - - @property - def updated_at(self): - """Get the updated_at of this Script. - - :return: The updated_at of this Script. - :rtype: datetime - """ # noqa: E501 - return self._updated_at - - @updated_at.setter - def updated_at(self, updated_at): - """Set the updated_at of this Script. - - :param updated_at: The updated_at of this Script. - :type: datetime - """ # noqa: E501 - self._updated_at = updated_at - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Script): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/script_create_request.py b/frogpilot/third_party/influxdb_client/domain/script_create_request.py deleted file mode 100644 index 5af2b5d13..000000000 --- a/frogpilot/third_party/influxdb_client/domain/script_create_request.py +++ /dev/null @@ -1,192 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ScriptCreateRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'script': 'str', - 'language': 'ScriptLanguage' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'script': 'script', - 'language': 'language' - } - - def __init__(self, name=None, description=None, script=None, language=None): # noqa: E501,D401,D403 - """ScriptCreateRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._script = None - self._language = None - self.discriminator = None - - self.name = name - self.description = description - self.script = script - self.language = language - - @property - def name(self): - """Get the name of this ScriptCreateRequest. - - Script name. The name must be unique within the organization. - - :return: The name of this ScriptCreateRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this ScriptCreateRequest. - - Script name. The name must be unique within the organization. - - :param name: The name of this ScriptCreateRequest. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this ScriptCreateRequest. - - Script description. A description of the script. - - :return: The description of this ScriptCreateRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this ScriptCreateRequest. - - Script description. A description of the script. - - :param description: The description of this ScriptCreateRequest. - :type: str - """ # noqa: E501 - if description is None: - raise ValueError("Invalid value for `description`, must not be `None`") # noqa: E501 - self._description = description - - @property - def script(self): - """Get the script of this ScriptCreateRequest. - - The script to execute. - - :return: The script of this ScriptCreateRequest. - :rtype: str - """ # noqa: E501 - return self._script - - @script.setter - def script(self, script): - """Set the script of this ScriptCreateRequest. - - The script to execute. - - :param script: The script of this ScriptCreateRequest. - :type: str - """ # noqa: E501 - if script is None: - raise ValueError("Invalid value for `script`, must not be `None`") # noqa: E501 - self._script = script - - @property - def language(self): - """Get the language of this ScriptCreateRequest. - - :return: The language of this ScriptCreateRequest. - :rtype: ScriptLanguage - """ # noqa: E501 - return self._language - - @language.setter - def language(self, language): - """Set the language of this ScriptCreateRequest. - - :param language: The language of this ScriptCreateRequest. - :type: ScriptLanguage - """ # noqa: E501 - if language is None: - raise ValueError("Invalid value for `language`, must not be `None`") # noqa: E501 - self._language = language - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ScriptCreateRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/script_invocation_params.py b/frogpilot/third_party/influxdb_client/domain/script_invocation_params.py deleted file mode 100644 index 1849280f1..000000000 --- a/frogpilot/third_party/influxdb_client/domain/script_invocation_params.py +++ /dev/null @@ -1,111 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ScriptInvocationParams(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'params': 'dict(str, object)' - } - - attribute_map = { - 'params': 'params' - } - - def __init__(self, params=None): # noqa: E501,D401,D403 - """ScriptInvocationParams - a model defined in OpenAPI.""" # noqa: E501 - self._params = None - self.discriminator = None - - if params is not None: - self.params = params - - @property - def params(self): - """Get the params of this ScriptInvocationParams. - - The script parameters. `params` contains key-value pairs that map values to the **params.keys** in a script. When you invoke a script with `params`, InfluxDB passes the values as invocation parameters to the script. - - :return: The params of this ScriptInvocationParams. - :rtype: dict(str, object) - """ # noqa: E501 - return self._params - - @params.setter - def params(self, params): - """Set the params of this ScriptInvocationParams. - - The script parameters. `params` contains key-value pairs that map values to the **params.keys** in a script. When you invoke a script with `params`, InfluxDB passes the values as invocation parameters to the script. - - :param params: The params of this ScriptInvocationParams. - :type: dict(str, object) - """ # noqa: E501 - self._params = params - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ScriptInvocationParams): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/script_language.py b/frogpilot/third_party/influxdb_client/domain/script_language.py deleted file mode 100644 index 473055e0c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/script_language.py +++ /dev/null @@ -1,89 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ScriptLanguage(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - FLUX = "flux" - SQL = "sql" - INFLUXQL = "influxql" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """ScriptLanguage - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ScriptLanguage): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/script_update_request.py b/frogpilot/third_party/influxdb_client/domain/script_update_request.py deleted file mode 100644 index 36444c710..000000000 --- a/frogpilot/third_party/influxdb_client/domain/script_update_request.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ScriptUpdateRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'description': 'str', - 'script': 'str' - } - - attribute_map = { - 'description': 'description', - 'script': 'script' - } - - def __init__(self, description=None, script=None): # noqa: E501,D401,D403 - """ScriptUpdateRequest - a model defined in OpenAPI.""" # noqa: E501 - self._description = None - self._script = None - self.discriminator = None - - if description is not None: - self.description = description - if script is not None: - self.script = script - - @property - def description(self): - """Get the description of this ScriptUpdateRequest. - - A description of the script. - - :return: The description of this ScriptUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this ScriptUpdateRequest. - - A description of the script. - - :param description: The description of this ScriptUpdateRequest. - :type: str - """ # noqa: E501 - self._description = description - - @property - def script(self): - """Get the script of this ScriptUpdateRequest. - - The script to execute. - - :return: The script of this ScriptUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._script - - @script.setter - def script(self, script): - """Set the script of this ScriptUpdateRequest. - - The script to execute. - - :param script: The script of this ScriptUpdateRequest. - :type: str - """ # noqa: E501 - self._script = script - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ScriptUpdateRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/scripts.py b/frogpilot/third_party/influxdb_client/domain/scripts.py deleted file mode 100644 index 03ca492b8..000000000 --- a/frogpilot/third_party/influxdb_client/domain/scripts.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Scripts(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'scripts': 'list[Script]' - } - - attribute_map = { - 'scripts': 'scripts' - } - - def __init__(self, scripts=None): # noqa: E501,D401,D403 - """Scripts - a model defined in OpenAPI.""" # noqa: E501 - self._scripts = None - self.discriminator = None - - if scripts is not None: - self.scripts = scripts - - @property - def scripts(self): - """Get the scripts of this Scripts. - - :return: The scripts of this Scripts. - :rtype: list[Script] - """ # noqa: E501 - return self._scripts - - @scripts.setter - def scripts(self, scripts): - """Set the scripts of this Scripts. - - :param scripts: The scripts of this Scripts. - :type: list[Script] - """ # noqa: E501 - self._scripts = scripts - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Scripts): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/secret_keys.py b/frogpilot/third_party/influxdb_client/domain/secret_keys.py deleted file mode 100644 index b935a61f8..000000000 --- a/frogpilot/third_party/influxdb_client/domain/secret_keys.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class SecretKeys(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'secrets': 'list[str]' - } - - attribute_map = { - 'secrets': 'secrets' - } - - def __init__(self, secrets=None): # noqa: E501,D401,D403 - """SecretKeys - a model defined in OpenAPI.""" # noqa: E501 - self._secrets = None - self.discriminator = None - - if secrets is not None: - self.secrets = secrets - - @property - def secrets(self): - """Get the secrets of this SecretKeys. - - :return: The secrets of this SecretKeys. - :rtype: list[str] - """ # noqa: E501 - return self._secrets - - @secrets.setter - def secrets(self, secrets): - """Set the secrets of this SecretKeys. - - :param secrets: The secrets of this SecretKeys. - :type: list[str] - """ # noqa: E501 - self._secrets = secrets - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, SecretKeys): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/secret_keys_response.py b/frogpilot/third_party/influxdb_client/domain/secret_keys_response.py deleted file mode 100644 index c9686cf3e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/secret_keys_response.py +++ /dev/null @@ -1,113 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.secret_keys import SecretKeys - - -class SecretKeysResponse(SecretKeys): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'object', - 'secrets': 'list[str]' - } - - attribute_map = { - 'links': 'links', - 'secrets': 'secrets' - } - - def __init__(self, links=None, secrets=None): # noqa: E501,D401,D403 - """SecretKeysResponse - a model defined in OpenAPI.""" # noqa: E501 - SecretKeys.__init__(self, secrets=secrets) # noqa: E501 - - self._links = None - self.discriminator = None - - if links is not None: - self.links = links - - @property - def links(self): - """Get the links of this SecretKeysResponse. - - :return: The links of this SecretKeysResponse. - :rtype: object - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this SecretKeysResponse. - - :param links: The links of this SecretKeysResponse. - :type: object - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, SecretKeysResponse): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/shard_group_manifest.py b/frogpilot/third_party/influxdb_client/domain/shard_group_manifest.py deleted file mode 100644 index cd644444b..000000000 --- a/frogpilot/third_party/influxdb_client/domain/shard_group_manifest.py +++ /dev/null @@ -1,226 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ShardGroupManifest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'int', - 'start_time': 'datetime', - 'end_time': 'datetime', - 'deleted_at': 'datetime', - 'truncated_at': 'datetime', - 'shards': 'list[ShardManifest]' - } - - attribute_map = { - 'id': 'id', - 'start_time': 'startTime', - 'end_time': 'endTime', - 'deleted_at': 'deletedAt', - 'truncated_at': 'truncatedAt', - 'shards': 'shards' - } - - def __init__(self, id=None, start_time=None, end_time=None, deleted_at=None, truncated_at=None, shards=None): # noqa: E501,D401,D403 - """ShardGroupManifest - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._start_time = None - self._end_time = None - self._deleted_at = None - self._truncated_at = None - self._shards = None - self.discriminator = None - - self.id = id - self.start_time = start_time - self.end_time = end_time - if deleted_at is not None: - self.deleted_at = deleted_at - if truncated_at is not None: - self.truncated_at = truncated_at - self.shards = shards - - @property - def id(self): - """Get the id of this ShardGroupManifest. - - :return: The id of this ShardGroupManifest. - :rtype: int - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this ShardGroupManifest. - - :param id: The id of this ShardGroupManifest. - :type: int - """ # noqa: E501 - if id is None: - raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 - self._id = id - - @property - def start_time(self): - """Get the start_time of this ShardGroupManifest. - - :return: The start_time of this ShardGroupManifest. - :rtype: datetime - """ # noqa: E501 - return self._start_time - - @start_time.setter - def start_time(self, start_time): - """Set the start_time of this ShardGroupManifest. - - :param start_time: The start_time of this ShardGroupManifest. - :type: datetime - """ # noqa: E501 - if start_time is None: - raise ValueError("Invalid value for `start_time`, must not be `None`") # noqa: E501 - self._start_time = start_time - - @property - def end_time(self): - """Get the end_time of this ShardGroupManifest. - - :return: The end_time of this ShardGroupManifest. - :rtype: datetime - """ # noqa: E501 - return self._end_time - - @end_time.setter - def end_time(self, end_time): - """Set the end_time of this ShardGroupManifest. - - :param end_time: The end_time of this ShardGroupManifest. - :type: datetime - """ # noqa: E501 - if end_time is None: - raise ValueError("Invalid value for `end_time`, must not be `None`") # noqa: E501 - self._end_time = end_time - - @property - def deleted_at(self): - """Get the deleted_at of this ShardGroupManifest. - - :return: The deleted_at of this ShardGroupManifest. - :rtype: datetime - """ # noqa: E501 - return self._deleted_at - - @deleted_at.setter - def deleted_at(self, deleted_at): - """Set the deleted_at of this ShardGroupManifest. - - :param deleted_at: The deleted_at of this ShardGroupManifest. - :type: datetime - """ # noqa: E501 - self._deleted_at = deleted_at - - @property - def truncated_at(self): - """Get the truncated_at of this ShardGroupManifest. - - :return: The truncated_at of this ShardGroupManifest. - :rtype: datetime - """ # noqa: E501 - return self._truncated_at - - @truncated_at.setter - def truncated_at(self, truncated_at): - """Set the truncated_at of this ShardGroupManifest. - - :param truncated_at: The truncated_at of this ShardGroupManifest. - :type: datetime - """ # noqa: E501 - self._truncated_at = truncated_at - - @property - def shards(self): - """Get the shards of this ShardGroupManifest. - - :return: The shards of this ShardGroupManifest. - :rtype: list[ShardManifest] - """ # noqa: E501 - return self._shards - - @shards.setter - def shards(self, shards): - """Set the shards of this ShardGroupManifest. - - :param shards: The shards of this ShardGroupManifest. - :type: list[ShardManifest] - """ # noqa: E501 - if shards is None: - raise ValueError("Invalid value for `shards`, must not be `None`") # noqa: E501 - self._shards = shards - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ShardGroupManifest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/shard_manifest.py b/frogpilot/third_party/influxdb_client/domain/shard_manifest.py deleted file mode 100644 index 1d1834655..000000000 --- a/frogpilot/third_party/influxdb_client/domain/shard_manifest.py +++ /dev/null @@ -1,132 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ShardManifest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'int', - 'shard_owners': 'list[ShardOwner]' - } - - attribute_map = { - 'id': 'id', - 'shard_owners': 'shardOwners' - } - - def __init__(self, id=None, shard_owners=None): # noqa: E501,D401,D403 - """ShardManifest - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._shard_owners = None - self.discriminator = None - - self.id = id - self.shard_owners = shard_owners - - @property - def id(self): - """Get the id of this ShardManifest. - - :return: The id of this ShardManifest. - :rtype: int - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this ShardManifest. - - :param id: The id of this ShardManifest. - :type: int - """ # noqa: E501 - if id is None: - raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 - self._id = id - - @property - def shard_owners(self): - """Get the shard_owners of this ShardManifest. - - :return: The shard_owners of this ShardManifest. - :rtype: list[ShardOwner] - """ # noqa: E501 - return self._shard_owners - - @shard_owners.setter - def shard_owners(self, shard_owners): - """Set the shard_owners of this ShardManifest. - - :param shard_owners: The shard_owners of this ShardManifest. - :type: list[ShardOwner] - """ # noqa: E501 - if shard_owners is None: - raise ValueError("Invalid value for `shard_owners`, must not be `None`") # noqa: E501 - self._shard_owners = shard_owners - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ShardManifest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/shard_owner.py b/frogpilot/third_party/influxdb_client/domain/shard_owner.py deleted file mode 100644 index 3c8232a21..000000000 --- a/frogpilot/third_party/influxdb_client/domain/shard_owner.py +++ /dev/null @@ -1,112 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ShardOwner(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'node_id': 'int' - } - - attribute_map = { - 'node_id': 'nodeID' - } - - def __init__(self, node_id=None): # noqa: E501,D401,D403 - """ShardOwner - a model defined in OpenAPI.""" # noqa: E501 - self._node_id = None - self.discriminator = None - - self.node_id = node_id - - @property - def node_id(self): - """Get the node_id of this ShardOwner. - - The ID of the node that owns the shard. - - :return: The node_id of this ShardOwner. - :rtype: int - """ # noqa: E501 - return self._node_id - - @node_id.setter - def node_id(self, node_id): - """Set the node_id of this ShardOwner. - - The ID of the node that owns the shard. - - :param node_id: The node_id of this ShardOwner. - :type: int - """ # noqa: E501 - if node_id is None: - raise ValueError("Invalid value for `node_id`, must not be `None`") # noqa: E501 - self._node_id = node_id - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ShardOwner): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/simple_table_view_properties.py b/frogpilot/third_party/influxdb_client/domain/simple_table_view_properties.py deleted file mode 100644 index 670be2091..000000000 --- a/frogpilot/third_party/influxdb_client/domain/simple_table_view_properties.py +++ /dev/null @@ -1,236 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.view_properties import ViewProperties - - -class SimpleTableViewProperties(ViewProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'show_all': 'bool', - 'queries': 'list[DashboardQuery]', - 'shape': 'str', - 'note': 'str', - 'show_note_when_empty': 'bool' - } - - attribute_map = { - 'type': 'type', - 'show_all': 'showAll', - 'queries': 'queries', - 'shape': 'shape', - 'note': 'note', - 'show_note_when_empty': 'showNoteWhenEmpty' - } - - def __init__(self, type=None, show_all=None, queries=None, shape=None, note=None, show_note_when_empty=None): # noqa: E501,D401,D403 - """SimpleTableViewProperties - a model defined in OpenAPI.""" # noqa: E501 - ViewProperties.__init__(self) # noqa: E501 - - self._type = None - self._show_all = None - self._queries = None - self._shape = None - self._note = None - self._show_note_when_empty = None - self.discriminator = None - - self.type = type - self.show_all = show_all - self.queries = queries - self.shape = shape - self.note = note - self.show_note_when_empty = show_note_when_empty - - @property - def type(self): - """Get the type of this SimpleTableViewProperties. - - :return: The type of this SimpleTableViewProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this SimpleTableViewProperties. - - :param type: The type of this SimpleTableViewProperties. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def show_all(self): - """Get the show_all of this SimpleTableViewProperties. - - :return: The show_all of this SimpleTableViewProperties. - :rtype: bool - """ # noqa: E501 - return self._show_all - - @show_all.setter - def show_all(self, show_all): - """Set the show_all of this SimpleTableViewProperties. - - :param show_all: The show_all of this SimpleTableViewProperties. - :type: bool - """ # noqa: E501 - if show_all is None: - raise ValueError("Invalid value for `show_all`, must not be `None`") # noqa: E501 - self._show_all = show_all - - @property - def queries(self): - """Get the queries of this SimpleTableViewProperties. - - :return: The queries of this SimpleTableViewProperties. - :rtype: list[DashboardQuery] - """ # noqa: E501 - return self._queries - - @queries.setter - def queries(self, queries): - """Set the queries of this SimpleTableViewProperties. - - :param queries: The queries of this SimpleTableViewProperties. - :type: list[DashboardQuery] - """ # noqa: E501 - if queries is None: - raise ValueError("Invalid value for `queries`, must not be `None`") # noqa: E501 - self._queries = queries - - @property - def shape(self): - """Get the shape of this SimpleTableViewProperties. - - :return: The shape of this SimpleTableViewProperties. - :rtype: str - """ # noqa: E501 - return self._shape - - @shape.setter - def shape(self, shape): - """Set the shape of this SimpleTableViewProperties. - - :param shape: The shape of this SimpleTableViewProperties. - :type: str - """ # noqa: E501 - if shape is None: - raise ValueError("Invalid value for `shape`, must not be `None`") # noqa: E501 - self._shape = shape - - @property - def note(self): - """Get the note of this SimpleTableViewProperties. - - :return: The note of this SimpleTableViewProperties. - :rtype: str - """ # noqa: E501 - return self._note - - @note.setter - def note(self, note): - """Set the note of this SimpleTableViewProperties. - - :param note: The note of this SimpleTableViewProperties. - :type: str - """ # noqa: E501 - if note is None: - raise ValueError("Invalid value for `note`, must not be `None`") # noqa: E501 - self._note = note - - @property - def show_note_when_empty(self): - """Get the show_note_when_empty of this SimpleTableViewProperties. - - If true, will display note when empty - - :return: The show_note_when_empty of this SimpleTableViewProperties. - :rtype: bool - """ # noqa: E501 - return self._show_note_when_empty - - @show_note_when_empty.setter - def show_note_when_empty(self, show_note_when_empty): - """Set the show_note_when_empty of this SimpleTableViewProperties. - - If true, will display note when empty - - :param show_note_when_empty: The show_note_when_empty of this SimpleTableViewProperties. - :type: bool - """ # noqa: E501 - if show_note_when_empty is None: - raise ValueError("Invalid value for `show_note_when_empty`, must not be `None`") # noqa: E501 - self._show_note_when_empty = show_note_when_empty - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, SimpleTableViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/single_stat_view_properties.py b/frogpilot/third_party/influxdb_client/domain/single_stat_view_properties.py deleted file mode 100644 index cc46240f2..000000000 --- a/frogpilot/third_party/influxdb_client/domain/single_stat_view_properties.py +++ /dev/null @@ -1,383 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.view_properties import ViewProperties - - -class SingleStatViewProperties(ViewProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'queries': 'list[DashboardQuery]', - 'colors': 'list[DashboardColor]', - 'shape': 'str', - 'note': 'str', - 'show_note_when_empty': 'bool', - 'prefix': 'str', - 'tick_prefix': 'str', - 'suffix': 'str', - 'tick_suffix': 'str', - 'static_legend': 'StaticLegend', - 'decimal_places': 'DecimalPlaces' - } - - attribute_map = { - 'type': 'type', - 'queries': 'queries', - 'colors': 'colors', - 'shape': 'shape', - 'note': 'note', - 'show_note_when_empty': 'showNoteWhenEmpty', - 'prefix': 'prefix', - 'tick_prefix': 'tickPrefix', - 'suffix': 'suffix', - 'tick_suffix': 'tickSuffix', - 'static_legend': 'staticLegend', - 'decimal_places': 'decimalPlaces' - } - - def __init__(self, type=None, queries=None, colors=None, shape=None, note=None, show_note_when_empty=None, prefix=None, tick_prefix=None, suffix=None, tick_suffix=None, static_legend=None, decimal_places=None): # noqa: E501,D401,D403 - """SingleStatViewProperties - a model defined in OpenAPI.""" # noqa: E501 - ViewProperties.__init__(self) # noqa: E501 - - self._type = None - self._queries = None - self._colors = None - self._shape = None - self._note = None - self._show_note_when_empty = None - self._prefix = None - self._tick_prefix = None - self._suffix = None - self._tick_suffix = None - self._static_legend = None - self._decimal_places = None - self.discriminator = None - - self.type = type - self.queries = queries - self.colors = colors - self.shape = shape - self.note = note - self.show_note_when_empty = show_note_when_empty - self.prefix = prefix - self.tick_prefix = tick_prefix - self.suffix = suffix - self.tick_suffix = tick_suffix - if static_legend is not None: - self.static_legend = static_legend - self.decimal_places = decimal_places - - @property - def type(self): - """Get the type of this SingleStatViewProperties. - - :return: The type of this SingleStatViewProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this SingleStatViewProperties. - - :param type: The type of this SingleStatViewProperties. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def queries(self): - """Get the queries of this SingleStatViewProperties. - - :return: The queries of this SingleStatViewProperties. - :rtype: list[DashboardQuery] - """ # noqa: E501 - return self._queries - - @queries.setter - def queries(self, queries): - """Set the queries of this SingleStatViewProperties. - - :param queries: The queries of this SingleStatViewProperties. - :type: list[DashboardQuery] - """ # noqa: E501 - if queries is None: - raise ValueError("Invalid value for `queries`, must not be `None`") # noqa: E501 - self._queries = queries - - @property - def colors(self): - """Get the colors of this SingleStatViewProperties. - - Colors define color encoding of data into a visualization - - :return: The colors of this SingleStatViewProperties. - :rtype: list[DashboardColor] - """ # noqa: E501 - return self._colors - - @colors.setter - def colors(self, colors): - """Set the colors of this SingleStatViewProperties. - - Colors define color encoding of data into a visualization - - :param colors: The colors of this SingleStatViewProperties. - :type: list[DashboardColor] - """ # noqa: E501 - if colors is None: - raise ValueError("Invalid value for `colors`, must not be `None`") # noqa: E501 - self._colors = colors - - @property - def shape(self): - """Get the shape of this SingleStatViewProperties. - - :return: The shape of this SingleStatViewProperties. - :rtype: str - """ # noqa: E501 - return self._shape - - @shape.setter - def shape(self, shape): - """Set the shape of this SingleStatViewProperties. - - :param shape: The shape of this SingleStatViewProperties. - :type: str - """ # noqa: E501 - if shape is None: - raise ValueError("Invalid value for `shape`, must not be `None`") # noqa: E501 - self._shape = shape - - @property - def note(self): - """Get the note of this SingleStatViewProperties. - - :return: The note of this SingleStatViewProperties. - :rtype: str - """ # noqa: E501 - return self._note - - @note.setter - def note(self, note): - """Set the note of this SingleStatViewProperties. - - :param note: The note of this SingleStatViewProperties. - :type: str - """ # noqa: E501 - if note is None: - raise ValueError("Invalid value for `note`, must not be `None`") # noqa: E501 - self._note = note - - @property - def show_note_when_empty(self): - """Get the show_note_when_empty of this SingleStatViewProperties. - - If true, will display note when empty - - :return: The show_note_when_empty of this SingleStatViewProperties. - :rtype: bool - """ # noqa: E501 - return self._show_note_when_empty - - @show_note_when_empty.setter - def show_note_when_empty(self, show_note_when_empty): - """Set the show_note_when_empty of this SingleStatViewProperties. - - If true, will display note when empty - - :param show_note_when_empty: The show_note_when_empty of this SingleStatViewProperties. - :type: bool - """ # noqa: E501 - if show_note_when_empty is None: - raise ValueError("Invalid value for `show_note_when_empty`, must not be `None`") # noqa: E501 - self._show_note_when_empty = show_note_when_empty - - @property - def prefix(self): - """Get the prefix of this SingleStatViewProperties. - - :return: The prefix of this SingleStatViewProperties. - :rtype: str - """ # noqa: E501 - return self._prefix - - @prefix.setter - def prefix(self, prefix): - """Set the prefix of this SingleStatViewProperties. - - :param prefix: The prefix of this SingleStatViewProperties. - :type: str - """ # noqa: E501 - if prefix is None: - raise ValueError("Invalid value for `prefix`, must not be `None`") # noqa: E501 - self._prefix = prefix - - @property - def tick_prefix(self): - """Get the tick_prefix of this SingleStatViewProperties. - - :return: The tick_prefix of this SingleStatViewProperties. - :rtype: str - """ # noqa: E501 - return self._tick_prefix - - @tick_prefix.setter - def tick_prefix(self, tick_prefix): - """Set the tick_prefix of this SingleStatViewProperties. - - :param tick_prefix: The tick_prefix of this SingleStatViewProperties. - :type: str - """ # noqa: E501 - if tick_prefix is None: - raise ValueError("Invalid value for `tick_prefix`, must not be `None`") # noqa: E501 - self._tick_prefix = tick_prefix - - @property - def suffix(self): - """Get the suffix of this SingleStatViewProperties. - - :return: The suffix of this SingleStatViewProperties. - :rtype: str - """ # noqa: E501 - return self._suffix - - @suffix.setter - def suffix(self, suffix): - """Set the suffix of this SingleStatViewProperties. - - :param suffix: The suffix of this SingleStatViewProperties. - :type: str - """ # noqa: E501 - if suffix is None: - raise ValueError("Invalid value for `suffix`, must not be `None`") # noqa: E501 - self._suffix = suffix - - @property - def tick_suffix(self): - """Get the tick_suffix of this SingleStatViewProperties. - - :return: The tick_suffix of this SingleStatViewProperties. - :rtype: str - """ # noqa: E501 - return self._tick_suffix - - @tick_suffix.setter - def tick_suffix(self, tick_suffix): - """Set the tick_suffix of this SingleStatViewProperties. - - :param tick_suffix: The tick_suffix of this SingleStatViewProperties. - :type: str - """ # noqa: E501 - if tick_suffix is None: - raise ValueError("Invalid value for `tick_suffix`, must not be `None`") # noqa: E501 - self._tick_suffix = tick_suffix - - @property - def static_legend(self): - """Get the static_legend of this SingleStatViewProperties. - - :return: The static_legend of this SingleStatViewProperties. - :rtype: StaticLegend - """ # noqa: E501 - return self._static_legend - - @static_legend.setter - def static_legend(self, static_legend): - """Set the static_legend of this SingleStatViewProperties. - - :param static_legend: The static_legend of this SingleStatViewProperties. - :type: StaticLegend - """ # noqa: E501 - self._static_legend = static_legend - - @property - def decimal_places(self): - """Get the decimal_places of this SingleStatViewProperties. - - :return: The decimal_places of this SingleStatViewProperties. - :rtype: DecimalPlaces - """ # noqa: E501 - return self._decimal_places - - @decimal_places.setter - def decimal_places(self, decimal_places): - """Set the decimal_places of this SingleStatViewProperties. - - :param decimal_places: The decimal_places of this SingleStatViewProperties. - :type: DecimalPlaces - """ # noqa: E501 - if decimal_places is None: - raise ValueError("Invalid value for `decimal_places`, must not be `None`") # noqa: E501 - self._decimal_places = decimal_places - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, SingleStatViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/slack_notification_endpoint.py b/frogpilot/third_party/influxdb_client/domain/slack_notification_endpoint.py deleted file mode 100644 index d619a4c89..000000000 --- a/frogpilot/third_party/influxdb_client/domain/slack_notification_endpoint.py +++ /dev/null @@ -1,164 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.notification_endpoint_discriminator import NotificationEndpointDiscriminator - - -class SlackNotificationEndpoint(NotificationEndpointDiscriminator): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'url': 'str', - 'token': 'str', - 'id': 'str', - 'org_id': 'str', - 'user_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'description': 'str', - 'name': 'str', - 'status': 'str', - 'labels': 'list[Label]', - 'links': 'NotificationEndpointBaseLinks', - 'type': 'NotificationEndpointType' - } - - attribute_map = { - 'url': 'url', - 'token': 'token', - 'id': 'id', - 'org_id': 'orgID', - 'user_id': 'userID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'description': 'description', - 'name': 'name', - 'status': 'status', - 'labels': 'labels', - 'links': 'links', - 'type': 'type' - } - - def __init__(self, url=None, token=None, id=None, org_id=None, user_id=None, created_at=None, updated_at=None, description=None, name=None, status='active', labels=None, links=None, type="slack"): # noqa: E501,D401,D403 - """SlackNotificationEndpoint - a model defined in OpenAPI.""" # noqa: E501 - NotificationEndpointDiscriminator.__init__(self, id=id, org_id=org_id, user_id=user_id, created_at=created_at, updated_at=updated_at, description=description, name=name, status=status, labels=labels, links=links, type=type) # noqa: E501 - - self._url = None - self._token = None - self.discriminator = None - - if url is not None: - self.url = url - if token is not None: - self.token = token - - @property - def url(self): - """Get the url of this SlackNotificationEndpoint. - - Specifies the URL of the Slack endpoint. Specify either `URL` or `Token`. - - :return: The url of this SlackNotificationEndpoint. - :rtype: str - """ # noqa: E501 - return self._url - - @url.setter - def url(self, url): - """Set the url of this SlackNotificationEndpoint. - - Specifies the URL of the Slack endpoint. Specify either `URL` or `Token`. - - :param url: The url of this SlackNotificationEndpoint. - :type: str - """ # noqa: E501 - self._url = url - - @property - def token(self): - """Get the token of this SlackNotificationEndpoint. - - Specifies the API token string. Specify either `URL` or `Token`. - - :return: The token of this SlackNotificationEndpoint. - :rtype: str - """ # noqa: E501 - return self._token - - @token.setter - def token(self, token): - """Set the token of this SlackNotificationEndpoint. - - Specifies the API token string. Specify either `URL` or `Token`. - - :param token: The token of this SlackNotificationEndpoint. - :type: str - """ # noqa: E501 - self._token = token - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, SlackNotificationEndpoint): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/slack_notification_rule.py b/frogpilot/third_party/influxdb_client/domain/slack_notification_rule.py deleted file mode 100644 index c7cd5b292..000000000 --- a/frogpilot/third_party/influxdb_client/domain/slack_notification_rule.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.slack_notification_rule_base import SlackNotificationRuleBase - - -class SlackNotificationRule(SlackNotificationRuleBase): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'channel': 'str', - 'message_template': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'id': 'str', - 'endpoint_id': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'status': 'TaskStatusType', - 'name': 'str', - 'sleep_until': 'str', - 'every': 'str', - 'offset': 'str', - 'runbook_link': 'str', - 'limit_every': 'int', - 'limit': 'int', - 'tag_rules': 'list[TagRule]', - 'description': 'str', - 'status_rules': 'list[StatusRule]', - 'labels': 'list[Label]', - 'links': 'NotificationRuleBaseLinks' - } - - attribute_map = { - 'type': 'type', - 'channel': 'channel', - 'message_template': 'messageTemplate', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'id': 'id', - 'endpoint_id': 'endpointID', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'status': 'status', - 'name': 'name', - 'sleep_until': 'sleepUntil', - 'every': 'every', - 'offset': 'offset', - 'runbook_link': 'runbookLink', - 'limit_every': 'limitEvery', - 'limit': 'limit', - 'tag_rules': 'tagRules', - 'description': 'description', - 'status_rules': 'statusRules', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, type="slack", channel=None, message_template=None, latest_completed=None, last_run_status=None, last_run_error=None, id=None, endpoint_id=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, status=None, name=None, sleep_until=None, every=None, offset=None, runbook_link=None, limit_every=None, limit=None, tag_rules=None, description=None, status_rules=None, labels=None, links=None): # noqa: E501,D401,D403 - """SlackNotificationRule - a model defined in OpenAPI.""" # noqa: E501 - SlackNotificationRuleBase.__init__(self, type=type, channel=channel, message_template=message_template, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, id=id, endpoint_id=endpoint_id, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, status=status, name=name, sleep_until=sleep_until, every=every, offset=offset, runbook_link=runbook_link, limit_every=limit_every, limit=limit, tag_rules=tag_rules, description=description, status_rules=status_rules, labels=labels, links=links) # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, SlackNotificationRule): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/slack_notification_rule_base.py b/frogpilot/third_party/influxdb_client/domain/slack_notification_rule_base.py deleted file mode 100644 index 923a5dfef..000000000 --- a/frogpilot/third_party/influxdb_client/domain/slack_notification_rule_base.py +++ /dev/null @@ -1,205 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.notification_rule_discriminator import NotificationRuleDiscriminator - - -class SlackNotificationRuleBase(NotificationRuleDiscriminator): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'channel': 'str', - 'message_template': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'id': 'str', - 'endpoint_id': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'status': 'TaskStatusType', - 'name': 'str', - 'sleep_until': 'str', - 'every': 'str', - 'offset': 'str', - 'runbook_link': 'str', - 'limit_every': 'int', - 'limit': 'int', - 'tag_rules': 'list[TagRule]', - 'description': 'str', - 'status_rules': 'list[StatusRule]', - 'labels': 'list[Label]', - 'links': 'NotificationRuleBaseLinks' - } - - attribute_map = { - 'type': 'type', - 'channel': 'channel', - 'message_template': 'messageTemplate', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'id': 'id', - 'endpoint_id': 'endpointID', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'status': 'status', - 'name': 'name', - 'sleep_until': 'sleepUntil', - 'every': 'every', - 'offset': 'offset', - 'runbook_link': 'runbookLink', - 'limit_every': 'limitEvery', - 'limit': 'limit', - 'tag_rules': 'tagRules', - 'description': 'description', - 'status_rules': 'statusRules', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, type=None, channel=None, message_template=None, latest_completed=None, last_run_status=None, last_run_error=None, id=None, endpoint_id=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, status=None, name=None, sleep_until=None, every=None, offset=None, runbook_link=None, limit_every=None, limit=None, tag_rules=None, description=None, status_rules=None, labels=None, links=None): # noqa: E501,D401,D403 - """SlackNotificationRuleBase - a model defined in OpenAPI.""" # noqa: E501 - NotificationRuleDiscriminator.__init__(self, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, id=id, endpoint_id=endpoint_id, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, status=status, name=name, sleep_until=sleep_until, every=every, offset=offset, runbook_link=runbook_link, limit_every=limit_every, limit=limit, tag_rules=tag_rules, description=description, status_rules=status_rules, labels=labels, links=links) # noqa: E501 - - self._type = None - self._channel = None - self._message_template = None - self.discriminator = None - - self.type = type - if channel is not None: - self.channel = channel - self.message_template = message_template - - @property - def type(self): - """Get the type of this SlackNotificationRuleBase. - - :return: The type of this SlackNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this SlackNotificationRuleBase. - - :param type: The type of this SlackNotificationRuleBase. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def channel(self): - """Get the channel of this SlackNotificationRuleBase. - - :return: The channel of this SlackNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._channel - - @channel.setter - def channel(self, channel): - """Set the channel of this SlackNotificationRuleBase. - - :param channel: The channel of this SlackNotificationRuleBase. - :type: str - """ # noqa: E501 - self._channel = channel - - @property - def message_template(self): - """Get the message_template of this SlackNotificationRuleBase. - - :return: The message_template of this SlackNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._message_template - - @message_template.setter - def message_template(self, message_template): - """Set the message_template of this SlackNotificationRuleBase. - - :param message_template: The message_template of this SlackNotificationRuleBase. - :type: str - """ # noqa: E501 - if message_template is None: - raise ValueError("Invalid value for `message_template`, must not be `None`") # noqa: E501 - self._message_template = message_template - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, SlackNotificationRuleBase): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/smtp_notification_rule.py b/frogpilot/third_party/influxdb_client/domain/smtp_notification_rule.py deleted file mode 100644 index d91073277..000000000 --- a/frogpilot/third_party/influxdb_client/domain/smtp_notification_rule.py +++ /dev/null @@ -1,140 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.smtp_notification_rule_base import SMTPNotificationRuleBase - - -class SMTPNotificationRule(SMTPNotificationRuleBase): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'subject_template': 'str', - 'body_template': 'str', - 'to': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'id': 'str', - 'endpoint_id': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'status': 'TaskStatusType', - 'name': 'str', - 'sleep_until': 'str', - 'every': 'str', - 'offset': 'str', - 'runbook_link': 'str', - 'limit_every': 'int', - 'limit': 'int', - 'tag_rules': 'list[TagRule]', - 'description': 'str', - 'status_rules': 'list[StatusRule]', - 'labels': 'list[Label]', - 'links': 'NotificationRuleBaseLinks' - } - - attribute_map = { - 'type': 'type', - 'subject_template': 'subjectTemplate', - 'body_template': 'bodyTemplate', - 'to': 'to', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'id': 'id', - 'endpoint_id': 'endpointID', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'status': 'status', - 'name': 'name', - 'sleep_until': 'sleepUntil', - 'every': 'every', - 'offset': 'offset', - 'runbook_link': 'runbookLink', - 'limit_every': 'limitEvery', - 'limit': 'limit', - 'tag_rules': 'tagRules', - 'description': 'description', - 'status_rules': 'statusRules', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, type="smtp", subject_template=None, body_template=None, to=None, latest_completed=None, last_run_status=None, last_run_error=None, id=None, endpoint_id=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, status=None, name=None, sleep_until=None, every=None, offset=None, runbook_link=None, limit_every=None, limit=None, tag_rules=None, description=None, status_rules=None, labels=None, links=None): # noqa: E501,D401,D403 - """SMTPNotificationRule - a model defined in OpenAPI.""" # noqa: E501 - SMTPNotificationRuleBase.__init__(self, type=type, subject_template=subject_template, body_template=body_template, to=to, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, id=id, endpoint_id=endpoint_id, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, status=status, name=name, sleep_until=sleep_until, every=every, offset=offset, runbook_link=runbook_link, limit_every=limit_every, limit=limit, tag_rules=tag_rules, description=description, status_rules=status_rules, labels=labels, links=links) # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, SMTPNotificationRule): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/smtp_notification_rule_base.py b/frogpilot/third_party/influxdb_client/domain/smtp_notification_rule_base.py deleted file mode 100644 index 18cbae11b..000000000 --- a/frogpilot/third_party/influxdb_client/domain/smtp_notification_rule_base.py +++ /dev/null @@ -1,229 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.notification_rule_discriminator import NotificationRuleDiscriminator - - -class SMTPNotificationRuleBase(NotificationRuleDiscriminator): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'subject_template': 'str', - 'body_template': 'str', - 'to': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'id': 'str', - 'endpoint_id': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'status': 'TaskStatusType', - 'name': 'str', - 'sleep_until': 'str', - 'every': 'str', - 'offset': 'str', - 'runbook_link': 'str', - 'limit_every': 'int', - 'limit': 'int', - 'tag_rules': 'list[TagRule]', - 'description': 'str', - 'status_rules': 'list[StatusRule]', - 'labels': 'list[Label]', - 'links': 'NotificationRuleBaseLinks' - } - - attribute_map = { - 'type': 'type', - 'subject_template': 'subjectTemplate', - 'body_template': 'bodyTemplate', - 'to': 'to', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'id': 'id', - 'endpoint_id': 'endpointID', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'status': 'status', - 'name': 'name', - 'sleep_until': 'sleepUntil', - 'every': 'every', - 'offset': 'offset', - 'runbook_link': 'runbookLink', - 'limit_every': 'limitEvery', - 'limit': 'limit', - 'tag_rules': 'tagRules', - 'description': 'description', - 'status_rules': 'statusRules', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, type=None, subject_template=None, body_template=None, to=None, latest_completed=None, last_run_status=None, last_run_error=None, id=None, endpoint_id=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, status=None, name=None, sleep_until=None, every=None, offset=None, runbook_link=None, limit_every=None, limit=None, tag_rules=None, description=None, status_rules=None, labels=None, links=None): # noqa: E501,D401,D403 - """SMTPNotificationRuleBase - a model defined in OpenAPI.""" # noqa: E501 - NotificationRuleDiscriminator.__init__(self, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, id=id, endpoint_id=endpoint_id, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, status=status, name=name, sleep_until=sleep_until, every=every, offset=offset, runbook_link=runbook_link, limit_every=limit_every, limit=limit, tag_rules=tag_rules, description=description, status_rules=status_rules, labels=labels, links=links) # noqa: E501 - - self._type = None - self._subject_template = None - self._body_template = None - self._to = None - self.discriminator = None - - self.type = type - self.subject_template = subject_template - if body_template is not None: - self.body_template = body_template - self.to = to - - @property - def type(self): - """Get the type of this SMTPNotificationRuleBase. - - :return: The type of this SMTPNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this SMTPNotificationRuleBase. - - :param type: The type of this SMTPNotificationRuleBase. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def subject_template(self): - """Get the subject_template of this SMTPNotificationRuleBase. - - :return: The subject_template of this SMTPNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._subject_template - - @subject_template.setter - def subject_template(self, subject_template): - """Set the subject_template of this SMTPNotificationRuleBase. - - :param subject_template: The subject_template of this SMTPNotificationRuleBase. - :type: str - """ # noqa: E501 - if subject_template is None: - raise ValueError("Invalid value for `subject_template`, must not be `None`") # noqa: E501 - self._subject_template = subject_template - - @property - def body_template(self): - """Get the body_template of this SMTPNotificationRuleBase. - - :return: The body_template of this SMTPNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._body_template - - @body_template.setter - def body_template(self, body_template): - """Set the body_template of this SMTPNotificationRuleBase. - - :param body_template: The body_template of this SMTPNotificationRuleBase. - :type: str - """ # noqa: E501 - self._body_template = body_template - - @property - def to(self): - """Get the to of this SMTPNotificationRuleBase. - - :return: The to of this SMTPNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._to - - @to.setter - def to(self, to): - """Set the to of this SMTPNotificationRuleBase. - - :param to: The to of this SMTPNotificationRuleBase. - :type: str - """ # noqa: E501 - if to is None: - raise ValueError("Invalid value for `to`, must not be `None`") # noqa: E501 - self._to = to - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, SMTPNotificationRuleBase): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/source.py b/frogpilot/third_party/influxdb_client/domain/source.py deleted file mode 100644 index c45cb12aa..000000000 --- a/frogpilot/third_party/influxdb_client/domain/source.py +++ /dev/null @@ -1,459 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Source(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'SourceLinks', - 'id': 'str', - 'org_id': 'str', - 'default': 'bool', - 'name': 'str', - 'type': 'str', - 'url': 'str', - 'insecure_skip_verify': 'bool', - 'telegraf': 'str', - 'token': 'str', - 'username': 'str', - 'password': 'str', - 'shared_secret': 'str', - 'meta_url': 'str', - 'default_rp': 'str', - 'languages': 'list[str]' - } - - attribute_map = { - 'links': 'links', - 'id': 'id', - 'org_id': 'orgID', - 'default': 'default', - 'name': 'name', - 'type': 'type', - 'url': 'url', - 'insecure_skip_verify': 'insecureSkipVerify', - 'telegraf': 'telegraf', - 'token': 'token', - 'username': 'username', - 'password': 'password', - 'shared_secret': 'sharedSecret', - 'meta_url': 'metaUrl', - 'default_rp': 'defaultRP', - 'languages': 'languages' - } - - def __init__(self, links=None, id=None, org_id=None, default=None, name=None, type=None, url=None, insecure_skip_verify=None, telegraf=None, token=None, username=None, password=None, shared_secret=None, meta_url=None, default_rp=None, languages=None): # noqa: E501,D401,D403 - """Source - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._id = None - self._org_id = None - self._default = None - self._name = None - self._type = None - self._url = None - self._insecure_skip_verify = None - self._telegraf = None - self._token = None - self._username = None - self._password = None - self._shared_secret = None - self._meta_url = None - self._default_rp = None - self._languages = None - self.discriminator = None - - if links is not None: - self.links = links - if id is not None: - self.id = id - if org_id is not None: - self.org_id = org_id - if default is not None: - self.default = default - if name is not None: - self.name = name - if type is not None: - self.type = type - if url is not None: - self.url = url - if insecure_skip_verify is not None: - self.insecure_skip_verify = insecure_skip_verify - if telegraf is not None: - self.telegraf = telegraf - if token is not None: - self.token = token - if username is not None: - self.username = username - if password is not None: - self.password = password - if shared_secret is not None: - self.shared_secret = shared_secret - if meta_url is not None: - self.meta_url = meta_url - if default_rp is not None: - self.default_rp = default_rp - if languages is not None: - self.languages = languages - - @property - def links(self): - """Get the links of this Source. - - :return: The links of this Source. - :rtype: SourceLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Source. - - :param links: The links of this Source. - :type: SourceLinks - """ # noqa: E501 - self._links = links - - @property - def id(self): - """Get the id of this Source. - - :return: The id of this Source. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Source. - - :param id: The id of this Source. - :type: str - """ # noqa: E501 - self._id = id - - @property - def org_id(self): - """Get the org_id of this Source. - - :return: The org_id of this Source. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this Source. - - :param org_id: The org_id of this Source. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def default(self): - """Get the default of this Source. - - :return: The default of this Source. - :rtype: bool - """ # noqa: E501 - return self._default - - @default.setter - def default(self, default): - """Set the default of this Source. - - :param default: The default of this Source. - :type: bool - """ # noqa: E501 - self._default = default - - @property - def name(self): - """Get the name of this Source. - - :return: The name of this Source. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this Source. - - :param name: The name of this Source. - :type: str - """ # noqa: E501 - self._name = name - - @property - def type(self): - """Get the type of this Source. - - :return: The type of this Source. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this Source. - - :param type: The type of this Source. - :type: str - """ # noqa: E501 - self._type = type - - @property - def url(self): - """Get the url of this Source. - - :return: The url of this Source. - :rtype: str - """ # noqa: E501 - return self._url - - @url.setter - def url(self, url): - """Set the url of this Source. - - :param url: The url of this Source. - :type: str - """ # noqa: E501 - self._url = url - - @property - def insecure_skip_verify(self): - """Get the insecure_skip_verify of this Source. - - :return: The insecure_skip_verify of this Source. - :rtype: bool - """ # noqa: E501 - return self._insecure_skip_verify - - @insecure_skip_verify.setter - def insecure_skip_verify(self, insecure_skip_verify): - """Set the insecure_skip_verify of this Source. - - :param insecure_skip_verify: The insecure_skip_verify of this Source. - :type: bool - """ # noqa: E501 - self._insecure_skip_verify = insecure_skip_verify - - @property - def telegraf(self): - """Get the telegraf of this Source. - - :return: The telegraf of this Source. - :rtype: str - """ # noqa: E501 - return self._telegraf - - @telegraf.setter - def telegraf(self, telegraf): - """Set the telegraf of this Source. - - :param telegraf: The telegraf of this Source. - :type: str - """ # noqa: E501 - self._telegraf = telegraf - - @property - def token(self): - """Get the token of this Source. - - :return: The token of this Source. - :rtype: str - """ # noqa: E501 - return self._token - - @token.setter - def token(self, token): - """Set the token of this Source. - - :param token: The token of this Source. - :type: str - """ # noqa: E501 - self._token = token - - @property - def username(self): - """Get the username of this Source. - - :return: The username of this Source. - :rtype: str - """ # noqa: E501 - return self._username - - @username.setter - def username(self, username): - """Set the username of this Source. - - :param username: The username of this Source. - :type: str - """ # noqa: E501 - self._username = username - - @property - def password(self): - """Get the password of this Source. - - :return: The password of this Source. - :rtype: str - """ # noqa: E501 - return self._password - - @password.setter - def password(self, password): - """Set the password of this Source. - - :param password: The password of this Source. - :type: str - """ # noqa: E501 - self._password = password - - @property - def shared_secret(self): - """Get the shared_secret of this Source. - - :return: The shared_secret of this Source. - :rtype: str - """ # noqa: E501 - return self._shared_secret - - @shared_secret.setter - def shared_secret(self, shared_secret): - """Set the shared_secret of this Source. - - :param shared_secret: The shared_secret of this Source. - :type: str - """ # noqa: E501 - self._shared_secret = shared_secret - - @property - def meta_url(self): - """Get the meta_url of this Source. - - :return: The meta_url of this Source. - :rtype: str - """ # noqa: E501 - return self._meta_url - - @meta_url.setter - def meta_url(self, meta_url): - """Set the meta_url of this Source. - - :param meta_url: The meta_url of this Source. - :type: str - """ # noqa: E501 - self._meta_url = meta_url - - @property - def default_rp(self): - """Get the default_rp of this Source. - - :return: The default_rp of this Source. - :rtype: str - """ # noqa: E501 - return self._default_rp - - @default_rp.setter - def default_rp(self, default_rp): - """Set the default_rp of this Source. - - :param default_rp: The default_rp of this Source. - :type: str - """ # noqa: E501 - self._default_rp = default_rp - - @property - def languages(self): - """Get the languages of this Source. - - :return: The languages of this Source. - :rtype: list[str] - """ # noqa: E501 - return self._languages - - @languages.setter - def languages(self, languages): - """Set the languages of this Source. - - :param languages: The languages of this Source. - :type: list[str] - """ # noqa: E501 - allowed_values = ["flux", "influxql"] # noqa: E501 - if not set(languages).issubset(set(allowed_values)): - raise ValueError( - "Invalid values for `languages` [{0}], must be a subset of [{1}]" # noqa: E501 - .format(", ".join(map(str, set(languages) - set(allowed_values))), # noqa: E501 - ", ".join(map(str, allowed_values))) - ) - self._languages = languages - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Source): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/source_links.py b/frogpilot/third_party/influxdb_client/domain/source_links.py deleted file mode 100644 index baffe913c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/source_links.py +++ /dev/null @@ -1,176 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class SourceLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str', - 'query': 'str', - 'health': 'str', - 'buckets': 'str' - } - - attribute_map = { - '_self': 'self', - 'query': 'query', - 'health': 'health', - 'buckets': 'buckets' - } - - def __init__(self, _self=None, query=None, health=None, buckets=None): # noqa: E501,D401,D403 - """SourceLinks - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self._query = None - self._health = None - self._buckets = None - self.discriminator = None - - if _self is not None: - self._self = _self - if query is not None: - self.query = query - if health is not None: - self.health = health - if buckets is not None: - self.buckets = buckets - - @property - def _self(self): - """Get the _self of this SourceLinks. - - :return: The _self of this SourceLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this SourceLinks. - - :param _self: The _self of this SourceLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - @property - def query(self): - """Get the query of this SourceLinks. - - :return: The query of this SourceLinks. - :rtype: str - """ # noqa: E501 - return self._query - - @query.setter - def query(self, query): - """Set the query of this SourceLinks. - - :param query: The query of this SourceLinks. - :type: str - """ # noqa: E501 - self._query = query - - @property - def health(self): - """Get the health of this SourceLinks. - - :return: The health of this SourceLinks. - :rtype: str - """ # noqa: E501 - return self._health - - @health.setter - def health(self, health): - """Set the health of this SourceLinks. - - :param health: The health of this SourceLinks. - :type: str - """ # noqa: E501 - self._health = health - - @property - def buckets(self): - """Get the buckets of this SourceLinks. - - :return: The buckets of this SourceLinks. - :rtype: str - """ # noqa: E501 - return self._buckets - - @buckets.setter - def buckets(self, buckets): - """Set the buckets of this SourceLinks. - - :param buckets: The buckets of this SourceLinks. - :type: str - """ # noqa: E501 - self._buckets = buckets - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, SourceLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/sources.py b/frogpilot/third_party/influxdb_client/domain/sources.py deleted file mode 100644 index c368f13d3..000000000 --- a/frogpilot/third_party/influxdb_client/domain/sources.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Sources(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'ResourceMembersLinks', - 'sources': 'list[Source]' - } - - attribute_map = { - 'links': 'links', - 'sources': 'sources' - } - - def __init__(self, links=None, sources=None): # noqa: E501,D401,D403 - """Sources - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._sources = None - self.discriminator = None - - if links is not None: - self.links = links - if sources is not None: - self.sources = sources - - @property - def links(self): - """Get the links of this Sources. - - :return: The links of this Sources. - :rtype: ResourceMembersLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Sources. - - :param links: The links of this Sources. - :type: ResourceMembersLinks - """ # noqa: E501 - self._links = links - - @property - def sources(self): - """Get the sources of this Sources. - - :return: The sources of this Sources. - :rtype: list[Source] - """ # noqa: E501 - return self._sources - - @sources.setter - def sources(self, sources): - """Set the sources of this Sources. - - :param sources: The sources of this Sources. - :type: list[Source] - """ # noqa: E501 - self._sources = sources - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Sources): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/stack.py b/frogpilot/third_party/influxdb_client/domain/stack.py deleted file mode 100644 index cdae5a358..000000000 --- a/frogpilot/third_party/influxdb_client/domain/stack.py +++ /dev/null @@ -1,176 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Stack(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'org_id': 'str', - 'created_at': 'datetime', - 'events': 'list[StackEvents]' - } - - attribute_map = { - 'id': 'id', - 'org_id': 'orgID', - 'created_at': 'createdAt', - 'events': 'events' - } - - def __init__(self, id=None, org_id=None, created_at=None, events=None): # noqa: E501,D401,D403 - """Stack - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._org_id = None - self._created_at = None - self._events = None - self.discriminator = None - - if id is not None: - self.id = id - if org_id is not None: - self.org_id = org_id - if created_at is not None: - self.created_at = created_at - if events is not None: - self.events = events - - @property - def id(self): - """Get the id of this Stack. - - :return: The id of this Stack. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Stack. - - :param id: The id of this Stack. - :type: str - """ # noqa: E501 - self._id = id - - @property - def org_id(self): - """Get the org_id of this Stack. - - :return: The org_id of this Stack. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this Stack. - - :param org_id: The org_id of this Stack. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def created_at(self): - """Get the created_at of this Stack. - - :return: The created_at of this Stack. - :rtype: datetime - """ # noqa: E501 - return self._created_at - - @created_at.setter - def created_at(self, created_at): - """Set the created_at of this Stack. - - :param created_at: The created_at of this Stack. - :type: datetime - """ # noqa: E501 - self._created_at = created_at - - @property - def events(self): - """Get the events of this Stack. - - :return: The events of this Stack. - :rtype: list[StackEvents] - """ # noqa: E501 - return self._events - - @events.setter - def events(self, events): - """Set the events of this Stack. - - :param events: The events of this Stack. - :type: list[StackEvents] - """ # noqa: E501 - self._events = events - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Stack): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/stack_associations.py b/frogpilot/third_party/influxdb_client/domain/stack_associations.py deleted file mode 100644 index 7e3191b36..000000000 --- a/frogpilot/third_party/influxdb_client/domain/stack_associations.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class StackAssociations(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kind': 'TemplateKind', - 'meta_name': 'str' - } - - attribute_map = { - 'kind': 'kind', - 'meta_name': 'metaName' - } - - def __init__(self, kind=None, meta_name=None): # noqa: E501,D401,D403 - """StackAssociations - a model defined in OpenAPI.""" # noqa: E501 - self._kind = None - self._meta_name = None - self.discriminator = None - - if kind is not None: - self.kind = kind - if meta_name is not None: - self.meta_name = meta_name - - @property - def kind(self): - """Get the kind of this StackAssociations. - - :return: The kind of this StackAssociations. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this StackAssociations. - - :param kind: The kind of this StackAssociations. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def meta_name(self): - """Get the meta_name of this StackAssociations. - - :return: The meta_name of this StackAssociations. - :rtype: str - """ # noqa: E501 - return self._meta_name - - @meta_name.setter - def meta_name(self, meta_name): - """Set the meta_name of this StackAssociations. - - :param meta_name: The meta_name of this StackAssociations. - :type: str - """ # noqa: E501 - self._meta_name = meta_name - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, StackAssociations): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/stack_events.py b/frogpilot/third_party/influxdb_client/domain/stack_events.py deleted file mode 100644 index 854a3ab4c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/stack_events.py +++ /dev/null @@ -1,245 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class StackEvents(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'event_type': 'str', - 'name': 'str', - 'description': 'str', - 'sources': 'list[str]', - 'resources': 'list[StackResources]', - 'urls': 'list[str]', - 'updated_at': 'datetime' - } - - attribute_map = { - 'event_type': 'eventType', - 'name': 'name', - 'description': 'description', - 'sources': 'sources', - 'resources': 'resources', - 'urls': 'urls', - 'updated_at': 'updatedAt' - } - - def __init__(self, event_type=None, name=None, description=None, sources=None, resources=None, urls=None, updated_at=None): # noqa: E501,D401,D403 - """StackEvents - a model defined in OpenAPI.""" # noqa: E501 - self._event_type = None - self._name = None - self._description = None - self._sources = None - self._resources = None - self._urls = None - self._updated_at = None - self.discriminator = None - - if event_type is not None: - self.event_type = event_type - if name is not None: - self.name = name - if description is not None: - self.description = description - if sources is not None: - self.sources = sources - if resources is not None: - self.resources = resources - if urls is not None: - self.urls = urls - if updated_at is not None: - self.updated_at = updated_at - - @property - def event_type(self): - """Get the event_type of this StackEvents. - - :return: The event_type of this StackEvents. - :rtype: str - """ # noqa: E501 - return self._event_type - - @event_type.setter - def event_type(self, event_type): - """Set the event_type of this StackEvents. - - :param event_type: The event_type of this StackEvents. - :type: str - """ # noqa: E501 - self._event_type = event_type - - @property - def name(self): - """Get the name of this StackEvents. - - :return: The name of this StackEvents. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this StackEvents. - - :param name: The name of this StackEvents. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this StackEvents. - - :return: The description of this StackEvents. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this StackEvents. - - :param description: The description of this StackEvents. - :type: str - """ # noqa: E501 - self._description = description - - @property - def sources(self): - """Get the sources of this StackEvents. - - :return: The sources of this StackEvents. - :rtype: list[str] - """ # noqa: E501 - return self._sources - - @sources.setter - def sources(self, sources): - """Set the sources of this StackEvents. - - :param sources: The sources of this StackEvents. - :type: list[str] - """ # noqa: E501 - self._sources = sources - - @property - def resources(self): - """Get the resources of this StackEvents. - - :return: The resources of this StackEvents. - :rtype: list[StackResources] - """ # noqa: E501 - return self._resources - - @resources.setter - def resources(self, resources): - """Set the resources of this StackEvents. - - :param resources: The resources of this StackEvents. - :type: list[StackResources] - """ # noqa: E501 - self._resources = resources - - @property - def urls(self): - """Get the urls of this StackEvents. - - :return: The urls of this StackEvents. - :rtype: list[str] - """ # noqa: E501 - return self._urls - - @urls.setter - def urls(self, urls): - """Set the urls of this StackEvents. - - :param urls: The urls of this StackEvents. - :type: list[str] - """ # noqa: E501 - self._urls = urls - - @property - def updated_at(self): - """Get the updated_at of this StackEvents. - - :return: The updated_at of this StackEvents. - :rtype: datetime - """ # noqa: E501 - return self._updated_at - - @updated_at.setter - def updated_at(self, updated_at): - """Set the updated_at of this StackEvents. - - :param updated_at: The updated_at of this StackEvents. - :type: datetime - """ # noqa: E501 - self._updated_at = updated_at - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, StackEvents): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/stack_links.py b/frogpilot/third_party/influxdb_client/domain/stack_links.py deleted file mode 100644 index f3c733546..000000000 --- a/frogpilot/third_party/influxdb_client/domain/stack_links.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class StackLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str' - } - - attribute_map = { - '_self': 'self' - } - - def __init__(self, _self=None): # noqa: E501,D401,D403 - """StackLinks - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self.discriminator = None - - if _self is not None: - self._self = _self - - @property - def _self(self): - """Get the _self of this StackLinks. - - :return: The _self of this StackLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this StackLinks. - - :param _self: The _self of this StackLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, StackLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/stack_resources.py b/frogpilot/third_party/influxdb_client/domain/stack_resources.py deleted file mode 100644 index 3cd5f9891..000000000 --- a/frogpilot/third_party/influxdb_client/domain/stack_resources.py +++ /dev/null @@ -1,222 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class StackResources(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'api_version': 'str', - 'resource_id': 'str', - 'kind': 'TemplateKind', - 'template_meta_name': 'str', - 'associations': 'list[StackAssociations]', - 'links': 'StackLinks' - } - - attribute_map = { - 'api_version': 'apiVersion', - 'resource_id': 'resourceID', - 'kind': 'kind', - 'template_meta_name': 'templateMetaName', - 'associations': 'associations', - 'links': 'links' - } - - def __init__(self, api_version=None, resource_id=None, kind=None, template_meta_name=None, associations=None, links=None): # noqa: E501,D401,D403 - """StackResources - a model defined in OpenAPI.""" # noqa: E501 - self._api_version = None - self._resource_id = None - self._kind = None - self._template_meta_name = None - self._associations = None - self._links = None - self.discriminator = None - - if api_version is not None: - self.api_version = api_version - if resource_id is not None: - self.resource_id = resource_id - if kind is not None: - self.kind = kind - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if associations is not None: - self.associations = associations - if links is not None: - self.links = links - - @property - def api_version(self): - """Get the api_version of this StackResources. - - :return: The api_version of this StackResources. - :rtype: str - """ # noqa: E501 - return self._api_version - - @api_version.setter - def api_version(self, api_version): - """Set the api_version of this StackResources. - - :param api_version: The api_version of this StackResources. - :type: str - """ # noqa: E501 - self._api_version = api_version - - @property - def resource_id(self): - """Get the resource_id of this StackResources. - - :return: The resource_id of this StackResources. - :rtype: str - """ # noqa: E501 - return self._resource_id - - @resource_id.setter - def resource_id(self, resource_id): - """Set the resource_id of this StackResources. - - :param resource_id: The resource_id of this StackResources. - :type: str - """ # noqa: E501 - self._resource_id = resource_id - - @property - def kind(self): - """Get the kind of this StackResources. - - :return: The kind of this StackResources. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this StackResources. - - :param kind: The kind of this StackResources. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def template_meta_name(self): - """Get the template_meta_name of this StackResources. - - :return: The template_meta_name of this StackResources. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this StackResources. - - :param template_meta_name: The template_meta_name of this StackResources. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def associations(self): - """Get the associations of this StackResources. - - :return: The associations of this StackResources. - :rtype: list[StackAssociations] - """ # noqa: E501 - return self._associations - - @associations.setter - def associations(self, associations): - """Set the associations of this StackResources. - - :param associations: The associations of this StackResources. - :type: list[StackAssociations] - """ # noqa: E501 - self._associations = associations - - @property - def links(self): - """Get the links of this StackResources. - - :return: The links of this StackResources. - :rtype: StackLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this StackResources. - - :param links: The links of this StackResources. - :type: StackLinks - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, StackResources): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/statement.py b/frogpilot/third_party/influxdb_client/domain/statement.py deleted file mode 100644 index bb19fc356..000000000 --- a/frogpilot/third_party/influxdb_client/domain/statement.py +++ /dev/null @@ -1,82 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Statement(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """Statement - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Statement): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/static_legend.py b/frogpilot/third_party/influxdb_client/domain/static_legend.py deleted file mode 100644 index cff694394..000000000 --- a/frogpilot/third_party/influxdb_client/domain/static_legend.py +++ /dev/null @@ -1,245 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class StaticLegend(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'colorize_rows': 'bool', - 'height_ratio': 'float', - 'show': 'bool', - 'opacity': 'float', - 'orientation_threshold': 'int', - 'value_axis': 'str', - 'width_ratio': 'float' - } - - attribute_map = { - 'colorize_rows': 'colorizeRows', - 'height_ratio': 'heightRatio', - 'show': 'show', - 'opacity': 'opacity', - 'orientation_threshold': 'orientationThreshold', - 'value_axis': 'valueAxis', - 'width_ratio': 'widthRatio' - } - - def __init__(self, colorize_rows=None, height_ratio=None, show=None, opacity=None, orientation_threshold=None, value_axis=None, width_ratio=None): # noqa: E501,D401,D403 - """StaticLegend - a model defined in OpenAPI.""" # noqa: E501 - self._colorize_rows = None - self._height_ratio = None - self._show = None - self._opacity = None - self._orientation_threshold = None - self._value_axis = None - self._width_ratio = None - self.discriminator = None - - if colorize_rows is not None: - self.colorize_rows = colorize_rows - if height_ratio is not None: - self.height_ratio = height_ratio - if show is not None: - self.show = show - if opacity is not None: - self.opacity = opacity - if orientation_threshold is not None: - self.orientation_threshold = orientation_threshold - if value_axis is not None: - self.value_axis = value_axis - if width_ratio is not None: - self.width_ratio = width_ratio - - @property - def colorize_rows(self): - """Get the colorize_rows of this StaticLegend. - - :return: The colorize_rows of this StaticLegend. - :rtype: bool - """ # noqa: E501 - return self._colorize_rows - - @colorize_rows.setter - def colorize_rows(self, colorize_rows): - """Set the colorize_rows of this StaticLegend. - - :param colorize_rows: The colorize_rows of this StaticLegend. - :type: bool - """ # noqa: E501 - self._colorize_rows = colorize_rows - - @property - def height_ratio(self): - """Get the height_ratio of this StaticLegend. - - :return: The height_ratio of this StaticLegend. - :rtype: float - """ # noqa: E501 - return self._height_ratio - - @height_ratio.setter - def height_ratio(self, height_ratio): - """Set the height_ratio of this StaticLegend. - - :param height_ratio: The height_ratio of this StaticLegend. - :type: float - """ # noqa: E501 - self._height_ratio = height_ratio - - @property - def show(self): - """Get the show of this StaticLegend. - - :return: The show of this StaticLegend. - :rtype: bool - """ # noqa: E501 - return self._show - - @show.setter - def show(self, show): - """Set the show of this StaticLegend. - - :param show: The show of this StaticLegend. - :type: bool - """ # noqa: E501 - self._show = show - - @property - def opacity(self): - """Get the opacity of this StaticLegend. - - :return: The opacity of this StaticLegend. - :rtype: float - """ # noqa: E501 - return self._opacity - - @opacity.setter - def opacity(self, opacity): - """Set the opacity of this StaticLegend. - - :param opacity: The opacity of this StaticLegend. - :type: float - """ # noqa: E501 - self._opacity = opacity - - @property - def orientation_threshold(self): - """Get the orientation_threshold of this StaticLegend. - - :return: The orientation_threshold of this StaticLegend. - :rtype: int - """ # noqa: E501 - return self._orientation_threshold - - @orientation_threshold.setter - def orientation_threshold(self, orientation_threshold): - """Set the orientation_threshold of this StaticLegend. - - :param orientation_threshold: The orientation_threshold of this StaticLegend. - :type: int - """ # noqa: E501 - self._orientation_threshold = orientation_threshold - - @property - def value_axis(self): - """Get the value_axis of this StaticLegend. - - :return: The value_axis of this StaticLegend. - :rtype: str - """ # noqa: E501 - return self._value_axis - - @value_axis.setter - def value_axis(self, value_axis): - """Set the value_axis of this StaticLegend. - - :param value_axis: The value_axis of this StaticLegend. - :type: str - """ # noqa: E501 - self._value_axis = value_axis - - @property - def width_ratio(self): - """Get the width_ratio of this StaticLegend. - - :return: The width_ratio of this StaticLegend. - :rtype: float - """ # noqa: E501 - return self._width_ratio - - @width_ratio.setter - def width_ratio(self, width_ratio): - """Set the width_ratio of this StaticLegend. - - :param width_ratio: The width_ratio of this StaticLegend. - :type: float - """ # noqa: E501 - self._width_ratio = width_ratio - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, StaticLegend): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/status_rule.py b/frogpilot/third_party/influxdb_client/domain/status_rule.py deleted file mode 100644 index bac05845a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/status_rule.py +++ /dev/null @@ -1,176 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class StatusRule(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'current_level': 'RuleStatusLevel', - 'previous_level': 'RuleStatusLevel', - 'count': 'int', - 'period': 'str' - } - - attribute_map = { - 'current_level': 'currentLevel', - 'previous_level': 'previousLevel', - 'count': 'count', - 'period': 'period' - } - - def __init__(self, current_level=None, previous_level=None, count=None, period=None): # noqa: E501,D401,D403 - """StatusRule - a model defined in OpenAPI.""" # noqa: E501 - self._current_level = None - self._previous_level = None - self._count = None - self._period = None - self.discriminator = None - - if current_level is not None: - self.current_level = current_level - if previous_level is not None: - self.previous_level = previous_level - if count is not None: - self.count = count - if period is not None: - self.period = period - - @property - def current_level(self): - """Get the current_level of this StatusRule. - - :return: The current_level of this StatusRule. - :rtype: RuleStatusLevel - """ # noqa: E501 - return self._current_level - - @current_level.setter - def current_level(self, current_level): - """Set the current_level of this StatusRule. - - :param current_level: The current_level of this StatusRule. - :type: RuleStatusLevel - """ # noqa: E501 - self._current_level = current_level - - @property - def previous_level(self): - """Get the previous_level of this StatusRule. - - :return: The previous_level of this StatusRule. - :rtype: RuleStatusLevel - """ # noqa: E501 - return self._previous_level - - @previous_level.setter - def previous_level(self, previous_level): - """Set the previous_level of this StatusRule. - - :param previous_level: The previous_level of this StatusRule. - :type: RuleStatusLevel - """ # noqa: E501 - self._previous_level = previous_level - - @property - def count(self): - """Get the count of this StatusRule. - - :return: The count of this StatusRule. - :rtype: int - """ # noqa: E501 - return self._count - - @count.setter - def count(self, count): - """Set the count of this StatusRule. - - :param count: The count of this StatusRule. - :type: int - """ # noqa: E501 - self._count = count - - @property - def period(self): - """Get the period of this StatusRule. - - :return: The period of this StatusRule. - :rtype: str - """ # noqa: E501 - return self._period - - @period.setter - def period(self, period): - """Set the period of this StatusRule. - - :param period: The period of this StatusRule. - :type: str - """ # noqa: E501 - self._period = period - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, StatusRule): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/string_literal.py b/frogpilot/third_party/influxdb_client/domain/string_literal.py deleted file mode 100644 index 643ca4254..000000000 --- a/frogpilot/third_party/influxdb_client/domain/string_literal.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.property_key import PropertyKey - - -class StringLiteral(PropertyKey): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'value': 'str' - } - - attribute_map = { - 'type': 'type', - 'value': 'value' - } - - def __init__(self, type=None, value=None): # noqa: E501,D401,D403 - """StringLiteral - a model defined in OpenAPI.""" # noqa: E501 - PropertyKey.__init__(self) # noqa: E501 - - self._type = None - self._value = None - self.discriminator = None - - if type is not None: - self.type = type - if value is not None: - self.value = value - - @property - def type(self): - """Get the type of this StringLiteral. - - Type of AST node - - :return: The type of this StringLiteral. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this StringLiteral. - - Type of AST node - - :param type: The type of this StringLiteral. - :type: str - """ # noqa: E501 - self._type = type - - @property - def value(self): - """Get the value of this StringLiteral. - - :return: The value of this StringLiteral. - :rtype: str - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this StringLiteral. - - :param value: The value of this StringLiteral. - :type: str - """ # noqa: E501 - self._value = value - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, StringLiteral): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/subscription_manifest.py b/frogpilot/third_party/influxdb_client/domain/subscription_manifest.py deleted file mode 100644 index 7366561e8..000000000 --- a/frogpilot/third_party/influxdb_client/domain/subscription_manifest.py +++ /dev/null @@ -1,156 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class SubscriptionManifest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'mode': 'str', - 'destinations': 'list[str]' - } - - attribute_map = { - 'name': 'name', - 'mode': 'mode', - 'destinations': 'destinations' - } - - def __init__(self, name=None, mode=None, destinations=None): # noqa: E501,D401,D403 - """SubscriptionManifest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._mode = None - self._destinations = None - self.discriminator = None - - self.name = name - self.mode = mode - self.destinations = destinations - - @property - def name(self): - """Get the name of this SubscriptionManifest. - - :return: The name of this SubscriptionManifest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this SubscriptionManifest. - - :param name: The name of this SubscriptionManifest. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def mode(self): - """Get the mode of this SubscriptionManifest. - - :return: The mode of this SubscriptionManifest. - :rtype: str - """ # noqa: E501 - return self._mode - - @mode.setter - def mode(self, mode): - """Set the mode of this SubscriptionManifest. - - :param mode: The mode of this SubscriptionManifest. - :type: str - """ # noqa: E501 - if mode is None: - raise ValueError("Invalid value for `mode`, must not be `None`") # noqa: E501 - self._mode = mode - - @property - def destinations(self): - """Get the destinations of this SubscriptionManifest. - - :return: The destinations of this SubscriptionManifest. - :rtype: list[str] - """ # noqa: E501 - return self._destinations - - @destinations.setter - def destinations(self, destinations): - """Set the destinations of this SubscriptionManifest. - - :param destinations: The destinations of this SubscriptionManifest. - :type: list[str] - """ # noqa: E501 - if destinations is None: - raise ValueError("Invalid value for `destinations`, must not be `None`") # noqa: E501 - self._destinations = destinations - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, SubscriptionManifest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/table_view_properties.py b/frogpilot/third_party/influxdb_client/domain/table_view_properties.py deleted file mode 100644 index bd8ec0d99..000000000 --- a/frogpilot/third_party/influxdb_client/domain/table_view_properties.py +++ /dev/null @@ -1,344 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.view_properties import ViewProperties - - -class TableViewProperties(ViewProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'queries': 'list[DashboardQuery]', - 'colors': 'list[DashboardColor]', - 'shape': 'str', - 'note': 'str', - 'show_note_when_empty': 'bool', - 'table_options': 'TableViewPropertiesTableOptions', - 'field_options': 'list[RenamableField]', - 'time_format': 'str', - 'decimal_places': 'DecimalPlaces' - } - - attribute_map = { - 'type': 'type', - 'queries': 'queries', - 'colors': 'colors', - 'shape': 'shape', - 'note': 'note', - 'show_note_when_empty': 'showNoteWhenEmpty', - 'table_options': 'tableOptions', - 'field_options': 'fieldOptions', - 'time_format': 'timeFormat', - 'decimal_places': 'decimalPlaces' - } - - def __init__(self, type=None, queries=None, colors=None, shape=None, note=None, show_note_when_empty=None, table_options=None, field_options=None, time_format=None, decimal_places=None): # noqa: E501,D401,D403 - """TableViewProperties - a model defined in OpenAPI.""" # noqa: E501 - ViewProperties.__init__(self) # noqa: E501 - - self._type = None - self._queries = None - self._colors = None - self._shape = None - self._note = None - self._show_note_when_empty = None - self._table_options = None - self._field_options = None - self._time_format = None - self._decimal_places = None - self.discriminator = None - - self.type = type - self.queries = queries - self.colors = colors - self.shape = shape - self.note = note - self.show_note_when_empty = show_note_when_empty - self.table_options = table_options - self.field_options = field_options - self.time_format = time_format - self.decimal_places = decimal_places - - @property - def type(self): - """Get the type of this TableViewProperties. - - :return: The type of this TableViewProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this TableViewProperties. - - :param type: The type of this TableViewProperties. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def queries(self): - """Get the queries of this TableViewProperties. - - :return: The queries of this TableViewProperties. - :rtype: list[DashboardQuery] - """ # noqa: E501 - return self._queries - - @queries.setter - def queries(self, queries): - """Set the queries of this TableViewProperties. - - :param queries: The queries of this TableViewProperties. - :type: list[DashboardQuery] - """ # noqa: E501 - if queries is None: - raise ValueError("Invalid value for `queries`, must not be `None`") # noqa: E501 - self._queries = queries - - @property - def colors(self): - """Get the colors of this TableViewProperties. - - Colors define color encoding of data into a visualization - - :return: The colors of this TableViewProperties. - :rtype: list[DashboardColor] - """ # noqa: E501 - return self._colors - - @colors.setter - def colors(self, colors): - """Set the colors of this TableViewProperties. - - Colors define color encoding of data into a visualization - - :param colors: The colors of this TableViewProperties. - :type: list[DashboardColor] - """ # noqa: E501 - if colors is None: - raise ValueError("Invalid value for `colors`, must not be `None`") # noqa: E501 - self._colors = colors - - @property - def shape(self): - """Get the shape of this TableViewProperties. - - :return: The shape of this TableViewProperties. - :rtype: str - """ # noqa: E501 - return self._shape - - @shape.setter - def shape(self, shape): - """Set the shape of this TableViewProperties. - - :param shape: The shape of this TableViewProperties. - :type: str - """ # noqa: E501 - if shape is None: - raise ValueError("Invalid value for `shape`, must not be `None`") # noqa: E501 - self._shape = shape - - @property - def note(self): - """Get the note of this TableViewProperties. - - :return: The note of this TableViewProperties. - :rtype: str - """ # noqa: E501 - return self._note - - @note.setter - def note(self, note): - """Set the note of this TableViewProperties. - - :param note: The note of this TableViewProperties. - :type: str - """ # noqa: E501 - if note is None: - raise ValueError("Invalid value for `note`, must not be `None`") # noqa: E501 - self._note = note - - @property - def show_note_when_empty(self): - """Get the show_note_when_empty of this TableViewProperties. - - If true, will display note when empty - - :return: The show_note_when_empty of this TableViewProperties. - :rtype: bool - """ # noqa: E501 - return self._show_note_when_empty - - @show_note_when_empty.setter - def show_note_when_empty(self, show_note_when_empty): - """Set the show_note_when_empty of this TableViewProperties. - - If true, will display note when empty - - :param show_note_when_empty: The show_note_when_empty of this TableViewProperties. - :type: bool - """ # noqa: E501 - if show_note_when_empty is None: - raise ValueError("Invalid value for `show_note_when_empty`, must not be `None`") # noqa: E501 - self._show_note_when_empty = show_note_when_empty - - @property - def table_options(self): - """Get the table_options of this TableViewProperties. - - :return: The table_options of this TableViewProperties. - :rtype: TableViewPropertiesTableOptions - """ # noqa: E501 - return self._table_options - - @table_options.setter - def table_options(self, table_options): - """Set the table_options of this TableViewProperties. - - :param table_options: The table_options of this TableViewProperties. - :type: TableViewPropertiesTableOptions - """ # noqa: E501 - if table_options is None: - raise ValueError("Invalid value for `table_options`, must not be `None`") # noqa: E501 - self._table_options = table_options - - @property - def field_options(self): - """Get the field_options of this TableViewProperties. - - fieldOptions represent the fields retrieved by the query with customization options - - :return: The field_options of this TableViewProperties. - :rtype: list[RenamableField] - """ # noqa: E501 - return self._field_options - - @field_options.setter - def field_options(self, field_options): - """Set the field_options of this TableViewProperties. - - fieldOptions represent the fields retrieved by the query with customization options - - :param field_options: The field_options of this TableViewProperties. - :type: list[RenamableField] - """ # noqa: E501 - if field_options is None: - raise ValueError("Invalid value for `field_options`, must not be `None`") # noqa: E501 - self._field_options = field_options - - @property - def time_format(self): - """Get the time_format of this TableViewProperties. - - timeFormat describes the display format for time values according to moment.js date formatting - - :return: The time_format of this TableViewProperties. - :rtype: str - """ # noqa: E501 - return self._time_format - - @time_format.setter - def time_format(self, time_format): - """Set the time_format of this TableViewProperties. - - timeFormat describes the display format for time values according to moment.js date formatting - - :param time_format: The time_format of this TableViewProperties. - :type: str - """ # noqa: E501 - if time_format is None: - raise ValueError("Invalid value for `time_format`, must not be `None`") # noqa: E501 - self._time_format = time_format - - @property - def decimal_places(self): - """Get the decimal_places of this TableViewProperties. - - :return: The decimal_places of this TableViewProperties. - :rtype: DecimalPlaces - """ # noqa: E501 - return self._decimal_places - - @decimal_places.setter - def decimal_places(self, decimal_places): - """Set the decimal_places of this TableViewProperties. - - :param decimal_places: The decimal_places of this TableViewProperties. - :type: DecimalPlaces - """ # noqa: E501 - if decimal_places is None: - raise ValueError("Invalid value for `decimal_places`, must not be `None`") # noqa: E501 - self._decimal_places = decimal_places - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TableViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/table_view_properties_table_options.py b/frogpilot/third_party/influxdb_client/domain/table_view_properties_table_options.py deleted file mode 100644 index 71193ca95..000000000 --- a/frogpilot/third_party/influxdb_client/domain/table_view_properties_table_options.py +++ /dev/null @@ -1,188 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TableViewPropertiesTableOptions(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'vertical_time_axis': 'bool', - 'sort_by': 'RenamableField', - 'wrapping': 'str', - 'fix_first_column': 'bool' - } - - attribute_map = { - 'vertical_time_axis': 'verticalTimeAxis', - 'sort_by': 'sortBy', - 'wrapping': 'wrapping', - 'fix_first_column': 'fixFirstColumn' - } - - def __init__(self, vertical_time_axis=None, sort_by=None, wrapping=None, fix_first_column=None): # noqa: E501,D401,D403 - """TableViewPropertiesTableOptions - a model defined in OpenAPI.""" # noqa: E501 - self._vertical_time_axis = None - self._sort_by = None - self._wrapping = None - self._fix_first_column = None - self.discriminator = None - - if vertical_time_axis is not None: - self.vertical_time_axis = vertical_time_axis - if sort_by is not None: - self.sort_by = sort_by - if wrapping is not None: - self.wrapping = wrapping - if fix_first_column is not None: - self.fix_first_column = fix_first_column - - @property - def vertical_time_axis(self): - """Get the vertical_time_axis of this TableViewPropertiesTableOptions. - - verticalTimeAxis describes the orientation of the table by indicating whether the time axis will be displayed vertically - - :return: The vertical_time_axis of this TableViewPropertiesTableOptions. - :rtype: bool - """ # noqa: E501 - return self._vertical_time_axis - - @vertical_time_axis.setter - def vertical_time_axis(self, vertical_time_axis): - """Set the vertical_time_axis of this TableViewPropertiesTableOptions. - - verticalTimeAxis describes the orientation of the table by indicating whether the time axis will be displayed vertically - - :param vertical_time_axis: The vertical_time_axis of this TableViewPropertiesTableOptions. - :type: bool - """ # noqa: E501 - self._vertical_time_axis = vertical_time_axis - - @property - def sort_by(self): - """Get the sort_by of this TableViewPropertiesTableOptions. - - :return: The sort_by of this TableViewPropertiesTableOptions. - :rtype: RenamableField - """ # noqa: E501 - return self._sort_by - - @sort_by.setter - def sort_by(self, sort_by): - """Set the sort_by of this TableViewPropertiesTableOptions. - - :param sort_by: The sort_by of this TableViewPropertiesTableOptions. - :type: RenamableField - """ # noqa: E501 - self._sort_by = sort_by - - @property - def wrapping(self): - """Get the wrapping of this TableViewPropertiesTableOptions. - - Wrapping describes the text wrapping style to be used in table views - - :return: The wrapping of this TableViewPropertiesTableOptions. - :rtype: str - """ # noqa: E501 - return self._wrapping - - @wrapping.setter - def wrapping(self, wrapping): - """Set the wrapping of this TableViewPropertiesTableOptions. - - Wrapping describes the text wrapping style to be used in table views - - :param wrapping: The wrapping of this TableViewPropertiesTableOptions. - :type: str - """ # noqa: E501 - self._wrapping = wrapping - - @property - def fix_first_column(self): - """Get the fix_first_column of this TableViewPropertiesTableOptions. - - fixFirstColumn indicates whether the first column of the table should be locked - - :return: The fix_first_column of this TableViewPropertiesTableOptions. - :rtype: bool - """ # noqa: E501 - return self._fix_first_column - - @fix_first_column.setter - def fix_first_column(self, fix_first_column): - """Set the fix_first_column of this TableViewPropertiesTableOptions. - - fixFirstColumn indicates whether the first column of the table should be locked - - :param fix_first_column: The fix_first_column of this TableViewPropertiesTableOptions. - :type: bool - """ # noqa: E501 - self._fix_first_column = fix_first_column - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TableViewPropertiesTableOptions): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/tag_rule.py b/frogpilot/third_party/influxdb_client/domain/tag_rule.py deleted file mode 100644 index 9683856d9..000000000 --- a/frogpilot/third_party/influxdb_client/domain/tag_rule.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TagRule(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'key': 'str', - 'value': 'str', - 'operator': 'str' - } - - attribute_map = { - 'key': 'key', - 'value': 'value', - 'operator': 'operator' - } - - def __init__(self, key=None, value=None, operator=None): # noqa: E501,D401,D403 - """TagRule - a model defined in OpenAPI.""" # noqa: E501 - self._key = None - self._value = None - self._operator = None - self.discriminator = None - - if key is not None: - self.key = key - if value is not None: - self.value = value - if operator is not None: - self.operator = operator - - @property - def key(self): - """Get the key of this TagRule. - - :return: The key of this TagRule. - :rtype: str - """ # noqa: E501 - return self._key - - @key.setter - def key(self, key): - """Set the key of this TagRule. - - :param key: The key of this TagRule. - :type: str - """ # noqa: E501 - self._key = key - - @property - def value(self): - """Get the value of this TagRule. - - :return: The value of this TagRule. - :rtype: str - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this TagRule. - - :param value: The value of this TagRule. - :type: str - """ # noqa: E501 - self._value = value - - @property - def operator(self): - """Get the operator of this TagRule. - - :return: The operator of this TagRule. - :rtype: str - """ # noqa: E501 - return self._operator - - @operator.setter - def operator(self, operator): - """Set the operator of this TagRule. - - :param operator: The operator of this TagRule. - :type: str - """ # noqa: E501 - self._operator = operator - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TagRule): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/task.py b/frogpilot/third_party/influxdb_client/domain/task.py deleted file mode 100644 index 531babca3..000000000 --- a/frogpilot/third_party/influxdb_client/domain/task.py +++ /dev/null @@ -1,569 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Task(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'org_id': 'str', - 'org': 'str', - 'name': 'str', - 'owner_id': 'str', - 'description': 'str', - 'status': 'TaskStatusType', - 'labels': 'list[Label]', - 'authorization_id': 'str', - 'flux': 'str', - 'every': 'str', - 'cron': 'str', - 'offset': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'links': 'TaskLinks' - } - - attribute_map = { - 'id': 'id', - 'org_id': 'orgID', - 'org': 'org', - 'name': 'name', - 'owner_id': 'ownerID', - 'description': 'description', - 'status': 'status', - 'labels': 'labels', - 'authorization_id': 'authorizationID', - 'flux': 'flux', - 'every': 'every', - 'cron': 'cron', - 'offset': 'offset', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'links': 'links' - } - - def __init__(self, id=None, org_id=None, org=None, name=None, owner_id=None, description=None, status=None, labels=None, authorization_id=None, flux=None, every=None, cron=None, offset=None, latest_completed=None, last_run_status=None, last_run_error=None, created_at=None, updated_at=None, links=None): # noqa: E501,D401,D403 - """Task - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._org_id = None - self._org = None - self._name = None - self._owner_id = None - self._description = None - self._status = None - self._labels = None - self._authorization_id = None - self._flux = None - self._every = None - self._cron = None - self._offset = None - self._latest_completed = None - self._last_run_status = None - self._last_run_error = None - self._created_at = None - self._updated_at = None - self._links = None - self.discriminator = None - - self.id = id - self.org_id = org_id - if org is not None: - self.org = org - self.name = name - if owner_id is not None: - self.owner_id = owner_id - if description is not None: - self.description = description - if status is not None: - self.status = status - if labels is not None: - self.labels = labels - if authorization_id is not None: - self.authorization_id = authorization_id - self.flux = flux - if every is not None: - self.every = every - if cron is not None: - self.cron = cron - if offset is not None: - self.offset = offset - if latest_completed is not None: - self.latest_completed = latest_completed - if last_run_status is not None: - self.last_run_status = last_run_status - if last_run_error is not None: - self.last_run_error = last_run_error - if created_at is not None: - self.created_at = created_at - if updated_at is not None: - self.updated_at = updated_at - if links is not None: - self.links = links - - @property - def id(self): - """Get the id of this Task. - - :return: The id of this Task. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Task. - - :param id: The id of this Task. - :type: str - """ # noqa: E501 - if id is None: - raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 - self._id = id - - @property - def org_id(self): - """Get the org_id of this Task. - - An [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) ID. Specifies the organization that owns the task. - - :return: The org_id of this Task. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this Task. - - An [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) ID. Specifies the organization that owns the task. - - :param org_id: The org_id of this Task. - :type: str - """ # noqa: E501 - if org_id is None: - raise ValueError("Invalid value for `org_id`, must not be `None`") # noqa: E501 - self._org_id = org_id - - @property - def org(self): - """Get the org of this Task. - - An [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) name. Specifies the organization that owns the task. - - :return: The org of this Task. - :rtype: str - """ # noqa: E501 - return self._org - - @org.setter - def org(self, org): - """Set the org of this Task. - - An [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) name. Specifies the organization that owns the task. - - :param org: The org of this Task. - :type: str - """ # noqa: E501 - self._org = org - - @property - def name(self): - """Get the name of this Task. - - The name of the task. - - :return: The name of this Task. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this Task. - - The name of the task. - - :param name: The name of this Task. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def owner_id(self): - """Get the owner_id of this Task. - - A [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) ID. Specifies the owner of the task. To find a user ID, you can use the [`GET /api/v2/users` endpoint](#operation/GetUsers) to list users. - - :return: The owner_id of this Task. - :rtype: str - """ # noqa: E501 - return self._owner_id - - @owner_id.setter - def owner_id(self, owner_id): - """Set the owner_id of this Task. - - A [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) ID. Specifies the owner of the task. To find a user ID, you can use the [`GET /api/v2/users` endpoint](#operation/GetUsers) to list users. - - :param owner_id: The owner_id of this Task. - :type: str - """ # noqa: E501 - self._owner_id = owner_id - - @property - def description(self): - """Get the description of this Task. - - A description of the task. - - :return: The description of this Task. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this Task. - - A description of the task. - - :param description: The description of this Task. - :type: str - """ # noqa: E501 - self._description = description - - @property - def status(self): - """Get the status of this Task. - - :return: The status of this Task. - :rtype: TaskStatusType - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this Task. - - :param status: The status of this Task. - :type: TaskStatusType - """ # noqa: E501 - self._status = status - - @property - def labels(self): - """Get the labels of this Task. - - :return: The labels of this Task. - :rtype: list[Label] - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this Task. - - :param labels: The labels of this Task. - :type: list[Label] - """ # noqa: E501 - self._labels = labels - - @property - def authorization_id(self): - """Get the authorization_id of this Task. - - An authorization ID. Specifies the authorization used when the task communicates with the query engine. To find an authorization ID, use the [`GET /api/v2/authorizations` endpoint](#operation/GetAuthorizations) to list authorizations. - - :return: The authorization_id of this Task. - :rtype: str - """ # noqa: E501 - return self._authorization_id - - @authorization_id.setter - def authorization_id(self, authorization_id): - """Set the authorization_id of this Task. - - An authorization ID. Specifies the authorization used when the task communicates with the query engine. To find an authorization ID, use the [`GET /api/v2/authorizations` endpoint](#operation/GetAuthorizations) to list authorizations. - - :param authorization_id: The authorization_id of this Task. - :type: str - """ # noqa: E501 - self._authorization_id = authorization_id - - @property - def flux(self): - """Get the flux of this Task. - - The Flux script that the task executes. - - :return: The flux of this Task. - :rtype: str - """ # noqa: E501 - return self._flux - - @flux.setter - def flux(self, flux): - """Set the flux of this Task. - - The Flux script that the task executes. - - :param flux: The flux of this Task. - :type: str - """ # noqa: E501 - if flux is None: - raise ValueError("Invalid value for `flux`, must not be `None`") # noqa: E501 - self._flux = flux - - @property - def every(self): - """Get the every of this Task. - - The interval ([duration literal](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)) at which the task runs. `every` also determines when the task first runs, depending on the specified time. - - :return: The every of this Task. - :rtype: str - """ # noqa: E501 - return self._every - - @every.setter - def every(self, every): - """Set the every of this Task. - - The interval ([duration literal](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)) at which the task runs. `every` also determines when the task first runs, depending on the specified time. - - :param every: The every of this Task. - :type: str - """ # noqa: E501 - self._every = every - - @property - def cron(self): - """Get the cron of this Task. - - A [Cron expression](https://en.wikipedia.org/wiki/Cron#Overview) that defines the schedule on which the task runs. InfluxDB uses the system time when evaluating Cron expressions. - - :return: The cron of this Task. - :rtype: str - """ # noqa: E501 - return self._cron - - @cron.setter - def cron(self, cron): - """Set the cron of this Task. - - A [Cron expression](https://en.wikipedia.org/wiki/Cron#Overview) that defines the schedule on which the task runs. InfluxDB uses the system time when evaluating Cron expressions. - - :param cron: The cron of this Task. - :type: str - """ # noqa: E501 - self._cron = cron - - @property - def offset(self): - """Get the offset of this Task. - - A [duration](https://docs.influxdata.com/flux/v0.x/spec/lexical-elements/#duration-literals) to delay execution of the task after the scheduled time has elapsed. `0` removes the offset. - - :return: The offset of this Task. - :rtype: str - """ # noqa: E501 - return self._offset - - @offset.setter - def offset(self, offset): - """Set the offset of this Task. - - A [duration](https://docs.influxdata.com/flux/v0.x/spec/lexical-elements/#duration-literals) to delay execution of the task after the scheduled time has elapsed. `0` removes the offset. - - :param offset: The offset of this Task. - :type: str - """ # noqa: E501 - self._offset = offset - - @property - def latest_completed(self): - """Get the latest_completed of this Task. - - A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)) of the latest scheduled and completed run. - - :return: The latest_completed of this Task. - :rtype: datetime - """ # noqa: E501 - return self._latest_completed - - @latest_completed.setter - def latest_completed(self, latest_completed): - """Set the latest_completed of this Task. - - A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)) of the latest scheduled and completed run. - - :param latest_completed: The latest_completed of this Task. - :type: datetime - """ # noqa: E501 - self._latest_completed = latest_completed - - @property - def last_run_status(self): - """Get the last_run_status of this Task. - - :return: The last_run_status of this Task. - :rtype: str - """ # noqa: E501 - return self._last_run_status - - @last_run_status.setter - def last_run_status(self, last_run_status): - """Set the last_run_status of this Task. - - :param last_run_status: The last_run_status of this Task. - :type: str - """ # noqa: E501 - self._last_run_status = last_run_status - - @property - def last_run_error(self): - """Get the last_run_error of this Task. - - :return: The last_run_error of this Task. - :rtype: str - """ # noqa: E501 - return self._last_run_error - - @last_run_error.setter - def last_run_error(self, last_run_error): - """Set the last_run_error of this Task. - - :param last_run_error: The last_run_error of this Task. - :type: str - """ # noqa: E501 - self._last_run_error = last_run_error - - @property - def created_at(self): - """Get the created_at of this Task. - - :return: The created_at of this Task. - :rtype: datetime - """ # noqa: E501 - return self._created_at - - @created_at.setter - def created_at(self, created_at): - """Set the created_at of this Task. - - :param created_at: The created_at of this Task. - :type: datetime - """ # noqa: E501 - self._created_at = created_at - - @property - def updated_at(self): - """Get the updated_at of this Task. - - :return: The updated_at of this Task. - :rtype: datetime - """ # noqa: E501 - return self._updated_at - - @updated_at.setter - def updated_at(self, updated_at): - """Set the updated_at of this Task. - - :param updated_at: The updated_at of this Task. - :type: datetime - """ # noqa: E501 - self._updated_at = updated_at - - @property - def links(self): - """Get the links of this Task. - - :return: The links of this Task. - :rtype: TaskLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Task. - - :param links: The links of this Task. - :type: TaskLinks - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Task): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/task_create_request.py b/frogpilot/third_party/influxdb_client/domain/task_create_request.py deleted file mode 100644 index 462c008f5..000000000 --- a/frogpilot/third_party/influxdb_client/domain/task_create_request.py +++ /dev/null @@ -1,216 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TaskCreateRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'org_id': 'str', - 'org': 'str', - 'status': 'TaskStatusType', - 'flux': 'str', - 'description': 'str' - } - - attribute_map = { - 'org_id': 'orgID', - 'org': 'org', - 'status': 'status', - 'flux': 'flux', - 'description': 'description' - } - - def __init__(self, org_id=None, org=None, status=None, flux=None, description=None): # noqa: E501,D401,D403 - """TaskCreateRequest - a model defined in OpenAPI.""" # noqa: E501 - self._org_id = None - self._org = None - self._status = None - self._flux = None - self._description = None - self.discriminator = None - - if org_id is not None: - self.org_id = org_id - if org is not None: - self.org = org - if status is not None: - self.status = status - self.flux = flux - if description is not None: - self.description = description - - @property - def org_id(self): - """Get the org_id of this TaskCreateRequest. - - The ID of the organization that owns this Task. - - :return: The org_id of this TaskCreateRequest. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this TaskCreateRequest. - - The ID of the organization that owns this Task. - - :param org_id: The org_id of this TaskCreateRequest. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def org(self): - """Get the org of this TaskCreateRequest. - - The name of the organization that owns this Task. - - :return: The org of this TaskCreateRequest. - :rtype: str - """ # noqa: E501 - return self._org - - @org.setter - def org(self, org): - """Set the org of this TaskCreateRequest. - - The name of the organization that owns this Task. - - :param org: The org of this TaskCreateRequest. - :type: str - """ # noqa: E501 - self._org = org - - @property - def status(self): - """Get the status of this TaskCreateRequest. - - :return: The status of this TaskCreateRequest. - :rtype: TaskStatusType - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this TaskCreateRequest. - - :param status: The status of this TaskCreateRequest. - :type: TaskStatusType - """ # noqa: E501 - self._status = status - - @property - def flux(self): - """Get the flux of this TaskCreateRequest. - - The Flux script to run for this task. - - :return: The flux of this TaskCreateRequest. - :rtype: str - """ # noqa: E501 - return self._flux - - @flux.setter - def flux(self, flux): - """Set the flux of this TaskCreateRequest. - - The Flux script to run for this task. - - :param flux: The flux of this TaskCreateRequest. - :type: str - """ # noqa: E501 - if flux is None: - raise ValueError("Invalid value for `flux`, must not be `None`") # noqa: E501 - self._flux = flux - - @property - def description(self): - """Get the description of this TaskCreateRequest. - - An optional description of the task. - - :return: The description of this TaskCreateRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TaskCreateRequest. - - An optional description of the task. - - :param description: The description of this TaskCreateRequest. - :type: str - """ # noqa: E501 - self._description = description - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TaskCreateRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/task_links.py b/frogpilot/third_party/influxdb_client/domain/task_links.py deleted file mode 100644 index 86465f09e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/task_links.py +++ /dev/null @@ -1,246 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TaskLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str', - 'owners': 'str', - 'members': 'str', - 'runs': 'str', - 'logs': 'str', - 'labels': 'str' - } - - attribute_map = { - '_self': 'self', - 'owners': 'owners', - 'members': 'members', - 'runs': 'runs', - 'logs': 'logs', - 'labels': 'labels' - } - - def __init__(self, _self=None, owners=None, members=None, runs=None, logs=None, labels=None): # noqa: E501,D401,D403 - """TaskLinks - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self._owners = None - self._members = None - self._runs = None - self._logs = None - self._labels = None - self.discriminator = None - - if _self is not None: - self._self = _self - if owners is not None: - self.owners = owners - if members is not None: - self.members = members - if runs is not None: - self.runs = runs - if logs is not None: - self.logs = logs - if labels is not None: - self.labels = labels - - @property - def _self(self): - """Get the _self of this TaskLinks. - - URI of resource. - - :return: The _self of this TaskLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this TaskLinks. - - URI of resource. - - :param _self: The _self of this TaskLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - @property - def owners(self): - """Get the owners of this TaskLinks. - - URI of resource. - - :return: The owners of this TaskLinks. - :rtype: str - """ # noqa: E501 - return self._owners - - @owners.setter - def owners(self, owners): - """Set the owners of this TaskLinks. - - URI of resource. - - :param owners: The owners of this TaskLinks. - :type: str - """ # noqa: E501 - self._owners = owners - - @property - def members(self): - """Get the members of this TaskLinks. - - URI of resource. - - :return: The members of this TaskLinks. - :rtype: str - """ # noqa: E501 - return self._members - - @members.setter - def members(self, members): - """Set the members of this TaskLinks. - - URI of resource. - - :param members: The members of this TaskLinks. - :type: str - """ # noqa: E501 - self._members = members - - @property - def runs(self): - """Get the runs of this TaskLinks. - - URI of resource. - - :return: The runs of this TaskLinks. - :rtype: str - """ # noqa: E501 - return self._runs - - @runs.setter - def runs(self, runs): - """Set the runs of this TaskLinks. - - URI of resource. - - :param runs: The runs of this TaskLinks. - :type: str - """ # noqa: E501 - self._runs = runs - - @property - def logs(self): - """Get the logs of this TaskLinks. - - URI of resource. - - :return: The logs of this TaskLinks. - :rtype: str - """ # noqa: E501 - return self._logs - - @logs.setter - def logs(self, logs): - """Set the logs of this TaskLinks. - - URI of resource. - - :param logs: The logs of this TaskLinks. - :type: str - """ # noqa: E501 - self._logs = logs - - @property - def labels(self): - """Get the labels of this TaskLinks. - - URI of resource. - - :return: The labels of this TaskLinks. - :rtype: str - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this TaskLinks. - - URI of resource. - - :param labels: The labels of this TaskLinks. - :type: str - """ # noqa: E501 - self._labels = labels - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TaskLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/task_status_type.py b/frogpilot/third_party/influxdb_client/domain/task_status_type.py deleted file mode 100644 index c775c39c0..000000000 --- a/frogpilot/third_party/influxdb_client/domain/task_status_type.py +++ /dev/null @@ -1,88 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TaskStatusType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - ACTIVE = "active" - INACTIVE = "inactive" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """TaskStatusType - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TaskStatusType): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/task_update_request.py b/frogpilot/third_party/influxdb_client/domain/task_update_request.py deleted file mode 100644 index 1755a43fc..000000000 --- a/frogpilot/third_party/influxdb_client/domain/task_update_request.py +++ /dev/null @@ -1,269 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TaskUpdateRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'status': 'TaskStatusType', - 'flux': 'str', - 'name': 'str', - 'every': 'str', - 'cron': 'str', - 'offset': 'str', - 'description': 'str' - } - - attribute_map = { - 'status': 'status', - 'flux': 'flux', - 'name': 'name', - 'every': 'every', - 'cron': 'cron', - 'offset': 'offset', - 'description': 'description' - } - - def __init__(self, status=None, flux=None, name=None, every=None, cron=None, offset=None, description=None): # noqa: E501,D401,D403 - """TaskUpdateRequest - a model defined in OpenAPI.""" # noqa: E501 - self._status = None - self._flux = None - self._name = None - self._every = None - self._cron = None - self._offset = None - self._description = None - self.discriminator = None - - if status is not None: - self.status = status - if flux is not None: - self.flux = flux - if name is not None: - self.name = name - if every is not None: - self.every = every - if cron is not None: - self.cron = cron - if offset is not None: - self.offset = offset - if description is not None: - self.description = description - - @property - def status(self): - """Get the status of this TaskUpdateRequest. - - :return: The status of this TaskUpdateRequest. - :rtype: TaskStatusType - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this TaskUpdateRequest. - - :param status: The status of this TaskUpdateRequest. - :type: TaskStatusType - """ # noqa: E501 - self._status = status - - @property - def flux(self): - """Get the flux of this TaskUpdateRequest. - - The Flux script that the task runs. - - :return: The flux of this TaskUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._flux - - @flux.setter - def flux(self, flux): - """Set the flux of this TaskUpdateRequest. - - The Flux script that the task runs. - - :param flux: The flux of this TaskUpdateRequest. - :type: str - """ # noqa: E501 - self._flux = flux - - @property - def name(self): - """Get the name of this TaskUpdateRequest. - - Update the 'name' option in the flux script. - - :return: The name of this TaskUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TaskUpdateRequest. - - Update the 'name' option in the flux script. - - :param name: The name of this TaskUpdateRequest. - :type: str - """ # noqa: E501 - self._name = name - - @property - def every(self): - """Get the every of this TaskUpdateRequest. - - Update the 'every' option in the flux script. - - :return: The every of this TaskUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._every - - @every.setter - def every(self, every): - """Set the every of this TaskUpdateRequest. - - Update the 'every' option in the flux script. - - :param every: The every of this TaskUpdateRequest. - :type: str - """ # noqa: E501 - self._every = every - - @property - def cron(self): - """Get the cron of this TaskUpdateRequest. - - Update the 'cron' option in the flux script. - - :return: The cron of this TaskUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._cron - - @cron.setter - def cron(self, cron): - """Set the cron of this TaskUpdateRequest. - - Update the 'cron' option in the flux script. - - :param cron: The cron of this TaskUpdateRequest. - :type: str - """ # noqa: E501 - self._cron = cron - - @property - def offset(self): - """Get the offset of this TaskUpdateRequest. - - Update the 'offset' option in the flux script. - - :return: The offset of this TaskUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._offset - - @offset.setter - def offset(self, offset): - """Set the offset of this TaskUpdateRequest. - - Update the 'offset' option in the flux script. - - :param offset: The offset of this TaskUpdateRequest. - :type: str - """ # noqa: E501 - self._offset = offset - - @property - def description(self): - """Get the description of this TaskUpdateRequest. - - Update the description of the task. - - :return: The description of this TaskUpdateRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TaskUpdateRequest. - - Update the description of the task. - - :param description: The description of this TaskUpdateRequest. - :type: str - """ # noqa: E501 - self._description = description - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TaskUpdateRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/tasks.py b/frogpilot/third_party/influxdb_client/domain/tasks.py deleted file mode 100644 index 4174b04e2..000000000 --- a/frogpilot/third_party/influxdb_client/domain/tasks.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Tasks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'Links', - 'tasks': 'list[Task]' - } - - attribute_map = { - 'links': 'links', - 'tasks': 'tasks' - } - - def __init__(self, links=None, tasks=None): # noqa: E501,D401,D403 - """Tasks - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._tasks = None - self.discriminator = None - - if links is not None: - self.links = links - if tasks is not None: - self.tasks = tasks - - @property - def links(self): - """Get the links of this Tasks. - - :return: The links of this Tasks. - :rtype: Links - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Tasks. - - :param links: The links of this Tasks. - :type: Links - """ # noqa: E501 - self._links = links - - @property - def tasks(self): - """Get the tasks of this Tasks. - - :return: The tasks of this Tasks. - :rtype: list[Task] - """ # noqa: E501 - return self._tasks - - @tasks.setter - def tasks(self, tasks): - """Set the tasks of this Tasks. - - :param tasks: The tasks of this Tasks. - :type: list[Task] - """ # noqa: E501 - self._tasks = tasks - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Tasks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf.py b/frogpilot/third_party/influxdb_client/domain/telegraf.py deleted file mode 100644 index 05e2a412b..000000000 --- a/frogpilot/third_party/influxdb_client/domain/telegraf.py +++ /dev/null @@ -1,167 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.telegraf_request import TelegrafRequest - - -class Telegraf(TelegrafRequest): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'links': 'object', - 'labels': 'list[Label]', - 'name': 'str', - 'description': 'str', - 'metadata': 'TelegrafRequestMetadata', - 'config': 'str', - 'org_id': 'str' - } - - attribute_map = { - 'id': 'id', - 'links': 'links', - 'labels': 'labels', - 'name': 'name', - 'description': 'description', - 'metadata': 'metadata', - 'config': 'config', - 'org_id': 'orgID' - } - - def __init__(self, id=None, links=None, labels=None, name=None, description=None, metadata=None, config=None, org_id=None): # noqa: E501,D401,D403 - """Telegraf - a model defined in OpenAPI.""" # noqa: E501 - TelegrafRequest.__init__(self, name=name, description=description, metadata=metadata, config=config, org_id=org_id) # noqa: E501 - - self._id = None - self._links = None - self._labels = None - self.discriminator = None - - if id is not None: - self.id = id - if links is not None: - self.links = links - if labels is not None: - self.labels = labels - - @property - def id(self): - """Get the id of this Telegraf. - - :return: The id of this Telegraf. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Telegraf. - - :param id: The id of this Telegraf. - :type: str - """ # noqa: E501 - self._id = id - - @property - def links(self): - """Get the links of this Telegraf. - - :return: The links of this Telegraf. - :rtype: object - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Telegraf. - - :param links: The links of this Telegraf. - :type: object - """ # noqa: E501 - self._links = links - - @property - def labels(self): - """Get the labels of this Telegraf. - - :return: The labels of this Telegraf. - :rtype: list[Label] - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this Telegraf. - - :param labels: The labels of this Telegraf. - :type: list[Label] - """ # noqa: E501 - self._labels = labels - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Telegraf): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf_plugin.py b/frogpilot/third_party/influxdb_client/domain/telegraf_plugin.py deleted file mode 100644 index a01c2ef71..000000000 --- a/frogpilot/third_party/influxdb_client/domain/telegraf_plugin.py +++ /dev/null @@ -1,176 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TelegrafPlugin(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'name': 'str', - 'description': 'str', - 'config': 'dict(str, object)' - } - - attribute_map = { - 'type': 'type', - 'name': 'name', - 'description': 'description', - 'config': 'config' - } - - def __init__(self, type=None, name=None, description=None, config=None): # noqa: E501,D401,D403 - """TelegrafPlugin - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self._name = None - self._description = None - self._config = None - self.discriminator = None - - if type is not None: - self.type = type - if name is not None: - self.name = name - if description is not None: - self.description = description - if config is not None: - self.config = config - - @property - def type(self): - """Get the type of this TelegrafPlugin. - - :return: The type of this TelegrafPlugin. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this TelegrafPlugin. - - :param type: The type of this TelegrafPlugin. - :type: str - """ # noqa: E501 - self._type = type - - @property - def name(self): - """Get the name of this TelegrafPlugin. - - :return: The name of this TelegrafPlugin. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TelegrafPlugin. - - :param name: The name of this TelegrafPlugin. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this TelegrafPlugin. - - :return: The description of this TelegrafPlugin. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TelegrafPlugin. - - :param description: The description of this TelegrafPlugin. - :type: str - """ # noqa: E501 - self._description = description - - @property - def config(self): - """Get the config of this TelegrafPlugin. - - :return: The config of this TelegrafPlugin. - :rtype: dict(str, object) - """ # noqa: E501 - return self._config - - @config.setter - def config(self, config): - """Set the config of this TelegrafPlugin. - - :param config: The config of this TelegrafPlugin. - :type: dict(str, object) - """ # noqa: E501 - self._config = config - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TelegrafPlugin): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf_plugin_request.py b/frogpilot/third_party/influxdb_client/domain/telegraf_plugin_request.py deleted file mode 100644 index 79287c334..000000000 --- a/frogpilot/third_party/influxdb_client/domain/telegraf_plugin_request.py +++ /dev/null @@ -1,222 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TelegrafPluginRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'plugins': 'list[TelegrafPluginRequestPlugins]', - 'metadata': 'TelegrafRequestMetadata', - 'config': 'str', - 'org_id': 'str' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'plugins': 'plugins', - 'metadata': 'metadata', - 'config': 'config', - 'org_id': 'orgID' - } - - def __init__(self, name=None, description=None, plugins=None, metadata=None, config=None, org_id=None): # noqa: E501,D401,D403 - """TelegrafPluginRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._plugins = None - self._metadata = None - self._config = None - self._org_id = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - if plugins is not None: - self.plugins = plugins - if metadata is not None: - self.metadata = metadata - if config is not None: - self.config = config - if org_id is not None: - self.org_id = org_id - - @property - def name(self): - """Get the name of this TelegrafPluginRequest. - - :return: The name of this TelegrafPluginRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TelegrafPluginRequest. - - :param name: The name of this TelegrafPluginRequest. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this TelegrafPluginRequest. - - :return: The description of this TelegrafPluginRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TelegrafPluginRequest. - - :param description: The description of this TelegrafPluginRequest. - :type: str - """ # noqa: E501 - self._description = description - - @property - def plugins(self): - """Get the plugins of this TelegrafPluginRequest. - - :return: The plugins of this TelegrafPluginRequest. - :rtype: list[TelegrafPluginRequestPlugins] - """ # noqa: E501 - return self._plugins - - @plugins.setter - def plugins(self, plugins): - """Set the plugins of this TelegrafPluginRequest. - - :param plugins: The plugins of this TelegrafPluginRequest. - :type: list[TelegrafPluginRequestPlugins] - """ # noqa: E501 - self._plugins = plugins - - @property - def metadata(self): - """Get the metadata of this TelegrafPluginRequest. - - :return: The metadata of this TelegrafPluginRequest. - :rtype: TelegrafRequestMetadata - """ # noqa: E501 - return self._metadata - - @metadata.setter - def metadata(self, metadata): - """Set the metadata of this TelegrafPluginRequest. - - :param metadata: The metadata of this TelegrafPluginRequest. - :type: TelegrafRequestMetadata - """ # noqa: E501 - self._metadata = metadata - - @property - def config(self): - """Get the config of this TelegrafPluginRequest. - - :return: The config of this TelegrafPluginRequest. - :rtype: str - """ # noqa: E501 - return self._config - - @config.setter - def config(self, config): - """Set the config of this TelegrafPluginRequest. - - :param config: The config of this TelegrafPluginRequest. - :type: str - """ # noqa: E501 - self._config = config - - @property - def org_id(self): - """Get the org_id of this TelegrafPluginRequest. - - :return: The org_id of this TelegrafPluginRequest. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this TelegrafPluginRequest. - - :param org_id: The org_id of this TelegrafPluginRequest. - :type: str - """ # noqa: E501 - self._org_id = org_id - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TelegrafPluginRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf_plugin_request_plugins.py b/frogpilot/third_party/influxdb_client/domain/telegraf_plugin_request_plugins.py deleted file mode 100644 index 1ccf0dbf8..000000000 --- a/frogpilot/third_party/influxdb_client/domain/telegraf_plugin_request_plugins.py +++ /dev/null @@ -1,199 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TelegrafPluginRequestPlugins(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'name': 'str', - 'alias': 'str', - 'description': 'str', - 'config': 'dict(str, object)' - } - - attribute_map = { - 'type': 'type', - 'name': 'name', - 'alias': 'alias', - 'description': 'description', - 'config': 'config' - } - - def __init__(self, type=None, name=None, alias=None, description=None, config=None): # noqa: E501,D401,D403 - """TelegrafPluginRequestPlugins - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self._name = None - self._alias = None - self._description = None - self._config = None - self.discriminator = None - - if type is not None: - self.type = type - if name is not None: - self.name = name - if alias is not None: - self.alias = alias - if description is not None: - self.description = description - if config is not None: - self.config = config - - @property - def type(self): - """Get the type of this TelegrafPluginRequestPlugins. - - :return: The type of this TelegrafPluginRequestPlugins. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this TelegrafPluginRequestPlugins. - - :param type: The type of this TelegrafPluginRequestPlugins. - :type: str - """ # noqa: E501 - self._type = type - - @property - def name(self): - """Get the name of this TelegrafPluginRequestPlugins. - - :return: The name of this TelegrafPluginRequestPlugins. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TelegrafPluginRequestPlugins. - - :param name: The name of this TelegrafPluginRequestPlugins. - :type: str - """ # noqa: E501 - self._name = name - - @property - def alias(self): - """Get the alias of this TelegrafPluginRequestPlugins. - - :return: The alias of this TelegrafPluginRequestPlugins. - :rtype: str - """ # noqa: E501 - return self._alias - - @alias.setter - def alias(self, alias): - """Set the alias of this TelegrafPluginRequestPlugins. - - :param alias: The alias of this TelegrafPluginRequestPlugins. - :type: str - """ # noqa: E501 - self._alias = alias - - @property - def description(self): - """Get the description of this TelegrafPluginRequestPlugins. - - :return: The description of this TelegrafPluginRequestPlugins. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TelegrafPluginRequestPlugins. - - :param description: The description of this TelegrafPluginRequestPlugins. - :type: str - """ # noqa: E501 - self._description = description - - @property - def config(self): - """Get the config of this TelegrafPluginRequestPlugins. - - :return: The config of this TelegrafPluginRequestPlugins. - :rtype: dict(str, object) - """ # noqa: E501 - return self._config - - @config.setter - def config(self, config): - """Set the config of this TelegrafPluginRequestPlugins. - - :param config: The config of this TelegrafPluginRequestPlugins. - :type: dict(str, object) - """ # noqa: E501 - self._config = config - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TelegrafPluginRequestPlugins): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf_plugins.py b/frogpilot/third_party/influxdb_client/domain/telegraf_plugins.py deleted file mode 100644 index 80a1842eb..000000000 --- a/frogpilot/third_party/influxdb_client/domain/telegraf_plugins.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TelegrafPlugins(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'version': 'str', - 'os': 'str', - 'plugins': 'list[TelegrafPlugin]' - } - - attribute_map = { - 'version': 'version', - 'os': 'os', - 'plugins': 'plugins' - } - - def __init__(self, version=None, os=None, plugins=None): # noqa: E501,D401,D403 - """TelegrafPlugins - a model defined in OpenAPI.""" # noqa: E501 - self._version = None - self._os = None - self._plugins = None - self.discriminator = None - - if version is not None: - self.version = version - if os is not None: - self.os = os - if plugins is not None: - self.plugins = plugins - - @property - def version(self): - """Get the version of this TelegrafPlugins. - - :return: The version of this TelegrafPlugins. - :rtype: str - """ # noqa: E501 - return self._version - - @version.setter - def version(self, version): - """Set the version of this TelegrafPlugins. - - :param version: The version of this TelegrafPlugins. - :type: str - """ # noqa: E501 - self._version = version - - @property - def os(self): - """Get the os of this TelegrafPlugins. - - :return: The os of this TelegrafPlugins. - :rtype: str - """ # noqa: E501 - return self._os - - @os.setter - def os(self, os): - """Set the os of this TelegrafPlugins. - - :param os: The os of this TelegrafPlugins. - :type: str - """ # noqa: E501 - self._os = os - - @property - def plugins(self): - """Get the plugins of this TelegrafPlugins. - - :return: The plugins of this TelegrafPlugins. - :rtype: list[TelegrafPlugin] - """ # noqa: E501 - return self._plugins - - @plugins.setter - def plugins(self, plugins): - """Set the plugins of this TelegrafPlugins. - - :param plugins: The plugins of this TelegrafPlugins. - :type: list[TelegrafPlugin] - """ # noqa: E501 - self._plugins = plugins - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TelegrafPlugins): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf_request.py b/frogpilot/third_party/influxdb_client/domain/telegraf_request.py deleted file mode 100644 index 898deb88e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/telegraf_request.py +++ /dev/null @@ -1,199 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TelegrafRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'metadata': 'TelegrafRequestMetadata', - 'config': 'str', - 'org_id': 'str' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'metadata': 'metadata', - 'config': 'config', - 'org_id': 'orgID' - } - - def __init__(self, name=None, description=None, metadata=None, config=None, org_id=None): # noqa: E501,D401,D403 - """TelegrafRequest - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._metadata = None - self._config = None - self._org_id = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - if metadata is not None: - self.metadata = metadata - if config is not None: - self.config = config - if org_id is not None: - self.org_id = org_id - - @property - def name(self): - """Get the name of this TelegrafRequest. - - :return: The name of this TelegrafRequest. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TelegrafRequest. - - :param name: The name of this TelegrafRequest. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this TelegrafRequest. - - :return: The description of this TelegrafRequest. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TelegrafRequest. - - :param description: The description of this TelegrafRequest. - :type: str - """ # noqa: E501 - self._description = description - - @property - def metadata(self): - """Get the metadata of this TelegrafRequest. - - :return: The metadata of this TelegrafRequest. - :rtype: TelegrafRequestMetadata - """ # noqa: E501 - return self._metadata - - @metadata.setter - def metadata(self, metadata): - """Set the metadata of this TelegrafRequest. - - :param metadata: The metadata of this TelegrafRequest. - :type: TelegrafRequestMetadata - """ # noqa: E501 - self._metadata = metadata - - @property - def config(self): - """Get the config of this TelegrafRequest. - - :return: The config of this TelegrafRequest. - :rtype: str - """ # noqa: E501 - return self._config - - @config.setter - def config(self, config): - """Set the config of this TelegrafRequest. - - :param config: The config of this TelegrafRequest. - :type: str - """ # noqa: E501 - self._config = config - - @property - def org_id(self): - """Get the org_id of this TelegrafRequest. - - :return: The org_id of this TelegrafRequest. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this TelegrafRequest. - - :param org_id: The org_id of this TelegrafRequest. - :type: str - """ # noqa: E501 - self._org_id = org_id - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TelegrafRequest): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf_request_metadata.py b/frogpilot/third_party/influxdb_client/domain/telegraf_request_metadata.py deleted file mode 100644 index e7a9f813d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/telegraf_request_metadata.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TelegrafRequestMetadata(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'buckets': 'list[str]' - } - - attribute_map = { - 'buckets': 'buckets' - } - - def __init__(self, buckets=None): # noqa: E501,D401,D403 - """TelegrafRequestMetadata - a model defined in OpenAPI.""" # noqa: E501 - self._buckets = None - self.discriminator = None - - if buckets is not None: - self.buckets = buckets - - @property - def buckets(self): - """Get the buckets of this TelegrafRequestMetadata. - - :return: The buckets of this TelegrafRequestMetadata. - :rtype: list[str] - """ # noqa: E501 - return self._buckets - - @buckets.setter - def buckets(self, buckets): - """Set the buckets of this TelegrafRequestMetadata. - - :param buckets: The buckets of this TelegrafRequestMetadata. - :type: list[str] - """ # noqa: E501 - self._buckets = buckets - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TelegrafRequestMetadata): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/telegrafs.py b/frogpilot/third_party/influxdb_client/domain/telegrafs.py deleted file mode 100644 index 17d7760e0..000000000 --- a/frogpilot/third_party/influxdb_client/domain/telegrafs.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Telegrafs(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'configurations': 'list[Telegraf]' - } - - attribute_map = { - 'configurations': 'configurations' - } - - def __init__(self, configurations=None): # noqa: E501,D401,D403 - """Telegrafs - a model defined in OpenAPI.""" # noqa: E501 - self._configurations = None - self.discriminator = None - - if configurations is not None: - self.configurations = configurations - - @property - def configurations(self): - """Get the configurations of this Telegrafs. - - :return: The configurations of this Telegrafs. - :rtype: list[Telegraf] - """ # noqa: E501 - return self._configurations - - @configurations.setter - def configurations(self, configurations): - """Set the configurations of this Telegrafs. - - :param configurations: The configurations of this Telegrafs. - :type: list[Telegraf] - """ # noqa: E501 - self._configurations = configurations - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Telegrafs): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/telegram_notification_endpoint.py b/frogpilot/third_party/influxdb_client/domain/telegram_notification_endpoint.py deleted file mode 100644 index 44c22dff4..000000000 --- a/frogpilot/third_party/influxdb_client/domain/telegram_notification_endpoint.py +++ /dev/null @@ -1,166 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.notification_endpoint_discriminator import NotificationEndpointDiscriminator - - -class TelegramNotificationEndpoint(NotificationEndpointDiscriminator): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'token': 'str', - 'channel': 'str', - 'id': 'str', - 'org_id': 'str', - 'user_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'description': 'str', - 'name': 'str', - 'status': 'str', - 'labels': 'list[Label]', - 'links': 'NotificationEndpointBaseLinks', - 'type': 'NotificationEndpointType' - } - - attribute_map = { - 'token': 'token', - 'channel': 'channel', - 'id': 'id', - 'org_id': 'orgID', - 'user_id': 'userID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'description': 'description', - 'name': 'name', - 'status': 'status', - 'labels': 'labels', - 'links': 'links', - 'type': 'type' - } - - def __init__(self, token=None, channel=None, id=None, org_id=None, user_id=None, created_at=None, updated_at=None, description=None, name=None, status='active', labels=None, links=None, type="telegram"): # noqa: E501,D401,D403 - """TelegramNotificationEndpoint - a model defined in OpenAPI.""" # noqa: E501 - NotificationEndpointDiscriminator.__init__(self, id=id, org_id=org_id, user_id=user_id, created_at=created_at, updated_at=updated_at, description=description, name=name, status=status, labels=labels, links=links, type=type) # noqa: E501 - - self._token = None - self._channel = None - self.discriminator = None - - self.token = token - self.channel = channel - - @property - def token(self): - """Get the token of this TelegramNotificationEndpoint. - - Specifies the Telegram bot token. See https://core.telegram.org/bots#creating-a-new-bot . - - :return: The token of this TelegramNotificationEndpoint. - :rtype: str - """ # noqa: E501 - return self._token - - @token.setter - def token(self, token): - """Set the token of this TelegramNotificationEndpoint. - - Specifies the Telegram bot token. See https://core.telegram.org/bots#creating-a-new-bot . - - :param token: The token of this TelegramNotificationEndpoint. - :type: str - """ # noqa: E501 - if token is None: - raise ValueError("Invalid value for `token`, must not be `None`") # noqa: E501 - self._token = token - - @property - def channel(self): - """Get the channel of this TelegramNotificationEndpoint. - - The ID of the telegram channel; a chat_id in https://core.telegram.org/bots/api#sendmessage . - - :return: The channel of this TelegramNotificationEndpoint. - :rtype: str - """ # noqa: E501 - return self._channel - - @channel.setter - def channel(self, channel): - """Set the channel of this TelegramNotificationEndpoint. - - The ID of the telegram channel; a chat_id in https://core.telegram.org/bots/api#sendmessage . - - :param channel: The channel of this TelegramNotificationEndpoint. - :type: str - """ # noqa: E501 - if channel is None: - raise ValueError("Invalid value for `channel`, must not be `None`") # noqa: E501 - self._channel = channel - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TelegramNotificationEndpoint): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/telegram_notification_rule.py b/frogpilot/third_party/influxdb_client/domain/telegram_notification_rule.py deleted file mode 100644 index 2238909cb..000000000 --- a/frogpilot/third_party/influxdb_client/domain/telegram_notification_rule.py +++ /dev/null @@ -1,140 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.telegram_notification_rule_base import TelegramNotificationRuleBase - - -class TelegramNotificationRule(TelegramNotificationRuleBase): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'message_template': 'str', - 'parse_mode': 'str', - 'disable_web_page_preview': 'bool', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'id': 'str', - 'endpoint_id': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'status': 'TaskStatusType', - 'name': 'str', - 'sleep_until': 'str', - 'every': 'str', - 'offset': 'str', - 'runbook_link': 'str', - 'limit_every': 'int', - 'limit': 'int', - 'tag_rules': 'list[TagRule]', - 'description': 'str', - 'status_rules': 'list[StatusRule]', - 'labels': 'list[Label]', - 'links': 'NotificationRuleBaseLinks' - } - - attribute_map = { - 'type': 'type', - 'message_template': 'messageTemplate', - 'parse_mode': 'parseMode', - 'disable_web_page_preview': 'disableWebPagePreview', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'id': 'id', - 'endpoint_id': 'endpointID', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'status': 'status', - 'name': 'name', - 'sleep_until': 'sleepUntil', - 'every': 'every', - 'offset': 'offset', - 'runbook_link': 'runbookLink', - 'limit_every': 'limitEvery', - 'limit': 'limit', - 'tag_rules': 'tagRules', - 'description': 'description', - 'status_rules': 'statusRules', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, type="telegram", message_template=None, parse_mode=None, disable_web_page_preview=None, latest_completed=None, last_run_status=None, last_run_error=None, id=None, endpoint_id=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, status=None, name=None, sleep_until=None, every=None, offset=None, runbook_link=None, limit_every=None, limit=None, tag_rules=None, description=None, status_rules=None, labels=None, links=None): # noqa: E501,D401,D403 - """TelegramNotificationRule - a model defined in OpenAPI.""" # noqa: E501 - TelegramNotificationRuleBase.__init__(self, type=type, message_template=message_template, parse_mode=parse_mode, disable_web_page_preview=disable_web_page_preview, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, id=id, endpoint_id=endpoint_id, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, status=status, name=name, sleep_until=sleep_until, every=every, offset=offset, runbook_link=runbook_link, limit_every=limit_every, limit=limit, tag_rules=tag_rules, description=description, status_rules=status_rules, labels=labels, links=links) # noqa: E501 - self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TelegramNotificationRule): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/telegram_notification_rule_base.py b/frogpilot/third_party/influxdb_client/domain/telegram_notification_rule_base.py deleted file mode 100644 index 8d3aeb1b3..000000000 --- a/frogpilot/third_party/influxdb_client/domain/telegram_notification_rule_base.py +++ /dev/null @@ -1,244 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.notification_rule_discriminator import NotificationRuleDiscriminator - - -class TelegramNotificationRuleBase(NotificationRuleDiscriminator): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'message_template': 'str', - 'parse_mode': 'str', - 'disable_web_page_preview': 'bool', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'id': 'str', - 'endpoint_id': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'status': 'TaskStatusType', - 'name': 'str', - 'sleep_until': 'str', - 'every': 'str', - 'offset': 'str', - 'runbook_link': 'str', - 'limit_every': 'int', - 'limit': 'int', - 'tag_rules': 'list[TagRule]', - 'description': 'str', - 'status_rules': 'list[StatusRule]', - 'labels': 'list[Label]', - 'links': 'NotificationRuleBaseLinks' - } - - attribute_map = { - 'type': 'type', - 'message_template': 'messageTemplate', - 'parse_mode': 'parseMode', - 'disable_web_page_preview': 'disableWebPagePreview', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'id': 'id', - 'endpoint_id': 'endpointID', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'status': 'status', - 'name': 'name', - 'sleep_until': 'sleepUntil', - 'every': 'every', - 'offset': 'offset', - 'runbook_link': 'runbookLink', - 'limit_every': 'limitEvery', - 'limit': 'limit', - 'tag_rules': 'tagRules', - 'description': 'description', - 'status_rules': 'statusRules', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, type=None, message_template=None, parse_mode=None, disable_web_page_preview=None, latest_completed=None, last_run_status=None, last_run_error=None, id=None, endpoint_id=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, status=None, name=None, sleep_until=None, every=None, offset=None, runbook_link=None, limit_every=None, limit=None, tag_rules=None, description=None, status_rules=None, labels=None, links=None): # noqa: E501,D401,D403 - """TelegramNotificationRuleBase - a model defined in OpenAPI.""" # noqa: E501 - NotificationRuleDiscriminator.__init__(self, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, id=id, endpoint_id=endpoint_id, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, status=status, name=name, sleep_until=sleep_until, every=every, offset=offset, runbook_link=runbook_link, limit_every=limit_every, limit=limit, tag_rules=tag_rules, description=description, status_rules=status_rules, labels=labels, links=links) # noqa: E501 - - self._type = None - self._message_template = None - self._parse_mode = None - self._disable_web_page_preview = None - self.discriminator = None - - self.type = type - self.message_template = message_template - if parse_mode is not None: - self.parse_mode = parse_mode - if disable_web_page_preview is not None: - self.disable_web_page_preview = disable_web_page_preview - - @property - def type(self): - """Get the type of this TelegramNotificationRuleBase. - - The discriminator between other types of notification rules is "telegram". - - :return: The type of this TelegramNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this TelegramNotificationRuleBase. - - The discriminator between other types of notification rules is "telegram". - - :param type: The type of this TelegramNotificationRuleBase. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def message_template(self): - """Get the message_template of this TelegramNotificationRuleBase. - - The message template as a flux interpolated string. - - :return: The message_template of this TelegramNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._message_template - - @message_template.setter - def message_template(self, message_template): - """Set the message_template of this TelegramNotificationRuleBase. - - The message template as a flux interpolated string. - - :param message_template: The message_template of this TelegramNotificationRuleBase. - :type: str - """ # noqa: E501 - if message_template is None: - raise ValueError("Invalid value for `message_template`, must not be `None`") # noqa: E501 - self._message_template = message_template - - @property - def parse_mode(self): - """Get the parse_mode of this TelegramNotificationRuleBase. - - Parse mode of the message text per https://core.telegram.org/bots/api#formatting-options. Defaults to "MarkdownV2". - - :return: The parse_mode of this TelegramNotificationRuleBase. - :rtype: str - """ # noqa: E501 - return self._parse_mode - - @parse_mode.setter - def parse_mode(self, parse_mode): - """Set the parse_mode of this TelegramNotificationRuleBase. - - Parse mode of the message text per https://core.telegram.org/bots/api#formatting-options. Defaults to "MarkdownV2". - - :param parse_mode: The parse_mode of this TelegramNotificationRuleBase. - :type: str - """ # noqa: E501 - self._parse_mode = parse_mode - - @property - def disable_web_page_preview(self): - """Get the disable_web_page_preview of this TelegramNotificationRuleBase. - - Disables preview of web links in the sent messages when "true". Defaults to "false". - - :return: The disable_web_page_preview of this TelegramNotificationRuleBase. - :rtype: bool - """ # noqa: E501 - return self._disable_web_page_preview - - @disable_web_page_preview.setter - def disable_web_page_preview(self, disable_web_page_preview): - """Set the disable_web_page_preview of this TelegramNotificationRuleBase. - - Disables preview of web links in the sent messages when "true". Defaults to "false". - - :param disable_web_page_preview: The disable_web_page_preview of this TelegramNotificationRuleBase. - :type: bool - """ # noqa: E501 - self._disable_web_page_preview = disable_web_page_preview - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TelegramNotificationRuleBase): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_apply.py b/frogpilot/third_party/influxdb_client/domain/template_apply.py deleted file mode 100644 index 6f8d5e404..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_apply.py +++ /dev/null @@ -1,323 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateApply(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'dry_run': 'bool', - 'org_id': 'str', - 'stack_id': 'str', - 'template': 'TemplateApplyTemplate', - 'templates': 'list[TemplateApplyTemplate]', - 'env_refs': 'dict(str, object)', - 'secrets': 'dict(str, str)', - 'remotes': 'list[TemplateApplyRemotes]', - 'actions': 'list[object]' - } - - attribute_map = { - 'dry_run': 'dryRun', - 'org_id': 'orgID', - 'stack_id': 'stackID', - 'template': 'template', - 'templates': 'templates', - 'env_refs': 'envRefs', - 'secrets': 'secrets', - 'remotes': 'remotes', - 'actions': 'actions' - } - - def __init__(self, dry_run=None, org_id=None, stack_id=None, template=None, templates=None, env_refs=None, secrets=None, remotes=None, actions=None): # noqa: E501,D401,D403 - """TemplateApply - a model defined in OpenAPI.""" # noqa: E501 - self._dry_run = None - self._org_id = None - self._stack_id = None - self._template = None - self._templates = None - self._env_refs = None - self._secrets = None - self._remotes = None - self._actions = None - self.discriminator = None - - if dry_run is not None: - self.dry_run = dry_run - if org_id is not None: - self.org_id = org_id - if stack_id is not None: - self.stack_id = stack_id - if template is not None: - self.template = template - if templates is not None: - self.templates = templates - if env_refs is not None: - self.env_refs = env_refs - if secrets is not None: - self.secrets = secrets - if remotes is not None: - self.remotes = remotes - if actions is not None: - self.actions = actions - - @property - def dry_run(self): - """Get the dry_run of this TemplateApply. - - Only applies a dry run of the templates passed in the request. - Validates the template and generates a resource diff and summary. - Doesn't install templates or make changes to the InfluxDB instance. - - :return: The dry_run of this TemplateApply. - :rtype: bool - """ # noqa: E501 - return self._dry_run - - @dry_run.setter - def dry_run(self, dry_run): - """Set the dry_run of this TemplateApply. - - Only applies a dry run of the templates passed in the request. - Validates the template and generates a resource diff and summary. - Doesn't install templates or make changes to the InfluxDB instance. - - :param dry_run: The dry_run of this TemplateApply. - :type: bool - """ # noqa: E501 - self._dry_run = dry_run - - @property - def org_id(self): - """Get the org_id of this TemplateApply. - - Organization ID. InfluxDB applies templates to this organization. The organization owns all resources created by the template. To find your organization, see how to [view organizations](https://docs.influxdata.com/influxdb/latest/organizations/view-orgs/). - - :return: The org_id of this TemplateApply. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this TemplateApply. - - Organization ID. InfluxDB applies templates to this organization. The organization owns all resources created by the template. To find your organization, see how to [view organizations](https://docs.influxdata.com/influxdb/latest/organizations/view-orgs/). - - :param org_id: The org_id of this TemplateApply. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def stack_id(self): - """Get the stack_id of this TemplateApply. - - ID of the stack to update. To apply templates to an existing stack in the organization, use the `stackID` parameter. If you apply templates without providing a stack ID, InfluxDB initializes a new stack with all new resources. To find a stack ID, use the InfluxDB [`/api/v2/stacks` API endpoint](#operation/ListStacks) to list stacks. #### Related guides - [Stacks](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/) - [View stacks](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/view/) - - :return: The stack_id of this TemplateApply. - :rtype: str - """ # noqa: E501 - return self._stack_id - - @stack_id.setter - def stack_id(self, stack_id): - """Set the stack_id of this TemplateApply. - - ID of the stack to update. To apply templates to an existing stack in the organization, use the `stackID` parameter. If you apply templates without providing a stack ID, InfluxDB initializes a new stack with all new resources. To find a stack ID, use the InfluxDB [`/api/v2/stacks` API endpoint](#operation/ListStacks) to list stacks. #### Related guides - [Stacks](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/) - [View stacks](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/view/) - - :param stack_id: The stack_id of this TemplateApply. - :type: str - """ # noqa: E501 - self._stack_id = stack_id - - @property - def template(self): - """Get the template of this TemplateApply. - - :return: The template of this TemplateApply. - :rtype: TemplateApplyTemplate - """ # noqa: E501 - return self._template - - @template.setter - def template(self, template): - """Set the template of this TemplateApply. - - :param template: The template of this TemplateApply. - :type: TemplateApplyTemplate - """ # noqa: E501 - self._template = template - - @property - def templates(self): - """Get the templates of this TemplateApply. - - A list of template objects to apply. A template object has a `contents` property with an array of InfluxDB resource configurations. Use the `templates` parameter to apply multiple template objects. If you use `templates`, you can't use the `template` parameter. - - :return: The templates of this TemplateApply. - :rtype: list[TemplateApplyTemplate] - """ # noqa: E501 - return self._templates - - @templates.setter - def templates(self, templates): - """Set the templates of this TemplateApply. - - A list of template objects to apply. A template object has a `contents` property with an array of InfluxDB resource configurations. Use the `templates` parameter to apply multiple template objects. If you use `templates`, you can't use the `template` parameter. - - :param templates: The templates of this TemplateApply. - :type: list[TemplateApplyTemplate] - """ # noqa: E501 - self._templates = templates - - @property - def env_refs(self): - """Get the env_refs of this TemplateApply. - - An object with key-value pairs that map to **environment references** in templates. Environment references in templates are `envRef` objects with an `envRef.key` property. To substitute a custom environment reference value when applying templates, pass `envRefs` with the `envRef.key` and the value. When you apply a template, InfluxDB replaces `envRef` objects in the template with the values that you provide in the `envRefs` parameter. For more examples, see how to [define environment references](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/#define-environment-references). The following template fields may use environment references: - `metadata.name` - `spec.endpointName` - `spec.associations.name` For more information about including environment references in template fields, see how to [include user-definable resource names](https://docs.influxdata.com/influxdb/latest/influxdb-templates/create/#include-user-definable-resource-names). - - :return: The env_refs of this TemplateApply. - :rtype: dict(str, object) - """ # noqa: E501 - return self._env_refs - - @env_refs.setter - def env_refs(self, env_refs): - """Set the env_refs of this TemplateApply. - - An object with key-value pairs that map to **environment references** in templates. Environment references in templates are `envRef` objects with an `envRef.key` property. To substitute a custom environment reference value when applying templates, pass `envRefs` with the `envRef.key` and the value. When you apply a template, InfluxDB replaces `envRef` objects in the template with the values that you provide in the `envRefs` parameter. For more examples, see how to [define environment references](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/#define-environment-references). The following template fields may use environment references: - `metadata.name` - `spec.endpointName` - `spec.associations.name` For more information about including environment references in template fields, see how to [include user-definable resource names](https://docs.influxdata.com/influxdb/latest/influxdb-templates/create/#include-user-definable-resource-names). - - :param env_refs: The env_refs of this TemplateApply. - :type: dict(str, object) - """ # noqa: E501 - self._env_refs = env_refs - - @property - def secrets(self): - """Get the secrets of this TemplateApply. - - An object with key-value pairs that map to **secrets** in queries. Queries may reference secrets stored in InfluxDB--for example, the following Flux script retrieves `POSTGRES_USERNAME` and `POSTGRES_PASSWORD` secrets and then uses them to connect to a PostgreSQL database: ```js import "sql" import "influxdata/influxdb/secrets" username = secrets.get(key: "POSTGRES_USERNAME") password = secrets.get(key: "POSTGRES_PASSWORD") sql.from( driverName: "postgres", dataSourceName: "postgresql://${username}:${password}@localhost:5432", query: "SELECT * FROM example_table", ) ``` To define secret values in your `/api/v2/templates/apply` request, pass the `secrets` parameter with key-value pairs--for example: ```json { ... "secrets": { "POSTGRES_USERNAME": "pguser", "POSTGRES_PASSWORD": "foo" } ... } ``` InfluxDB stores the key-value pairs as secrets that you can access with `secrets.get()`. Once stored, you can't view secret values in InfluxDB. #### Related guides - [How to pass secrets when installing a template](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/#pass-secrets-when-installing-a-template) - - :return: The secrets of this TemplateApply. - :rtype: dict(str, str) - """ # noqa: E501 - return self._secrets - - @secrets.setter - def secrets(self, secrets): - """Set the secrets of this TemplateApply. - - An object with key-value pairs that map to **secrets** in queries. Queries may reference secrets stored in InfluxDB--for example, the following Flux script retrieves `POSTGRES_USERNAME` and `POSTGRES_PASSWORD` secrets and then uses them to connect to a PostgreSQL database: ```js import "sql" import "influxdata/influxdb/secrets" username = secrets.get(key: "POSTGRES_USERNAME") password = secrets.get(key: "POSTGRES_PASSWORD") sql.from( driverName: "postgres", dataSourceName: "postgresql://${username}:${password}@localhost:5432", query: "SELECT * FROM example_table", ) ``` To define secret values in your `/api/v2/templates/apply` request, pass the `secrets` parameter with key-value pairs--for example: ```json { ... "secrets": { "POSTGRES_USERNAME": "pguser", "POSTGRES_PASSWORD": "foo" } ... } ``` InfluxDB stores the key-value pairs as secrets that you can access with `secrets.get()`. Once stored, you can't view secret values in InfluxDB. #### Related guides - [How to pass secrets when installing a template](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/#pass-secrets-when-installing-a-template) - - :param secrets: The secrets of this TemplateApply. - :type: dict(str, str) - """ # noqa: E501 - self._secrets = secrets - - @property - def remotes(self): - """Get the remotes of this TemplateApply. - - A list of URLs for template files. To apply a template manifest file located at a URL, pass `remotes` with an array that contains the URL. - - :return: The remotes of this TemplateApply. - :rtype: list[TemplateApplyRemotes] - """ # noqa: E501 - return self._remotes - - @remotes.setter - def remotes(self, remotes): - """Set the remotes of this TemplateApply. - - A list of URLs for template files. To apply a template manifest file located at a URL, pass `remotes` with an array that contains the URL. - - :param remotes: The remotes of this TemplateApply. - :type: list[TemplateApplyRemotes] - """ # noqa: E501 - self._remotes = remotes - - @property - def actions(self): - """Get the actions of this TemplateApply. - - A list of `action` objects. Actions let you customize how InfluxDB applies templates in the request. You can use the following actions to prevent creating or updating resources: - A `skipKind` action skips template resources of a specified `kind`. - A `skipResource` action skips template resources with a specified `metadata.name` and `kind`. - - :return: The actions of this TemplateApply. - :rtype: list[object] - """ # noqa: E501 - return self._actions - - @actions.setter - def actions(self, actions): - """Set the actions of this TemplateApply. - - A list of `action` objects. Actions let you customize how InfluxDB applies templates in the request. You can use the following actions to prevent creating or updating resources: - A `skipKind` action skips template resources of a specified `kind`. - A `skipResource` action skips template resources with a specified `metadata.name` and `kind`. - - :param actions: The actions of this TemplateApply. - :type: list[object] - """ # noqa: E501 - self._actions = actions - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateApply): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_apply_remotes.py b/frogpilot/third_party/influxdb_client/domain/template_apply_remotes.py deleted file mode 100644 index bdb835bc0..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_apply_remotes.py +++ /dev/null @@ -1,131 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateApplyRemotes(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'url': 'str', - 'content_type': 'str' - } - - attribute_map = { - 'url': 'url', - 'content_type': 'contentType' - } - - def __init__(self, url=None, content_type=None): # noqa: E501,D401,D403 - """TemplateApplyRemotes - a model defined in OpenAPI.""" # noqa: E501 - self._url = None - self._content_type = None - self.discriminator = None - - self.url = url - if content_type is not None: - self.content_type = content_type - - @property - def url(self): - """Get the url of this TemplateApplyRemotes. - - :return: The url of this TemplateApplyRemotes. - :rtype: str - """ # noqa: E501 - return self._url - - @url.setter - def url(self, url): - """Set the url of this TemplateApplyRemotes. - - :param url: The url of this TemplateApplyRemotes. - :type: str - """ # noqa: E501 - if url is None: - raise ValueError("Invalid value for `url`, must not be `None`") # noqa: E501 - self._url = url - - @property - def content_type(self): - """Get the content_type of this TemplateApplyRemotes. - - :return: The content_type of this TemplateApplyRemotes. - :rtype: str - """ # noqa: E501 - return self._content_type - - @content_type.setter - def content_type(self, content_type): - """Set the content_type of this TemplateApplyRemotes. - - :param content_type: The content_type of this TemplateApplyRemotes. - :type: str - """ # noqa: E501 - self._content_type = content_type - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateApplyRemotes): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_apply_template.py b/frogpilot/third_party/influxdb_client/domain/template_apply_template.py deleted file mode 100644 index 0fee8e97c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_apply_template.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateApplyTemplate(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'content_type': 'str', - 'sources': 'list[str]', - 'contents': 'list[object]' - } - - attribute_map = { - 'content_type': 'contentType', - 'sources': 'sources', - 'contents': 'contents' - } - - def __init__(self, content_type=None, sources=None, contents=None): # noqa: E501,D401,D403 - """TemplateApplyTemplate - a model defined in OpenAPI.""" # noqa: E501 - self._content_type = None - self._sources = None - self._contents = None - self.discriminator = None - - if content_type is not None: - self.content_type = content_type - if sources is not None: - self.sources = sources - if contents is not None: - self.contents = contents - - @property - def content_type(self): - """Get the content_type of this TemplateApplyTemplate. - - :return: The content_type of this TemplateApplyTemplate. - :rtype: str - """ # noqa: E501 - return self._content_type - - @content_type.setter - def content_type(self, content_type): - """Set the content_type of this TemplateApplyTemplate. - - :param content_type: The content_type of this TemplateApplyTemplate. - :type: str - """ # noqa: E501 - self._content_type = content_type - - @property - def sources(self): - """Get the sources of this TemplateApplyTemplate. - - :return: The sources of this TemplateApplyTemplate. - :rtype: list[str] - """ # noqa: E501 - return self._sources - - @sources.setter - def sources(self, sources): - """Set the sources of this TemplateApplyTemplate. - - :param sources: The sources of this TemplateApplyTemplate. - :type: list[str] - """ # noqa: E501 - self._sources = sources - - @property - def contents(self): - """Get the contents of this TemplateApplyTemplate. - - :return: The contents of this TemplateApplyTemplate. - :rtype: list[object] - """ # noqa: E501 - return self._contents - - @contents.setter - def contents(self, contents): - """Set the contents of this TemplateApplyTemplate. - - :param contents: The contents of this TemplateApplyTemplate. - :type: list[object] - """ # noqa: E501 - self._contents = contents - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateApplyTemplate): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_chart.py b/frogpilot/third_party/influxdb_client/domain/template_chart.py deleted file mode 100644 index 7ae7b357a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_chart.py +++ /dev/null @@ -1,199 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateChart(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'x_pos': 'int', - 'y_pos': 'int', - 'height': 'int', - 'width': 'int', - 'properties': 'ViewProperties' - } - - attribute_map = { - 'x_pos': 'xPos', - 'y_pos': 'yPos', - 'height': 'height', - 'width': 'width', - 'properties': 'properties' - } - - def __init__(self, x_pos=None, y_pos=None, height=None, width=None, properties=None): # noqa: E501,D401,D403 - """TemplateChart - a model defined in OpenAPI.""" # noqa: E501 - self._x_pos = None - self._y_pos = None - self._height = None - self._width = None - self._properties = None - self.discriminator = None - - if x_pos is not None: - self.x_pos = x_pos - if y_pos is not None: - self.y_pos = y_pos - if height is not None: - self.height = height - if width is not None: - self.width = width - if properties is not None: - self.properties = properties - - @property - def x_pos(self): - """Get the x_pos of this TemplateChart. - - :return: The x_pos of this TemplateChart. - :rtype: int - """ # noqa: E501 - return self._x_pos - - @x_pos.setter - def x_pos(self, x_pos): - """Set the x_pos of this TemplateChart. - - :param x_pos: The x_pos of this TemplateChart. - :type: int - """ # noqa: E501 - self._x_pos = x_pos - - @property - def y_pos(self): - """Get the y_pos of this TemplateChart. - - :return: The y_pos of this TemplateChart. - :rtype: int - """ # noqa: E501 - return self._y_pos - - @y_pos.setter - def y_pos(self, y_pos): - """Set the y_pos of this TemplateChart. - - :param y_pos: The y_pos of this TemplateChart. - :type: int - """ # noqa: E501 - self._y_pos = y_pos - - @property - def height(self): - """Get the height of this TemplateChart. - - :return: The height of this TemplateChart. - :rtype: int - """ # noqa: E501 - return self._height - - @height.setter - def height(self, height): - """Set the height of this TemplateChart. - - :param height: The height of this TemplateChart. - :type: int - """ # noqa: E501 - self._height = height - - @property - def width(self): - """Get the width of this TemplateChart. - - :return: The width of this TemplateChart. - :rtype: int - """ # noqa: E501 - return self._width - - @width.setter - def width(self, width): - """Set the width of this TemplateChart. - - :param width: The width of this TemplateChart. - :type: int - """ # noqa: E501 - self._width = width - - @property - def properties(self): - """Get the properties of this TemplateChart. - - :return: The properties of this TemplateChart. - :rtype: ViewProperties - """ # noqa: E501 - return self._properties - - @properties.setter - def properties(self, properties): - """Set the properties of this TemplateChart. - - :param properties: The properties of this TemplateChart. - :type: ViewProperties - """ # noqa: E501 - self._properties = properties - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateChart): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_export_by_id.py b/frogpilot/third_party/influxdb_client/domain/template_export_by_id.py deleted file mode 100644 index 7b5f21234..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_export_by_id.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateExportByID(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'stack_id': 'str', - 'org_ids': 'list[TemplateExportByIDOrgIDs]', - 'resources': 'list[TemplateExportByIDResources]' - } - - attribute_map = { - 'stack_id': 'stackID', - 'org_ids': 'orgIDs', - 'resources': 'resources' - } - - def __init__(self, stack_id=None, org_ids=None, resources=None): # noqa: E501,D401,D403 - """TemplateExportByID - a model defined in OpenAPI.""" # noqa: E501 - self._stack_id = None - self._org_ids = None - self._resources = None - self.discriminator = None - - if stack_id is not None: - self.stack_id = stack_id - if org_ids is not None: - self.org_ids = org_ids - if resources is not None: - self.resources = resources - - @property - def stack_id(self): - """Get the stack_id of this TemplateExportByID. - - :return: The stack_id of this TemplateExportByID. - :rtype: str - """ # noqa: E501 - return self._stack_id - - @stack_id.setter - def stack_id(self, stack_id): - """Set the stack_id of this TemplateExportByID. - - :param stack_id: The stack_id of this TemplateExportByID. - :type: str - """ # noqa: E501 - self._stack_id = stack_id - - @property - def org_ids(self): - """Get the org_ids of this TemplateExportByID. - - :return: The org_ids of this TemplateExportByID. - :rtype: list[TemplateExportByIDOrgIDs] - """ # noqa: E501 - return self._org_ids - - @org_ids.setter - def org_ids(self, org_ids): - """Set the org_ids of this TemplateExportByID. - - :param org_ids: The org_ids of this TemplateExportByID. - :type: list[TemplateExportByIDOrgIDs] - """ # noqa: E501 - self._org_ids = org_ids - - @property - def resources(self): - """Get the resources of this TemplateExportByID. - - :return: The resources of this TemplateExportByID. - :rtype: list[TemplateExportByIDResources] - """ # noqa: E501 - return self._resources - - @resources.setter - def resources(self, resources): - """Set the resources of this TemplateExportByID. - - :param resources: The resources of this TemplateExportByID. - :type: list[TemplateExportByIDResources] - """ # noqa: E501 - self._resources = resources - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateExportByID): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_export_by_id_org_ids.py b/frogpilot/third_party/influxdb_client/domain/template_export_by_id_org_ids.py deleted file mode 100644 index f29886e50..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_export_by_id_org_ids.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateExportByIDOrgIDs(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'org_id': 'str', - 'resource_filters': 'TemplateExportByIDResourceFilters' - } - - attribute_map = { - 'org_id': 'orgID', - 'resource_filters': 'resourceFilters' - } - - def __init__(self, org_id=None, resource_filters=None): # noqa: E501,D401,D403 - """TemplateExportByIDOrgIDs - a model defined in OpenAPI.""" # noqa: E501 - self._org_id = None - self._resource_filters = None - self.discriminator = None - - if org_id is not None: - self.org_id = org_id - if resource_filters is not None: - self.resource_filters = resource_filters - - @property - def org_id(self): - """Get the org_id of this TemplateExportByIDOrgIDs. - - :return: The org_id of this TemplateExportByIDOrgIDs. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this TemplateExportByIDOrgIDs. - - :param org_id: The org_id of this TemplateExportByIDOrgIDs. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def resource_filters(self): - """Get the resource_filters of this TemplateExportByIDOrgIDs. - - :return: The resource_filters of this TemplateExportByIDOrgIDs. - :rtype: TemplateExportByIDResourceFilters - """ # noqa: E501 - return self._resource_filters - - @resource_filters.setter - def resource_filters(self, resource_filters): - """Set the resource_filters of this TemplateExportByIDOrgIDs. - - :param resource_filters: The resource_filters of this TemplateExportByIDOrgIDs. - :type: TemplateExportByIDResourceFilters - """ # noqa: E501 - self._resource_filters = resource_filters - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateExportByIDOrgIDs): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_export_by_id_resource_filters.py b/frogpilot/third_party/influxdb_client/domain/template_export_by_id_resource_filters.py deleted file mode 100644 index 33cd9f769..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_export_by_id_resource_filters.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateExportByIDResourceFilters(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'by_label': 'list[str]', - 'by_resource_kind': 'list[TemplateKind]' - } - - attribute_map = { - 'by_label': 'byLabel', - 'by_resource_kind': 'byResourceKind' - } - - def __init__(self, by_label=None, by_resource_kind=None): # noqa: E501,D401,D403 - """TemplateExportByIDResourceFilters - a model defined in OpenAPI.""" # noqa: E501 - self._by_label = None - self._by_resource_kind = None - self.discriminator = None - - if by_label is not None: - self.by_label = by_label - if by_resource_kind is not None: - self.by_resource_kind = by_resource_kind - - @property - def by_label(self): - """Get the by_label of this TemplateExportByIDResourceFilters. - - :return: The by_label of this TemplateExportByIDResourceFilters. - :rtype: list[str] - """ # noqa: E501 - return self._by_label - - @by_label.setter - def by_label(self, by_label): - """Set the by_label of this TemplateExportByIDResourceFilters. - - :param by_label: The by_label of this TemplateExportByIDResourceFilters. - :type: list[str] - """ # noqa: E501 - self._by_label = by_label - - @property - def by_resource_kind(self): - """Get the by_resource_kind of this TemplateExportByIDResourceFilters. - - :return: The by_resource_kind of this TemplateExportByIDResourceFilters. - :rtype: list[TemplateKind] - """ # noqa: E501 - return self._by_resource_kind - - @by_resource_kind.setter - def by_resource_kind(self, by_resource_kind): - """Set the by_resource_kind of this TemplateExportByIDResourceFilters. - - :param by_resource_kind: The by_resource_kind of this TemplateExportByIDResourceFilters. - :type: list[TemplateKind] - """ # noqa: E501 - self._by_resource_kind = by_resource_kind - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateExportByIDResourceFilters): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_export_by_id_resources.py b/frogpilot/third_party/influxdb_client/domain/template_export_by_id_resources.py deleted file mode 100644 index ddbc0b42a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_export_by_id_resources.py +++ /dev/null @@ -1,159 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateExportByIDResources(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'kind': 'TemplateKind', - 'name': 'str' - } - - attribute_map = { - 'id': 'id', - 'kind': 'kind', - 'name': 'name' - } - - def __init__(self, id=None, kind=None, name=None): # noqa: E501,D401,D403 - """TemplateExportByIDResources - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._kind = None - self._name = None - self.discriminator = None - - self.id = id - self.kind = kind - if name is not None: - self.name = name - - @property - def id(self): - """Get the id of this TemplateExportByIDResources. - - :return: The id of this TemplateExportByIDResources. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateExportByIDResources. - - :param id: The id of this TemplateExportByIDResources. - :type: str - """ # noqa: E501 - if id is None: - raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 - self._id = id - - @property - def kind(self): - """Get the kind of this TemplateExportByIDResources. - - :return: The kind of this TemplateExportByIDResources. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateExportByIDResources. - - :param kind: The kind of this TemplateExportByIDResources. - :type: TemplateKind - """ # noqa: E501 - if kind is None: - raise ValueError("Invalid value for `kind`, must not be `None`") # noqa: E501 - self._kind = kind - - @property - def name(self): - """Get the name of this TemplateExportByIDResources. - - if defined with id, name is used for resource exported by id. if defined independently, resources strictly matching name are exported - - :return: The name of this TemplateExportByIDResources. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateExportByIDResources. - - if defined with id, name is used for resource exported by id. if defined independently, resources strictly matching name are exported - - :param name: The name of this TemplateExportByIDResources. - :type: str - """ # noqa: E501 - self._name = name - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateExportByIDResources): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_export_by_name.py b/frogpilot/third_party/influxdb_client/domain/template_export_by_name.py deleted file mode 100644 index aa096dea9..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_export_by_name.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateExportByName(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'stack_id': 'str', - 'org_ids': 'list[TemplateExportByIDOrgIDs]', - 'resources': 'list[TemplateExportByNameResources]' - } - - attribute_map = { - 'stack_id': 'stackID', - 'org_ids': 'orgIDs', - 'resources': 'resources' - } - - def __init__(self, stack_id=None, org_ids=None, resources=None): # noqa: E501,D401,D403 - """TemplateExportByName - a model defined in OpenAPI.""" # noqa: E501 - self._stack_id = None - self._org_ids = None - self._resources = None - self.discriminator = None - - if stack_id is not None: - self.stack_id = stack_id - if org_ids is not None: - self.org_ids = org_ids - if resources is not None: - self.resources = resources - - @property - def stack_id(self): - """Get the stack_id of this TemplateExportByName. - - :return: The stack_id of this TemplateExportByName. - :rtype: str - """ # noqa: E501 - return self._stack_id - - @stack_id.setter - def stack_id(self, stack_id): - """Set the stack_id of this TemplateExportByName. - - :param stack_id: The stack_id of this TemplateExportByName. - :type: str - """ # noqa: E501 - self._stack_id = stack_id - - @property - def org_ids(self): - """Get the org_ids of this TemplateExportByName. - - :return: The org_ids of this TemplateExportByName. - :rtype: list[TemplateExportByIDOrgIDs] - """ # noqa: E501 - return self._org_ids - - @org_ids.setter - def org_ids(self, org_ids): - """Set the org_ids of this TemplateExportByName. - - :param org_ids: The org_ids of this TemplateExportByName. - :type: list[TemplateExportByIDOrgIDs] - """ # noqa: E501 - self._org_ids = org_ids - - @property - def resources(self): - """Get the resources of this TemplateExportByName. - - :return: The resources of this TemplateExportByName. - :rtype: list[TemplateExportByNameResources] - """ # noqa: E501 - return self._resources - - @resources.setter - def resources(self, resources): - """Set the resources of this TemplateExportByName. - - :param resources: The resources of this TemplateExportByName. - :type: list[TemplateExportByNameResources] - """ # noqa: E501 - self._resources = resources - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateExportByName): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_export_by_name_resources.py b/frogpilot/third_party/influxdb_client/domain/template_export_by_name_resources.py deleted file mode 100644 index 35e955b39..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_export_by_name_resources.py +++ /dev/null @@ -1,132 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateExportByNameResources(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kind': 'TemplateKind', - 'name': 'str' - } - - attribute_map = { - 'kind': 'kind', - 'name': 'name' - } - - def __init__(self, kind=None, name=None): # noqa: E501,D401,D403 - """TemplateExportByNameResources - a model defined in OpenAPI.""" # noqa: E501 - self._kind = None - self._name = None - self.discriminator = None - - self.kind = kind - self.name = name - - @property - def kind(self): - """Get the kind of this TemplateExportByNameResources. - - :return: The kind of this TemplateExportByNameResources. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateExportByNameResources. - - :param kind: The kind of this TemplateExportByNameResources. - :type: TemplateKind - """ # noqa: E501 - if kind is None: - raise ValueError("Invalid value for `kind`, must not be `None`") # noqa: E501 - self._kind = kind - - @property - def name(self): - """Get the name of this TemplateExportByNameResources. - - :return: The name of this TemplateExportByNameResources. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateExportByNameResources. - - :param name: The name of this TemplateExportByNameResources. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateExportByNameResources): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_kind.py b/frogpilot/third_party/influxdb_client/domain/template_kind.py deleted file mode 100644 index 256408a54..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_kind.py +++ /dev/null @@ -1,100 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateKind(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - BUCKET = "Bucket" - CHECK = "Check" - CHECKDEADMAN = "CheckDeadman" - CHECKTHRESHOLD = "CheckThreshold" - DASHBOARD = "Dashboard" - LABEL = "Label" - NOTIFICATIONENDPOINT = "NotificationEndpoint" - NOTIFICATIONENDPOINTHTTP = "NotificationEndpointHTTP" - NOTIFICATIONENDPOINTPAGERDUTY = "NotificationEndpointPagerDuty" - NOTIFICATIONENDPOINTSLACK = "NotificationEndpointSlack" - NOTIFICATIONRULE = "NotificationRule" - TASK = "Task" - TELEGRAF = "Telegraf" - VARIABLE = "Variable" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """TemplateKind - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateKind): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary.py b/frogpilot/third_party/influxdb_client/domain/template_summary.py deleted file mode 100644 index bdb2e20a3..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary.py +++ /dev/null @@ -1,199 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummary(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'sources': 'list[str]', - 'stack_id': 'str', - 'summary': 'TemplateSummarySummary', - 'diff': 'TemplateSummaryDiff', - 'errors': 'list[TemplateSummaryErrors]' - } - - attribute_map = { - 'sources': 'sources', - 'stack_id': 'stackID', - 'summary': 'summary', - 'diff': 'diff', - 'errors': 'errors' - } - - def __init__(self, sources=None, stack_id=None, summary=None, diff=None, errors=None): # noqa: E501,D401,D403 - """TemplateSummary - a model defined in OpenAPI.""" # noqa: E501 - self._sources = None - self._stack_id = None - self._summary = None - self._diff = None - self._errors = None - self.discriminator = None - - if sources is not None: - self.sources = sources - if stack_id is not None: - self.stack_id = stack_id - if summary is not None: - self.summary = summary - if diff is not None: - self.diff = diff - if errors is not None: - self.errors = errors - - @property - def sources(self): - """Get the sources of this TemplateSummary. - - :return: The sources of this TemplateSummary. - :rtype: list[str] - """ # noqa: E501 - return self._sources - - @sources.setter - def sources(self, sources): - """Set the sources of this TemplateSummary. - - :param sources: The sources of this TemplateSummary. - :type: list[str] - """ # noqa: E501 - self._sources = sources - - @property - def stack_id(self): - """Get the stack_id of this TemplateSummary. - - :return: The stack_id of this TemplateSummary. - :rtype: str - """ # noqa: E501 - return self._stack_id - - @stack_id.setter - def stack_id(self, stack_id): - """Set the stack_id of this TemplateSummary. - - :param stack_id: The stack_id of this TemplateSummary. - :type: str - """ # noqa: E501 - self._stack_id = stack_id - - @property - def summary(self): - """Get the summary of this TemplateSummary. - - :return: The summary of this TemplateSummary. - :rtype: TemplateSummarySummary - """ # noqa: E501 - return self._summary - - @summary.setter - def summary(self, summary): - """Set the summary of this TemplateSummary. - - :param summary: The summary of this TemplateSummary. - :type: TemplateSummarySummary - """ # noqa: E501 - self._summary = summary - - @property - def diff(self): - """Get the diff of this TemplateSummary. - - :return: The diff of this TemplateSummary. - :rtype: TemplateSummaryDiff - """ # noqa: E501 - return self._diff - - @diff.setter - def diff(self, diff): - """Set the diff of this TemplateSummary. - - :param diff: The diff of this TemplateSummary. - :type: TemplateSummaryDiff - """ # noqa: E501 - self._diff = diff - - @property - def errors(self): - """Get the errors of this TemplateSummary. - - :return: The errors of this TemplateSummary. - :rtype: list[TemplateSummaryErrors] - """ # noqa: E501 - return self._errors - - @errors.setter - def errors(self, errors): - """Set the errors of this TemplateSummary. - - :param errors: The errors of this TemplateSummary. - :type: list[TemplateSummaryErrors] - """ # noqa: E501 - self._errors = errors - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummary): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff.py deleted file mode 100644 index 468fd4f82..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff.py +++ /dev/null @@ -1,314 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiff(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'buckets': 'list[TemplateSummaryDiffBuckets]', - 'checks': 'list[TemplateSummaryDiffChecks]', - 'dashboards': 'list[TemplateSummaryDiffDashboards]', - 'labels': 'list[TemplateSummaryDiffLabels]', - 'label_mappings': 'list[TemplateSummaryDiffLabelMappings]', - 'notification_endpoints': 'list[TemplateSummaryDiffNotificationEndpoints]', - 'notification_rules': 'list[TemplateSummaryDiffNotificationRules]', - 'tasks': 'list[TemplateSummaryDiffTasks]', - 'telegraf_configs': 'list[TemplateSummaryDiffTelegrafConfigs]', - 'variables': 'list[TemplateSummaryDiffVariables]' - } - - attribute_map = { - 'buckets': 'buckets', - 'checks': 'checks', - 'dashboards': 'dashboards', - 'labels': 'labels', - 'label_mappings': 'labelMappings', - 'notification_endpoints': 'notificationEndpoints', - 'notification_rules': 'notificationRules', - 'tasks': 'tasks', - 'telegraf_configs': 'telegrafConfigs', - 'variables': 'variables' - } - - def __init__(self, buckets=None, checks=None, dashboards=None, labels=None, label_mappings=None, notification_endpoints=None, notification_rules=None, tasks=None, telegraf_configs=None, variables=None): # noqa: E501,D401,D403 - """TemplateSummaryDiff - a model defined in OpenAPI.""" # noqa: E501 - self._buckets = None - self._checks = None - self._dashboards = None - self._labels = None - self._label_mappings = None - self._notification_endpoints = None - self._notification_rules = None - self._tasks = None - self._telegraf_configs = None - self._variables = None - self.discriminator = None - - if buckets is not None: - self.buckets = buckets - if checks is not None: - self.checks = checks - if dashboards is not None: - self.dashboards = dashboards - if labels is not None: - self.labels = labels - if label_mappings is not None: - self.label_mappings = label_mappings - if notification_endpoints is not None: - self.notification_endpoints = notification_endpoints - if notification_rules is not None: - self.notification_rules = notification_rules - if tasks is not None: - self.tasks = tasks - if telegraf_configs is not None: - self.telegraf_configs = telegraf_configs - if variables is not None: - self.variables = variables - - @property - def buckets(self): - """Get the buckets of this TemplateSummaryDiff. - - :return: The buckets of this TemplateSummaryDiff. - :rtype: list[TemplateSummaryDiffBuckets] - """ # noqa: E501 - return self._buckets - - @buckets.setter - def buckets(self, buckets): - """Set the buckets of this TemplateSummaryDiff. - - :param buckets: The buckets of this TemplateSummaryDiff. - :type: list[TemplateSummaryDiffBuckets] - """ # noqa: E501 - self._buckets = buckets - - @property - def checks(self): - """Get the checks of this TemplateSummaryDiff. - - :return: The checks of this TemplateSummaryDiff. - :rtype: list[TemplateSummaryDiffChecks] - """ # noqa: E501 - return self._checks - - @checks.setter - def checks(self, checks): - """Set the checks of this TemplateSummaryDiff. - - :param checks: The checks of this TemplateSummaryDiff. - :type: list[TemplateSummaryDiffChecks] - """ # noqa: E501 - self._checks = checks - - @property - def dashboards(self): - """Get the dashboards of this TemplateSummaryDiff. - - :return: The dashboards of this TemplateSummaryDiff. - :rtype: list[TemplateSummaryDiffDashboards] - """ # noqa: E501 - return self._dashboards - - @dashboards.setter - def dashboards(self, dashboards): - """Set the dashboards of this TemplateSummaryDiff. - - :param dashboards: The dashboards of this TemplateSummaryDiff. - :type: list[TemplateSummaryDiffDashboards] - """ # noqa: E501 - self._dashboards = dashboards - - @property - def labels(self): - """Get the labels of this TemplateSummaryDiff. - - :return: The labels of this TemplateSummaryDiff. - :rtype: list[TemplateSummaryDiffLabels] - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this TemplateSummaryDiff. - - :param labels: The labels of this TemplateSummaryDiff. - :type: list[TemplateSummaryDiffLabels] - """ # noqa: E501 - self._labels = labels - - @property - def label_mappings(self): - """Get the label_mappings of this TemplateSummaryDiff. - - :return: The label_mappings of this TemplateSummaryDiff. - :rtype: list[TemplateSummaryDiffLabelMappings] - """ # noqa: E501 - return self._label_mappings - - @label_mappings.setter - def label_mappings(self, label_mappings): - """Set the label_mappings of this TemplateSummaryDiff. - - :param label_mappings: The label_mappings of this TemplateSummaryDiff. - :type: list[TemplateSummaryDiffLabelMappings] - """ # noqa: E501 - self._label_mappings = label_mappings - - @property - def notification_endpoints(self): - """Get the notification_endpoints of this TemplateSummaryDiff. - - :return: The notification_endpoints of this TemplateSummaryDiff. - :rtype: list[TemplateSummaryDiffNotificationEndpoints] - """ # noqa: E501 - return self._notification_endpoints - - @notification_endpoints.setter - def notification_endpoints(self, notification_endpoints): - """Set the notification_endpoints of this TemplateSummaryDiff. - - :param notification_endpoints: The notification_endpoints of this TemplateSummaryDiff. - :type: list[TemplateSummaryDiffNotificationEndpoints] - """ # noqa: E501 - self._notification_endpoints = notification_endpoints - - @property - def notification_rules(self): - """Get the notification_rules of this TemplateSummaryDiff. - - :return: The notification_rules of this TemplateSummaryDiff. - :rtype: list[TemplateSummaryDiffNotificationRules] - """ # noqa: E501 - return self._notification_rules - - @notification_rules.setter - def notification_rules(self, notification_rules): - """Set the notification_rules of this TemplateSummaryDiff. - - :param notification_rules: The notification_rules of this TemplateSummaryDiff. - :type: list[TemplateSummaryDiffNotificationRules] - """ # noqa: E501 - self._notification_rules = notification_rules - - @property - def tasks(self): - """Get the tasks of this TemplateSummaryDiff. - - :return: The tasks of this TemplateSummaryDiff. - :rtype: list[TemplateSummaryDiffTasks] - """ # noqa: E501 - return self._tasks - - @tasks.setter - def tasks(self, tasks): - """Set the tasks of this TemplateSummaryDiff. - - :param tasks: The tasks of this TemplateSummaryDiff. - :type: list[TemplateSummaryDiffTasks] - """ # noqa: E501 - self._tasks = tasks - - @property - def telegraf_configs(self): - """Get the telegraf_configs of this TemplateSummaryDiff. - - :return: The telegraf_configs of this TemplateSummaryDiff. - :rtype: list[TemplateSummaryDiffTelegrafConfigs] - """ # noqa: E501 - return self._telegraf_configs - - @telegraf_configs.setter - def telegraf_configs(self, telegraf_configs): - """Set the telegraf_configs of this TemplateSummaryDiff. - - :param telegraf_configs: The telegraf_configs of this TemplateSummaryDiff. - :type: list[TemplateSummaryDiffTelegrafConfigs] - """ # noqa: E501 - self._telegraf_configs = telegraf_configs - - @property - def variables(self): - """Get the variables of this TemplateSummaryDiff. - - :return: The variables of this TemplateSummaryDiff. - :rtype: list[TemplateSummaryDiffVariables] - """ # noqa: E501 - return self._variables - - @variables.setter - def variables(self, variables): - """Set the variables of this TemplateSummaryDiff. - - :param variables: The variables of this TemplateSummaryDiff. - :type: list[TemplateSummaryDiffVariables] - """ # noqa: E501 - self._variables = variables - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiff): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_buckets.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_buckets.py deleted file mode 100644 index 48e1c0469..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_buckets.py +++ /dev/null @@ -1,222 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffBuckets(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kind': 'TemplateKind', - 'state_status': 'str', - 'id': 'str', - 'template_meta_name': 'str', - 'new': 'TemplateSummaryDiffBucketsNewOld', - 'old': 'TemplateSummaryDiffBucketsNewOld' - } - - attribute_map = { - 'kind': 'kind', - 'state_status': 'stateStatus', - 'id': 'id', - 'template_meta_name': 'templateMetaName', - 'new': 'new', - 'old': 'old' - } - - def __init__(self, kind=None, state_status=None, id=None, template_meta_name=None, new=None, old=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffBuckets - a model defined in OpenAPI.""" # noqa: E501 - self._kind = None - self._state_status = None - self._id = None - self._template_meta_name = None - self._new = None - self._old = None - self.discriminator = None - - if kind is not None: - self.kind = kind - if state_status is not None: - self.state_status = state_status - if id is not None: - self.id = id - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if new is not None: - self.new = new - if old is not None: - self.old = old - - @property - def kind(self): - """Get the kind of this TemplateSummaryDiffBuckets. - - :return: The kind of this TemplateSummaryDiffBuckets. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummaryDiffBuckets. - - :param kind: The kind of this TemplateSummaryDiffBuckets. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def state_status(self): - """Get the state_status of this TemplateSummaryDiffBuckets. - - :return: The state_status of this TemplateSummaryDiffBuckets. - :rtype: str - """ # noqa: E501 - return self._state_status - - @state_status.setter - def state_status(self, state_status): - """Set the state_status of this TemplateSummaryDiffBuckets. - - :param state_status: The state_status of this TemplateSummaryDiffBuckets. - :type: str - """ # noqa: E501 - self._state_status = state_status - - @property - def id(self): - """Get the id of this TemplateSummaryDiffBuckets. - - :return: The id of this TemplateSummaryDiffBuckets. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummaryDiffBuckets. - - :param id: The id of this TemplateSummaryDiffBuckets. - :type: str - """ # noqa: E501 - self._id = id - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummaryDiffBuckets. - - :return: The template_meta_name of this TemplateSummaryDiffBuckets. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummaryDiffBuckets. - - :param template_meta_name: The template_meta_name of this TemplateSummaryDiffBuckets. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def new(self): - """Get the new of this TemplateSummaryDiffBuckets. - - :return: The new of this TemplateSummaryDiffBuckets. - :rtype: TemplateSummaryDiffBucketsNewOld - """ # noqa: E501 - return self._new - - @new.setter - def new(self, new): - """Set the new of this TemplateSummaryDiffBuckets. - - :param new: The new of this TemplateSummaryDiffBuckets. - :type: TemplateSummaryDiffBucketsNewOld - """ # noqa: E501 - self._new = new - - @property - def old(self): - """Get the old of this TemplateSummaryDiffBuckets. - - :return: The old of this TemplateSummaryDiffBuckets. - :rtype: TemplateSummaryDiffBucketsNewOld - """ # noqa: E501 - return self._old - - @old.setter - def old(self, old): - """Set the old of this TemplateSummaryDiffBuckets. - - :param old: The old of this TemplateSummaryDiffBuckets. - :type: TemplateSummaryDiffBucketsNewOld - """ # noqa: E501 - self._old = old - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffBuckets): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_buckets_new_old.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_buckets_new_old.py deleted file mode 100644 index 7caf27911..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_buckets_new_old.py +++ /dev/null @@ -1,157 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffBucketsNewOld(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'retention_rules': 'list[BucketRetentionRules]' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'retention_rules': 'retentionRules' - } - - def __init__(self, name=None, description=None, retention_rules=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffBucketsNewOld - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._retention_rules = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - if retention_rules is not None: - self.retention_rules = retention_rules - - @property - def name(self): - """Get the name of this TemplateSummaryDiffBucketsNewOld. - - :return: The name of this TemplateSummaryDiffBucketsNewOld. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateSummaryDiffBucketsNewOld. - - :param name: The name of this TemplateSummaryDiffBucketsNewOld. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this TemplateSummaryDiffBucketsNewOld. - - :return: The description of this TemplateSummaryDiffBucketsNewOld. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TemplateSummaryDiffBucketsNewOld. - - :param description: The description of this TemplateSummaryDiffBucketsNewOld. - :type: str - """ # noqa: E501 - self._description = description - - @property - def retention_rules(self): - """Get the retention_rules of this TemplateSummaryDiffBucketsNewOld. - - Retention rules to expire or retain data. The InfluxDB `/api/v2` API uses `RetentionRules` to configure the [retention period](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-period). #### InfluxDB Cloud - `retentionRules` is required. #### InfluxDB OSS - `retentionRules` isn't required. - - :return: The retention_rules of this TemplateSummaryDiffBucketsNewOld. - :rtype: list[BucketRetentionRules] - """ # noqa: E501 - return self._retention_rules - - @retention_rules.setter - def retention_rules(self, retention_rules): - """Set the retention_rules of this TemplateSummaryDiffBucketsNewOld. - - Retention rules to expire or retain data. The InfluxDB `/api/v2` API uses `RetentionRules` to configure the [retention period](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-period). #### InfluxDB Cloud - `retentionRules` is required. #### InfluxDB OSS - `retentionRules` isn't required. - - :param retention_rules: The retention_rules of this TemplateSummaryDiffBucketsNewOld. - :type: list[BucketRetentionRules] - """ # noqa: E501 - self._retention_rules = retention_rules - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffBucketsNewOld): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_checks.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_checks.py deleted file mode 100644 index 3617fa36e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_checks.py +++ /dev/null @@ -1,222 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffChecks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kind': 'TemplateKind', - 'state_status': 'str', - 'id': 'str', - 'template_meta_name': 'str', - 'new': 'CheckDiscriminator', - 'old': 'CheckDiscriminator' - } - - attribute_map = { - 'kind': 'kind', - 'state_status': 'stateStatus', - 'id': 'id', - 'template_meta_name': 'templateMetaName', - 'new': 'new', - 'old': 'old' - } - - def __init__(self, kind=None, state_status=None, id=None, template_meta_name=None, new=None, old=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffChecks - a model defined in OpenAPI.""" # noqa: E501 - self._kind = None - self._state_status = None - self._id = None - self._template_meta_name = None - self._new = None - self._old = None - self.discriminator = None - - if kind is not None: - self.kind = kind - if state_status is not None: - self.state_status = state_status - if id is not None: - self.id = id - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if new is not None: - self.new = new - if old is not None: - self.old = old - - @property - def kind(self): - """Get the kind of this TemplateSummaryDiffChecks. - - :return: The kind of this TemplateSummaryDiffChecks. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummaryDiffChecks. - - :param kind: The kind of this TemplateSummaryDiffChecks. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def state_status(self): - """Get the state_status of this TemplateSummaryDiffChecks. - - :return: The state_status of this TemplateSummaryDiffChecks. - :rtype: str - """ # noqa: E501 - return self._state_status - - @state_status.setter - def state_status(self, state_status): - """Set the state_status of this TemplateSummaryDiffChecks. - - :param state_status: The state_status of this TemplateSummaryDiffChecks. - :type: str - """ # noqa: E501 - self._state_status = state_status - - @property - def id(self): - """Get the id of this TemplateSummaryDiffChecks. - - :return: The id of this TemplateSummaryDiffChecks. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummaryDiffChecks. - - :param id: The id of this TemplateSummaryDiffChecks. - :type: str - """ # noqa: E501 - self._id = id - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummaryDiffChecks. - - :return: The template_meta_name of this TemplateSummaryDiffChecks. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummaryDiffChecks. - - :param template_meta_name: The template_meta_name of this TemplateSummaryDiffChecks. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def new(self): - """Get the new of this TemplateSummaryDiffChecks. - - :return: The new of this TemplateSummaryDiffChecks. - :rtype: CheckDiscriminator - """ # noqa: E501 - return self._new - - @new.setter - def new(self, new): - """Set the new of this TemplateSummaryDiffChecks. - - :param new: The new of this TemplateSummaryDiffChecks. - :type: CheckDiscriminator - """ # noqa: E501 - self._new = new - - @property - def old(self): - """Get the old of this TemplateSummaryDiffChecks. - - :return: The old of this TemplateSummaryDiffChecks. - :rtype: CheckDiscriminator - """ # noqa: E501 - return self._old - - @old.setter - def old(self, old): - """Set the old of this TemplateSummaryDiffChecks. - - :param old: The old of this TemplateSummaryDiffChecks. - :type: CheckDiscriminator - """ # noqa: E501 - self._old = old - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffChecks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards.py deleted file mode 100644 index 748b2a097..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards.py +++ /dev/null @@ -1,222 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffDashboards(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'state_status': 'str', - 'id': 'str', - 'kind': 'TemplateKind', - 'template_meta_name': 'str', - 'new': 'TemplateSummaryDiffDashboardsNewOld', - 'old': 'TemplateSummaryDiffDashboardsNewOld' - } - - attribute_map = { - 'state_status': 'stateStatus', - 'id': 'id', - 'kind': 'kind', - 'template_meta_name': 'templateMetaName', - 'new': 'new', - 'old': 'old' - } - - def __init__(self, state_status=None, id=None, kind=None, template_meta_name=None, new=None, old=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffDashboards - a model defined in OpenAPI.""" # noqa: E501 - self._state_status = None - self._id = None - self._kind = None - self._template_meta_name = None - self._new = None - self._old = None - self.discriminator = None - - if state_status is not None: - self.state_status = state_status - if id is not None: - self.id = id - if kind is not None: - self.kind = kind - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if new is not None: - self.new = new - if old is not None: - self.old = old - - @property - def state_status(self): - """Get the state_status of this TemplateSummaryDiffDashboards. - - :return: The state_status of this TemplateSummaryDiffDashboards. - :rtype: str - """ # noqa: E501 - return self._state_status - - @state_status.setter - def state_status(self, state_status): - """Set the state_status of this TemplateSummaryDiffDashboards. - - :param state_status: The state_status of this TemplateSummaryDiffDashboards. - :type: str - """ # noqa: E501 - self._state_status = state_status - - @property - def id(self): - """Get the id of this TemplateSummaryDiffDashboards. - - :return: The id of this TemplateSummaryDiffDashboards. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummaryDiffDashboards. - - :param id: The id of this TemplateSummaryDiffDashboards. - :type: str - """ # noqa: E501 - self._id = id - - @property - def kind(self): - """Get the kind of this TemplateSummaryDiffDashboards. - - :return: The kind of this TemplateSummaryDiffDashboards. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummaryDiffDashboards. - - :param kind: The kind of this TemplateSummaryDiffDashboards. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummaryDiffDashboards. - - :return: The template_meta_name of this TemplateSummaryDiffDashboards. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummaryDiffDashboards. - - :param template_meta_name: The template_meta_name of this TemplateSummaryDiffDashboards. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def new(self): - """Get the new of this TemplateSummaryDiffDashboards. - - :return: The new of this TemplateSummaryDiffDashboards. - :rtype: TemplateSummaryDiffDashboardsNewOld - """ # noqa: E501 - return self._new - - @new.setter - def new(self, new): - """Set the new of this TemplateSummaryDiffDashboards. - - :param new: The new of this TemplateSummaryDiffDashboards. - :type: TemplateSummaryDiffDashboardsNewOld - """ # noqa: E501 - self._new = new - - @property - def old(self): - """Get the old of this TemplateSummaryDiffDashboards. - - :return: The old of this TemplateSummaryDiffDashboards. - :rtype: TemplateSummaryDiffDashboardsNewOld - """ # noqa: E501 - return self._old - - @old.setter - def old(self, old): - """Set the old of this TemplateSummaryDiffDashboards. - - :param old: The old of this TemplateSummaryDiffDashboards. - :type: TemplateSummaryDiffDashboardsNewOld - """ # noqa: E501 - self._old = old - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffDashboards): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards_new_old.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards_new_old.py deleted file mode 100644 index a2b727d4a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards_new_old.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffDashboardsNewOld(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'charts': 'list[TemplateChart]' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'charts': 'charts' - } - - def __init__(self, name=None, description=None, charts=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffDashboardsNewOld - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._charts = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - if charts is not None: - self.charts = charts - - @property - def name(self): - """Get the name of this TemplateSummaryDiffDashboardsNewOld. - - :return: The name of this TemplateSummaryDiffDashboardsNewOld. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateSummaryDiffDashboardsNewOld. - - :param name: The name of this TemplateSummaryDiffDashboardsNewOld. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this TemplateSummaryDiffDashboardsNewOld. - - :return: The description of this TemplateSummaryDiffDashboardsNewOld. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TemplateSummaryDiffDashboardsNewOld. - - :param description: The description of this TemplateSummaryDiffDashboardsNewOld. - :type: str - """ # noqa: E501 - self._description = description - - @property - def charts(self): - """Get the charts of this TemplateSummaryDiffDashboardsNewOld. - - :return: The charts of this TemplateSummaryDiffDashboardsNewOld. - :rtype: list[TemplateChart] - """ # noqa: E501 - return self._charts - - @charts.setter - def charts(self, charts): - """Set the charts of this TemplateSummaryDiffDashboardsNewOld. - - :param charts: The charts of this TemplateSummaryDiffDashboardsNewOld. - :type: list[TemplateChart] - """ # noqa: E501 - self._charts = charts - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffDashboardsNewOld): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_label_mappings.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_label_mappings.py deleted file mode 100644 index 2abb3dd7f..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_label_mappings.py +++ /dev/null @@ -1,268 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffLabelMappings(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'status': 'str', - 'resource_type': 'str', - 'resource_id': 'str', - 'resource_template_meta_name': 'str', - 'resource_name': 'str', - 'label_id': 'str', - 'label_template_meta_name': 'str', - 'label_name': 'str' - } - - attribute_map = { - 'status': 'status', - 'resource_type': 'resourceType', - 'resource_id': 'resourceID', - 'resource_template_meta_name': 'resourceTemplateMetaName', - 'resource_name': 'resourceName', - 'label_id': 'labelID', - 'label_template_meta_name': 'labelTemplateMetaName', - 'label_name': 'labelName' - } - - def __init__(self, status=None, resource_type=None, resource_id=None, resource_template_meta_name=None, resource_name=None, label_id=None, label_template_meta_name=None, label_name=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffLabelMappings - a model defined in OpenAPI.""" # noqa: E501 - self._status = None - self._resource_type = None - self._resource_id = None - self._resource_template_meta_name = None - self._resource_name = None - self._label_id = None - self._label_template_meta_name = None - self._label_name = None - self.discriminator = None - - if status is not None: - self.status = status - if resource_type is not None: - self.resource_type = resource_type - if resource_id is not None: - self.resource_id = resource_id - if resource_template_meta_name is not None: - self.resource_template_meta_name = resource_template_meta_name - if resource_name is not None: - self.resource_name = resource_name - if label_id is not None: - self.label_id = label_id - if label_template_meta_name is not None: - self.label_template_meta_name = label_template_meta_name - if label_name is not None: - self.label_name = label_name - - @property - def status(self): - """Get the status of this TemplateSummaryDiffLabelMappings. - - :return: The status of this TemplateSummaryDiffLabelMappings. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this TemplateSummaryDiffLabelMappings. - - :param status: The status of this TemplateSummaryDiffLabelMappings. - :type: str - """ # noqa: E501 - self._status = status - - @property - def resource_type(self): - """Get the resource_type of this TemplateSummaryDiffLabelMappings. - - :return: The resource_type of this TemplateSummaryDiffLabelMappings. - :rtype: str - """ # noqa: E501 - return self._resource_type - - @resource_type.setter - def resource_type(self, resource_type): - """Set the resource_type of this TemplateSummaryDiffLabelMappings. - - :param resource_type: The resource_type of this TemplateSummaryDiffLabelMappings. - :type: str - """ # noqa: E501 - self._resource_type = resource_type - - @property - def resource_id(self): - """Get the resource_id of this TemplateSummaryDiffLabelMappings. - - :return: The resource_id of this TemplateSummaryDiffLabelMappings. - :rtype: str - """ # noqa: E501 - return self._resource_id - - @resource_id.setter - def resource_id(self, resource_id): - """Set the resource_id of this TemplateSummaryDiffLabelMappings. - - :param resource_id: The resource_id of this TemplateSummaryDiffLabelMappings. - :type: str - """ # noqa: E501 - self._resource_id = resource_id - - @property - def resource_template_meta_name(self): - """Get the resource_template_meta_name of this TemplateSummaryDiffLabelMappings. - - :return: The resource_template_meta_name of this TemplateSummaryDiffLabelMappings. - :rtype: str - """ # noqa: E501 - return self._resource_template_meta_name - - @resource_template_meta_name.setter - def resource_template_meta_name(self, resource_template_meta_name): - """Set the resource_template_meta_name of this TemplateSummaryDiffLabelMappings. - - :param resource_template_meta_name: The resource_template_meta_name of this TemplateSummaryDiffLabelMappings. - :type: str - """ # noqa: E501 - self._resource_template_meta_name = resource_template_meta_name - - @property - def resource_name(self): - """Get the resource_name of this TemplateSummaryDiffLabelMappings. - - :return: The resource_name of this TemplateSummaryDiffLabelMappings. - :rtype: str - """ # noqa: E501 - return self._resource_name - - @resource_name.setter - def resource_name(self, resource_name): - """Set the resource_name of this TemplateSummaryDiffLabelMappings. - - :param resource_name: The resource_name of this TemplateSummaryDiffLabelMappings. - :type: str - """ # noqa: E501 - self._resource_name = resource_name - - @property - def label_id(self): - """Get the label_id of this TemplateSummaryDiffLabelMappings. - - :return: The label_id of this TemplateSummaryDiffLabelMappings. - :rtype: str - """ # noqa: E501 - return self._label_id - - @label_id.setter - def label_id(self, label_id): - """Set the label_id of this TemplateSummaryDiffLabelMappings. - - :param label_id: The label_id of this TemplateSummaryDiffLabelMappings. - :type: str - """ # noqa: E501 - self._label_id = label_id - - @property - def label_template_meta_name(self): - """Get the label_template_meta_name of this TemplateSummaryDiffLabelMappings. - - :return: The label_template_meta_name of this TemplateSummaryDiffLabelMappings. - :rtype: str - """ # noqa: E501 - return self._label_template_meta_name - - @label_template_meta_name.setter - def label_template_meta_name(self, label_template_meta_name): - """Set the label_template_meta_name of this TemplateSummaryDiffLabelMappings. - - :param label_template_meta_name: The label_template_meta_name of this TemplateSummaryDiffLabelMappings. - :type: str - """ # noqa: E501 - self._label_template_meta_name = label_template_meta_name - - @property - def label_name(self): - """Get the label_name of this TemplateSummaryDiffLabelMappings. - - :return: The label_name of this TemplateSummaryDiffLabelMappings. - :rtype: str - """ # noqa: E501 - return self._label_name - - @label_name.setter - def label_name(self, label_name): - """Set the label_name of this TemplateSummaryDiffLabelMappings. - - :param label_name: The label_name of this TemplateSummaryDiffLabelMappings. - :type: str - """ # noqa: E501 - self._label_name = label_name - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffLabelMappings): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_labels.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_labels.py deleted file mode 100644 index ab6b9c065..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_labels.py +++ /dev/null @@ -1,222 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffLabels(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'state_status': 'str', - 'kind': 'TemplateKind', - 'id': 'str', - 'template_meta_name': 'str', - 'new': 'TemplateSummaryDiffLabelsNewOld', - 'old': 'TemplateSummaryDiffLabelsNewOld' - } - - attribute_map = { - 'state_status': 'stateStatus', - 'kind': 'kind', - 'id': 'id', - 'template_meta_name': 'templateMetaName', - 'new': 'new', - 'old': 'old' - } - - def __init__(self, state_status=None, kind=None, id=None, template_meta_name=None, new=None, old=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffLabels - a model defined in OpenAPI.""" # noqa: E501 - self._state_status = None - self._kind = None - self._id = None - self._template_meta_name = None - self._new = None - self._old = None - self.discriminator = None - - if state_status is not None: - self.state_status = state_status - if kind is not None: - self.kind = kind - if id is not None: - self.id = id - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if new is not None: - self.new = new - if old is not None: - self.old = old - - @property - def state_status(self): - """Get the state_status of this TemplateSummaryDiffLabels. - - :return: The state_status of this TemplateSummaryDiffLabels. - :rtype: str - """ # noqa: E501 - return self._state_status - - @state_status.setter - def state_status(self, state_status): - """Set the state_status of this TemplateSummaryDiffLabels. - - :param state_status: The state_status of this TemplateSummaryDiffLabels. - :type: str - """ # noqa: E501 - self._state_status = state_status - - @property - def kind(self): - """Get the kind of this TemplateSummaryDiffLabels. - - :return: The kind of this TemplateSummaryDiffLabels. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummaryDiffLabels. - - :param kind: The kind of this TemplateSummaryDiffLabels. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def id(self): - """Get the id of this TemplateSummaryDiffLabels. - - :return: The id of this TemplateSummaryDiffLabels. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummaryDiffLabels. - - :param id: The id of this TemplateSummaryDiffLabels. - :type: str - """ # noqa: E501 - self._id = id - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummaryDiffLabels. - - :return: The template_meta_name of this TemplateSummaryDiffLabels. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummaryDiffLabels. - - :param template_meta_name: The template_meta_name of this TemplateSummaryDiffLabels. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def new(self): - """Get the new of this TemplateSummaryDiffLabels. - - :return: The new of this TemplateSummaryDiffLabels. - :rtype: TemplateSummaryDiffLabelsNewOld - """ # noqa: E501 - return self._new - - @new.setter - def new(self, new): - """Set the new of this TemplateSummaryDiffLabels. - - :param new: The new of this TemplateSummaryDiffLabels. - :type: TemplateSummaryDiffLabelsNewOld - """ # noqa: E501 - self._new = new - - @property - def old(self): - """Get the old of this TemplateSummaryDiffLabels. - - :return: The old of this TemplateSummaryDiffLabels. - :rtype: TemplateSummaryDiffLabelsNewOld - """ # noqa: E501 - return self._old - - @old.setter - def old(self, old): - """Set the old of this TemplateSummaryDiffLabels. - - :param old: The old of this TemplateSummaryDiffLabels. - :type: TemplateSummaryDiffLabelsNewOld - """ # noqa: E501 - self._old = old - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffLabels): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_labels_new_old.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_labels_new_old.py deleted file mode 100644 index 27e7bdd1d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_labels_new_old.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffLabelsNewOld(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'color': 'str', - 'description': 'str' - } - - attribute_map = { - 'name': 'name', - 'color': 'color', - 'description': 'description' - } - - def __init__(self, name=None, color=None, description=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffLabelsNewOld - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._color = None - self._description = None - self.discriminator = None - - if name is not None: - self.name = name - if color is not None: - self.color = color - if description is not None: - self.description = description - - @property - def name(self): - """Get the name of this TemplateSummaryDiffLabelsNewOld. - - :return: The name of this TemplateSummaryDiffLabelsNewOld. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateSummaryDiffLabelsNewOld. - - :param name: The name of this TemplateSummaryDiffLabelsNewOld. - :type: str - """ # noqa: E501 - self._name = name - - @property - def color(self): - """Get the color of this TemplateSummaryDiffLabelsNewOld. - - :return: The color of this TemplateSummaryDiffLabelsNewOld. - :rtype: str - """ # noqa: E501 - return self._color - - @color.setter - def color(self, color): - """Set the color of this TemplateSummaryDiffLabelsNewOld. - - :param color: The color of this TemplateSummaryDiffLabelsNewOld. - :type: str - """ # noqa: E501 - self._color = color - - @property - def description(self): - """Get the description of this TemplateSummaryDiffLabelsNewOld. - - :return: The description of this TemplateSummaryDiffLabelsNewOld. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TemplateSummaryDiffLabelsNewOld. - - :param description: The description of this TemplateSummaryDiffLabelsNewOld. - :type: str - """ # noqa: E501 - self._description = description - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffLabelsNewOld): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_endpoints.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_endpoints.py deleted file mode 100644 index 47dc4caf0..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_endpoints.py +++ /dev/null @@ -1,222 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffNotificationEndpoints(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kind': 'TemplateKind', - 'state_status': 'str', - 'id': 'str', - 'template_meta_name': 'str', - 'new': 'NotificationEndpointDiscriminator', - 'old': 'NotificationEndpointDiscriminator' - } - - attribute_map = { - 'kind': 'kind', - 'state_status': 'stateStatus', - 'id': 'id', - 'template_meta_name': 'templateMetaName', - 'new': 'new', - 'old': 'old' - } - - def __init__(self, kind=None, state_status=None, id=None, template_meta_name=None, new=None, old=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffNotificationEndpoints - a model defined in OpenAPI.""" # noqa: E501 - self._kind = None - self._state_status = None - self._id = None - self._template_meta_name = None - self._new = None - self._old = None - self.discriminator = None - - if kind is not None: - self.kind = kind - if state_status is not None: - self.state_status = state_status - if id is not None: - self.id = id - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if new is not None: - self.new = new - if old is not None: - self.old = old - - @property - def kind(self): - """Get the kind of this TemplateSummaryDiffNotificationEndpoints. - - :return: The kind of this TemplateSummaryDiffNotificationEndpoints. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummaryDiffNotificationEndpoints. - - :param kind: The kind of this TemplateSummaryDiffNotificationEndpoints. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def state_status(self): - """Get the state_status of this TemplateSummaryDiffNotificationEndpoints. - - :return: The state_status of this TemplateSummaryDiffNotificationEndpoints. - :rtype: str - """ # noqa: E501 - return self._state_status - - @state_status.setter - def state_status(self, state_status): - """Set the state_status of this TemplateSummaryDiffNotificationEndpoints. - - :param state_status: The state_status of this TemplateSummaryDiffNotificationEndpoints. - :type: str - """ # noqa: E501 - self._state_status = state_status - - @property - def id(self): - """Get the id of this TemplateSummaryDiffNotificationEndpoints. - - :return: The id of this TemplateSummaryDiffNotificationEndpoints. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummaryDiffNotificationEndpoints. - - :param id: The id of this TemplateSummaryDiffNotificationEndpoints. - :type: str - """ # noqa: E501 - self._id = id - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummaryDiffNotificationEndpoints. - - :return: The template_meta_name of this TemplateSummaryDiffNotificationEndpoints. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummaryDiffNotificationEndpoints. - - :param template_meta_name: The template_meta_name of this TemplateSummaryDiffNotificationEndpoints. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def new(self): - """Get the new of this TemplateSummaryDiffNotificationEndpoints. - - :return: The new of this TemplateSummaryDiffNotificationEndpoints. - :rtype: NotificationEndpointDiscriminator - """ # noqa: E501 - return self._new - - @new.setter - def new(self, new): - """Set the new of this TemplateSummaryDiffNotificationEndpoints. - - :param new: The new of this TemplateSummaryDiffNotificationEndpoints. - :type: NotificationEndpointDiscriminator - """ # noqa: E501 - self._new = new - - @property - def old(self): - """Get the old of this TemplateSummaryDiffNotificationEndpoints. - - :return: The old of this TemplateSummaryDiffNotificationEndpoints. - :rtype: NotificationEndpointDiscriminator - """ # noqa: E501 - return self._old - - @old.setter - def old(self, old): - """Set the old of this TemplateSummaryDiffNotificationEndpoints. - - :param old: The old of this TemplateSummaryDiffNotificationEndpoints. - :type: NotificationEndpointDiscriminator - """ # noqa: E501 - self._old = old - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffNotificationEndpoints): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules.py deleted file mode 100644 index cc4ab1ea5..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules.py +++ /dev/null @@ -1,222 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffNotificationRules(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kind': 'TemplateKind', - 'state_status': 'str', - 'id': 'str', - 'template_meta_name': 'str', - 'new': 'TemplateSummaryDiffNotificationRulesNewOld', - 'old': 'TemplateSummaryDiffNotificationRulesNewOld' - } - - attribute_map = { - 'kind': 'kind', - 'state_status': 'stateStatus', - 'id': 'id', - 'template_meta_name': 'templateMetaName', - 'new': 'new', - 'old': 'old' - } - - def __init__(self, kind=None, state_status=None, id=None, template_meta_name=None, new=None, old=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffNotificationRules - a model defined in OpenAPI.""" # noqa: E501 - self._kind = None - self._state_status = None - self._id = None - self._template_meta_name = None - self._new = None - self._old = None - self.discriminator = None - - if kind is not None: - self.kind = kind - if state_status is not None: - self.state_status = state_status - if id is not None: - self.id = id - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if new is not None: - self.new = new - if old is not None: - self.old = old - - @property - def kind(self): - """Get the kind of this TemplateSummaryDiffNotificationRules. - - :return: The kind of this TemplateSummaryDiffNotificationRules. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummaryDiffNotificationRules. - - :param kind: The kind of this TemplateSummaryDiffNotificationRules. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def state_status(self): - """Get the state_status of this TemplateSummaryDiffNotificationRules. - - :return: The state_status of this TemplateSummaryDiffNotificationRules. - :rtype: str - """ # noqa: E501 - return self._state_status - - @state_status.setter - def state_status(self, state_status): - """Set the state_status of this TemplateSummaryDiffNotificationRules. - - :param state_status: The state_status of this TemplateSummaryDiffNotificationRules. - :type: str - """ # noqa: E501 - self._state_status = state_status - - @property - def id(self): - """Get the id of this TemplateSummaryDiffNotificationRules. - - :return: The id of this TemplateSummaryDiffNotificationRules. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummaryDiffNotificationRules. - - :param id: The id of this TemplateSummaryDiffNotificationRules. - :type: str - """ # noqa: E501 - self._id = id - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummaryDiffNotificationRules. - - :return: The template_meta_name of this TemplateSummaryDiffNotificationRules. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummaryDiffNotificationRules. - - :param template_meta_name: The template_meta_name of this TemplateSummaryDiffNotificationRules. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def new(self): - """Get the new of this TemplateSummaryDiffNotificationRules. - - :return: The new of this TemplateSummaryDiffNotificationRules. - :rtype: TemplateSummaryDiffNotificationRulesNewOld - """ # noqa: E501 - return self._new - - @new.setter - def new(self, new): - """Set the new of this TemplateSummaryDiffNotificationRules. - - :param new: The new of this TemplateSummaryDiffNotificationRules. - :type: TemplateSummaryDiffNotificationRulesNewOld - """ # noqa: E501 - self._new = new - - @property - def old(self): - """Get the old of this TemplateSummaryDiffNotificationRules. - - :return: The old of this TemplateSummaryDiffNotificationRules. - :rtype: TemplateSummaryDiffNotificationRulesNewOld - """ # noqa: E501 - return self._old - - @old.setter - def old(self, old): - """Set the old of this TemplateSummaryDiffNotificationRules. - - :param old: The old of this TemplateSummaryDiffNotificationRules. - :type: TemplateSummaryDiffNotificationRulesNewOld - """ # noqa: E501 - self._old = old - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffNotificationRules): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules_new_old.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules_new_old.py deleted file mode 100644 index b769118f3..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules_new_old.py +++ /dev/null @@ -1,337 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffNotificationRulesNewOld(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'endpoint_name': 'str', - 'endpoint_id': 'str', - 'endpoint_type': 'str', - 'every': 'str', - 'offset': 'str', - 'message_template': 'str', - 'status': 'str', - 'status_rules': 'list[TemplateSummarySummaryStatusRules]', - 'tag_rules': 'list[TemplateSummarySummaryTagRules]' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'endpoint_name': 'endpointName', - 'endpoint_id': 'endpointID', - 'endpoint_type': 'endpointType', - 'every': 'every', - 'offset': 'offset', - 'message_template': 'messageTemplate', - 'status': 'status', - 'status_rules': 'statusRules', - 'tag_rules': 'tagRules' - } - - def __init__(self, name=None, description=None, endpoint_name=None, endpoint_id=None, endpoint_type=None, every=None, offset=None, message_template=None, status=None, status_rules=None, tag_rules=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffNotificationRulesNewOld - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._endpoint_name = None - self._endpoint_id = None - self._endpoint_type = None - self._every = None - self._offset = None - self._message_template = None - self._status = None - self._status_rules = None - self._tag_rules = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - if endpoint_name is not None: - self.endpoint_name = endpoint_name - if endpoint_id is not None: - self.endpoint_id = endpoint_id - if endpoint_type is not None: - self.endpoint_type = endpoint_type - if every is not None: - self.every = every - if offset is not None: - self.offset = offset - if message_template is not None: - self.message_template = message_template - if status is not None: - self.status = status - if status_rules is not None: - self.status_rules = status_rules - if tag_rules is not None: - self.tag_rules = tag_rules - - @property - def name(self): - """Get the name of this TemplateSummaryDiffNotificationRulesNewOld. - - :return: The name of this TemplateSummaryDiffNotificationRulesNewOld. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateSummaryDiffNotificationRulesNewOld. - - :param name: The name of this TemplateSummaryDiffNotificationRulesNewOld. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this TemplateSummaryDiffNotificationRulesNewOld. - - :return: The description of this TemplateSummaryDiffNotificationRulesNewOld. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TemplateSummaryDiffNotificationRulesNewOld. - - :param description: The description of this TemplateSummaryDiffNotificationRulesNewOld. - :type: str - """ # noqa: E501 - self._description = description - - @property - def endpoint_name(self): - """Get the endpoint_name of this TemplateSummaryDiffNotificationRulesNewOld. - - :return: The endpoint_name of this TemplateSummaryDiffNotificationRulesNewOld. - :rtype: str - """ # noqa: E501 - return self._endpoint_name - - @endpoint_name.setter - def endpoint_name(self, endpoint_name): - """Set the endpoint_name of this TemplateSummaryDiffNotificationRulesNewOld. - - :param endpoint_name: The endpoint_name of this TemplateSummaryDiffNotificationRulesNewOld. - :type: str - """ # noqa: E501 - self._endpoint_name = endpoint_name - - @property - def endpoint_id(self): - """Get the endpoint_id of this TemplateSummaryDiffNotificationRulesNewOld. - - :return: The endpoint_id of this TemplateSummaryDiffNotificationRulesNewOld. - :rtype: str - """ # noqa: E501 - return self._endpoint_id - - @endpoint_id.setter - def endpoint_id(self, endpoint_id): - """Set the endpoint_id of this TemplateSummaryDiffNotificationRulesNewOld. - - :param endpoint_id: The endpoint_id of this TemplateSummaryDiffNotificationRulesNewOld. - :type: str - """ # noqa: E501 - self._endpoint_id = endpoint_id - - @property - def endpoint_type(self): - """Get the endpoint_type of this TemplateSummaryDiffNotificationRulesNewOld. - - :return: The endpoint_type of this TemplateSummaryDiffNotificationRulesNewOld. - :rtype: str - """ # noqa: E501 - return self._endpoint_type - - @endpoint_type.setter - def endpoint_type(self, endpoint_type): - """Set the endpoint_type of this TemplateSummaryDiffNotificationRulesNewOld. - - :param endpoint_type: The endpoint_type of this TemplateSummaryDiffNotificationRulesNewOld. - :type: str - """ # noqa: E501 - self._endpoint_type = endpoint_type - - @property - def every(self): - """Get the every of this TemplateSummaryDiffNotificationRulesNewOld. - - :return: The every of this TemplateSummaryDiffNotificationRulesNewOld. - :rtype: str - """ # noqa: E501 - return self._every - - @every.setter - def every(self, every): - """Set the every of this TemplateSummaryDiffNotificationRulesNewOld. - - :param every: The every of this TemplateSummaryDiffNotificationRulesNewOld. - :type: str - """ # noqa: E501 - self._every = every - - @property - def offset(self): - """Get the offset of this TemplateSummaryDiffNotificationRulesNewOld. - - :return: The offset of this TemplateSummaryDiffNotificationRulesNewOld. - :rtype: str - """ # noqa: E501 - return self._offset - - @offset.setter - def offset(self, offset): - """Set the offset of this TemplateSummaryDiffNotificationRulesNewOld. - - :param offset: The offset of this TemplateSummaryDiffNotificationRulesNewOld. - :type: str - """ # noqa: E501 - self._offset = offset - - @property - def message_template(self): - """Get the message_template of this TemplateSummaryDiffNotificationRulesNewOld. - - :return: The message_template of this TemplateSummaryDiffNotificationRulesNewOld. - :rtype: str - """ # noqa: E501 - return self._message_template - - @message_template.setter - def message_template(self, message_template): - """Set the message_template of this TemplateSummaryDiffNotificationRulesNewOld. - - :param message_template: The message_template of this TemplateSummaryDiffNotificationRulesNewOld. - :type: str - """ # noqa: E501 - self._message_template = message_template - - @property - def status(self): - """Get the status of this TemplateSummaryDiffNotificationRulesNewOld. - - :return: The status of this TemplateSummaryDiffNotificationRulesNewOld. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this TemplateSummaryDiffNotificationRulesNewOld. - - :param status: The status of this TemplateSummaryDiffNotificationRulesNewOld. - :type: str - """ # noqa: E501 - self._status = status - - @property - def status_rules(self): - """Get the status_rules of this TemplateSummaryDiffNotificationRulesNewOld. - - :return: The status_rules of this TemplateSummaryDiffNotificationRulesNewOld. - :rtype: list[TemplateSummarySummaryStatusRules] - """ # noqa: E501 - return self._status_rules - - @status_rules.setter - def status_rules(self, status_rules): - """Set the status_rules of this TemplateSummaryDiffNotificationRulesNewOld. - - :param status_rules: The status_rules of this TemplateSummaryDiffNotificationRulesNewOld. - :type: list[TemplateSummarySummaryStatusRules] - """ # noqa: E501 - self._status_rules = status_rules - - @property - def tag_rules(self): - """Get the tag_rules of this TemplateSummaryDiffNotificationRulesNewOld. - - :return: The tag_rules of this TemplateSummaryDiffNotificationRulesNewOld. - :rtype: list[TemplateSummarySummaryTagRules] - """ # noqa: E501 - return self._tag_rules - - @tag_rules.setter - def tag_rules(self, tag_rules): - """Set the tag_rules of this TemplateSummaryDiffNotificationRulesNewOld. - - :param tag_rules: The tag_rules of this TemplateSummaryDiffNotificationRulesNewOld. - :type: list[TemplateSummarySummaryTagRules] - """ # noqa: E501 - self._tag_rules = tag_rules - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffNotificationRulesNewOld): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_tasks.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_tasks.py deleted file mode 100644 index 8dca893c8..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_tasks.py +++ /dev/null @@ -1,222 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffTasks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kind': 'TemplateKind', - 'state_status': 'str', - 'id': 'str', - 'template_meta_name': 'str', - 'new': 'TemplateSummaryDiffTasksNewOld', - 'old': 'TemplateSummaryDiffTasksNewOld' - } - - attribute_map = { - 'kind': 'kind', - 'state_status': 'stateStatus', - 'id': 'id', - 'template_meta_name': 'templateMetaName', - 'new': 'new', - 'old': 'old' - } - - def __init__(self, kind=None, state_status=None, id=None, template_meta_name=None, new=None, old=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffTasks - a model defined in OpenAPI.""" # noqa: E501 - self._kind = None - self._state_status = None - self._id = None - self._template_meta_name = None - self._new = None - self._old = None - self.discriminator = None - - if kind is not None: - self.kind = kind - if state_status is not None: - self.state_status = state_status - if id is not None: - self.id = id - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if new is not None: - self.new = new - if old is not None: - self.old = old - - @property - def kind(self): - """Get the kind of this TemplateSummaryDiffTasks. - - :return: The kind of this TemplateSummaryDiffTasks. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummaryDiffTasks. - - :param kind: The kind of this TemplateSummaryDiffTasks. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def state_status(self): - """Get the state_status of this TemplateSummaryDiffTasks. - - :return: The state_status of this TemplateSummaryDiffTasks. - :rtype: str - """ # noqa: E501 - return self._state_status - - @state_status.setter - def state_status(self, state_status): - """Set the state_status of this TemplateSummaryDiffTasks. - - :param state_status: The state_status of this TemplateSummaryDiffTasks. - :type: str - """ # noqa: E501 - self._state_status = state_status - - @property - def id(self): - """Get the id of this TemplateSummaryDiffTasks. - - :return: The id of this TemplateSummaryDiffTasks. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummaryDiffTasks. - - :param id: The id of this TemplateSummaryDiffTasks. - :type: str - """ # noqa: E501 - self._id = id - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummaryDiffTasks. - - :return: The template_meta_name of this TemplateSummaryDiffTasks. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummaryDiffTasks. - - :param template_meta_name: The template_meta_name of this TemplateSummaryDiffTasks. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def new(self): - """Get the new of this TemplateSummaryDiffTasks. - - :return: The new of this TemplateSummaryDiffTasks. - :rtype: TemplateSummaryDiffTasksNewOld - """ # noqa: E501 - return self._new - - @new.setter - def new(self, new): - """Set the new of this TemplateSummaryDiffTasks. - - :param new: The new of this TemplateSummaryDiffTasks. - :type: TemplateSummaryDiffTasksNewOld - """ # noqa: E501 - self._new = new - - @property - def old(self): - """Get the old of this TemplateSummaryDiffTasks. - - :return: The old of this TemplateSummaryDiffTasks. - :rtype: TemplateSummaryDiffTasksNewOld - """ # noqa: E501 - return self._old - - @old.setter - def old(self, old): - """Set the old of this TemplateSummaryDiffTasks. - - :param old: The old of this TemplateSummaryDiffTasks. - :type: TemplateSummaryDiffTasksNewOld - """ # noqa: E501 - self._old = old - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffTasks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_tasks_new_old.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_tasks_new_old.py deleted file mode 100644 index 57a83e8a0..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_tasks_new_old.py +++ /dev/null @@ -1,245 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffTasksNewOld(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'cron': 'str', - 'description': 'str', - 'every': 'str', - 'offset': 'str', - 'query': 'str', - 'status': 'str' - } - - attribute_map = { - 'name': 'name', - 'cron': 'cron', - 'description': 'description', - 'every': 'every', - 'offset': 'offset', - 'query': 'query', - 'status': 'status' - } - - def __init__(self, name=None, cron=None, description=None, every=None, offset=None, query=None, status=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffTasksNewOld - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._cron = None - self._description = None - self._every = None - self._offset = None - self._query = None - self._status = None - self.discriminator = None - - if name is not None: - self.name = name - if cron is not None: - self.cron = cron - if description is not None: - self.description = description - if every is not None: - self.every = every - if offset is not None: - self.offset = offset - if query is not None: - self.query = query - if status is not None: - self.status = status - - @property - def name(self): - """Get the name of this TemplateSummaryDiffTasksNewOld. - - :return: The name of this TemplateSummaryDiffTasksNewOld. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateSummaryDiffTasksNewOld. - - :param name: The name of this TemplateSummaryDiffTasksNewOld. - :type: str - """ # noqa: E501 - self._name = name - - @property - def cron(self): - """Get the cron of this TemplateSummaryDiffTasksNewOld. - - :return: The cron of this TemplateSummaryDiffTasksNewOld. - :rtype: str - """ # noqa: E501 - return self._cron - - @cron.setter - def cron(self, cron): - """Set the cron of this TemplateSummaryDiffTasksNewOld. - - :param cron: The cron of this TemplateSummaryDiffTasksNewOld. - :type: str - """ # noqa: E501 - self._cron = cron - - @property - def description(self): - """Get the description of this TemplateSummaryDiffTasksNewOld. - - :return: The description of this TemplateSummaryDiffTasksNewOld. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TemplateSummaryDiffTasksNewOld. - - :param description: The description of this TemplateSummaryDiffTasksNewOld. - :type: str - """ # noqa: E501 - self._description = description - - @property - def every(self): - """Get the every of this TemplateSummaryDiffTasksNewOld. - - :return: The every of this TemplateSummaryDiffTasksNewOld. - :rtype: str - """ # noqa: E501 - return self._every - - @every.setter - def every(self, every): - """Set the every of this TemplateSummaryDiffTasksNewOld. - - :param every: The every of this TemplateSummaryDiffTasksNewOld. - :type: str - """ # noqa: E501 - self._every = every - - @property - def offset(self): - """Get the offset of this TemplateSummaryDiffTasksNewOld. - - :return: The offset of this TemplateSummaryDiffTasksNewOld. - :rtype: str - """ # noqa: E501 - return self._offset - - @offset.setter - def offset(self, offset): - """Set the offset of this TemplateSummaryDiffTasksNewOld. - - :param offset: The offset of this TemplateSummaryDiffTasksNewOld. - :type: str - """ # noqa: E501 - self._offset = offset - - @property - def query(self): - """Get the query of this TemplateSummaryDiffTasksNewOld. - - :return: The query of this TemplateSummaryDiffTasksNewOld. - :rtype: str - """ # noqa: E501 - return self._query - - @query.setter - def query(self, query): - """Set the query of this TemplateSummaryDiffTasksNewOld. - - :param query: The query of this TemplateSummaryDiffTasksNewOld. - :type: str - """ # noqa: E501 - self._query = query - - @property - def status(self): - """Get the status of this TemplateSummaryDiffTasksNewOld. - - :return: The status of this TemplateSummaryDiffTasksNewOld. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this TemplateSummaryDiffTasksNewOld. - - :param status: The status of this TemplateSummaryDiffTasksNewOld. - :type: str - """ # noqa: E501 - self._status = status - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffTasksNewOld): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_telegraf_configs.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_telegraf_configs.py deleted file mode 100644 index 2aa8ef868..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_telegraf_configs.py +++ /dev/null @@ -1,222 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffTelegrafConfigs(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kind': 'TemplateKind', - 'state_status': 'str', - 'id': 'str', - 'template_meta_name': 'str', - 'new': 'TelegrafRequest', - 'old': 'TelegrafRequest' - } - - attribute_map = { - 'kind': 'kind', - 'state_status': 'stateStatus', - 'id': 'id', - 'template_meta_name': 'templateMetaName', - 'new': 'new', - 'old': 'old' - } - - def __init__(self, kind=None, state_status=None, id=None, template_meta_name=None, new=None, old=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffTelegrafConfigs - a model defined in OpenAPI.""" # noqa: E501 - self._kind = None - self._state_status = None - self._id = None - self._template_meta_name = None - self._new = None - self._old = None - self.discriminator = None - - if kind is not None: - self.kind = kind - if state_status is not None: - self.state_status = state_status - if id is not None: - self.id = id - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if new is not None: - self.new = new - if old is not None: - self.old = old - - @property - def kind(self): - """Get the kind of this TemplateSummaryDiffTelegrafConfigs. - - :return: The kind of this TemplateSummaryDiffTelegrafConfigs. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummaryDiffTelegrafConfigs. - - :param kind: The kind of this TemplateSummaryDiffTelegrafConfigs. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def state_status(self): - """Get the state_status of this TemplateSummaryDiffTelegrafConfigs. - - :return: The state_status of this TemplateSummaryDiffTelegrafConfigs. - :rtype: str - """ # noqa: E501 - return self._state_status - - @state_status.setter - def state_status(self, state_status): - """Set the state_status of this TemplateSummaryDiffTelegrafConfigs. - - :param state_status: The state_status of this TemplateSummaryDiffTelegrafConfigs. - :type: str - """ # noqa: E501 - self._state_status = state_status - - @property - def id(self): - """Get the id of this TemplateSummaryDiffTelegrafConfigs. - - :return: The id of this TemplateSummaryDiffTelegrafConfigs. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummaryDiffTelegrafConfigs. - - :param id: The id of this TemplateSummaryDiffTelegrafConfigs. - :type: str - """ # noqa: E501 - self._id = id - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummaryDiffTelegrafConfigs. - - :return: The template_meta_name of this TemplateSummaryDiffTelegrafConfigs. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummaryDiffTelegrafConfigs. - - :param template_meta_name: The template_meta_name of this TemplateSummaryDiffTelegrafConfigs. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def new(self): - """Get the new of this TemplateSummaryDiffTelegrafConfigs. - - :return: The new of this TemplateSummaryDiffTelegrafConfigs. - :rtype: TelegrafRequest - """ # noqa: E501 - return self._new - - @new.setter - def new(self, new): - """Set the new of this TemplateSummaryDiffTelegrafConfigs. - - :param new: The new of this TemplateSummaryDiffTelegrafConfigs. - :type: TelegrafRequest - """ # noqa: E501 - self._new = new - - @property - def old(self): - """Get the old of this TemplateSummaryDiffTelegrafConfigs. - - :return: The old of this TemplateSummaryDiffTelegrafConfigs. - :rtype: TelegrafRequest - """ # noqa: E501 - return self._old - - @old.setter - def old(self, old): - """Set the old of this TemplateSummaryDiffTelegrafConfigs. - - :param old: The old of this TemplateSummaryDiffTelegrafConfigs. - :type: TelegrafRequest - """ # noqa: E501 - self._old = old - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffTelegrafConfigs): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_variables.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_variables.py deleted file mode 100644 index 3d4712ebb..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_variables.py +++ /dev/null @@ -1,222 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffVariables(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kind': 'TemplateKind', - 'state_status': 'str', - 'id': 'str', - 'template_meta_name': 'str', - 'new': 'TemplateSummaryDiffVariablesNewOld', - 'old': 'TemplateSummaryDiffVariablesNewOld' - } - - attribute_map = { - 'kind': 'kind', - 'state_status': 'stateStatus', - 'id': 'id', - 'template_meta_name': 'templateMetaName', - 'new': 'new', - 'old': 'old' - } - - def __init__(self, kind=None, state_status=None, id=None, template_meta_name=None, new=None, old=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffVariables - a model defined in OpenAPI.""" # noqa: E501 - self._kind = None - self._state_status = None - self._id = None - self._template_meta_name = None - self._new = None - self._old = None - self.discriminator = None - - if kind is not None: - self.kind = kind - if state_status is not None: - self.state_status = state_status - if id is not None: - self.id = id - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if new is not None: - self.new = new - if old is not None: - self.old = old - - @property - def kind(self): - """Get the kind of this TemplateSummaryDiffVariables. - - :return: The kind of this TemplateSummaryDiffVariables. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummaryDiffVariables. - - :param kind: The kind of this TemplateSummaryDiffVariables. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def state_status(self): - """Get the state_status of this TemplateSummaryDiffVariables. - - :return: The state_status of this TemplateSummaryDiffVariables. - :rtype: str - """ # noqa: E501 - return self._state_status - - @state_status.setter - def state_status(self, state_status): - """Set the state_status of this TemplateSummaryDiffVariables. - - :param state_status: The state_status of this TemplateSummaryDiffVariables. - :type: str - """ # noqa: E501 - self._state_status = state_status - - @property - def id(self): - """Get the id of this TemplateSummaryDiffVariables. - - :return: The id of this TemplateSummaryDiffVariables. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummaryDiffVariables. - - :param id: The id of this TemplateSummaryDiffVariables. - :type: str - """ # noqa: E501 - self._id = id - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummaryDiffVariables. - - :return: The template_meta_name of this TemplateSummaryDiffVariables. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummaryDiffVariables. - - :param template_meta_name: The template_meta_name of this TemplateSummaryDiffVariables. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def new(self): - """Get the new of this TemplateSummaryDiffVariables. - - :return: The new of this TemplateSummaryDiffVariables. - :rtype: TemplateSummaryDiffVariablesNewOld - """ # noqa: E501 - return self._new - - @new.setter - def new(self, new): - """Set the new of this TemplateSummaryDiffVariables. - - :param new: The new of this TemplateSummaryDiffVariables. - :type: TemplateSummaryDiffVariablesNewOld - """ # noqa: E501 - self._new = new - - @property - def old(self): - """Get the old of this TemplateSummaryDiffVariables. - - :return: The old of this TemplateSummaryDiffVariables. - :rtype: TemplateSummaryDiffVariablesNewOld - """ # noqa: E501 - return self._old - - @old.setter - def old(self, old): - """Set the old of this TemplateSummaryDiffVariables. - - :param old: The old of this TemplateSummaryDiffVariables. - :type: TemplateSummaryDiffVariablesNewOld - """ # noqa: E501 - self._old = old - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffVariables): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_variables_new_old.py b/frogpilot/third_party/influxdb_client/domain/template_summary_diff_variables_new_old.py deleted file mode 100644 index 1537e5daf..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_variables_new_old.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryDiffVariablesNewOld(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'name': 'str', - 'description': 'str', - 'args': 'VariableProperties' - } - - attribute_map = { - 'name': 'name', - 'description': 'description', - 'args': 'args' - } - - def __init__(self, name=None, description=None, args=None): # noqa: E501,D401,D403 - """TemplateSummaryDiffVariablesNewOld - a model defined in OpenAPI.""" # noqa: E501 - self._name = None - self._description = None - self._args = None - self.discriminator = None - - if name is not None: - self.name = name - if description is not None: - self.description = description - if args is not None: - self.args = args - - @property - def name(self): - """Get the name of this TemplateSummaryDiffVariablesNewOld. - - :return: The name of this TemplateSummaryDiffVariablesNewOld. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateSummaryDiffVariablesNewOld. - - :param name: The name of this TemplateSummaryDiffVariablesNewOld. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this TemplateSummaryDiffVariablesNewOld. - - :return: The description of this TemplateSummaryDiffVariablesNewOld. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TemplateSummaryDiffVariablesNewOld. - - :param description: The description of this TemplateSummaryDiffVariablesNewOld. - :type: str - """ # noqa: E501 - self._description = description - - @property - def args(self): - """Get the args of this TemplateSummaryDiffVariablesNewOld. - - :return: The args of this TemplateSummaryDiffVariablesNewOld. - :rtype: VariableProperties - """ # noqa: E501 - return self._args - - @args.setter - def args(self, args): - """Set the args of this TemplateSummaryDiffVariablesNewOld. - - :param args: The args of this TemplateSummaryDiffVariablesNewOld. - :type: VariableProperties - """ # noqa: E501 - self._args = args - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryDiffVariablesNewOld): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_errors.py b/frogpilot/third_party/influxdb_client/domain/template_summary_errors.py deleted file mode 100644 index 3d41ef4eb..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_errors.py +++ /dev/null @@ -1,176 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryErrors(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kind': 'TemplateKind', - 'reason': 'str', - 'fields': 'list[str]', - 'indexes': 'list[int]' - } - - attribute_map = { - 'kind': 'kind', - 'reason': 'reason', - 'fields': 'fields', - 'indexes': 'indexes' - } - - def __init__(self, kind=None, reason=None, fields=None, indexes=None): # noqa: E501,D401,D403 - """TemplateSummaryErrors - a model defined in OpenAPI.""" # noqa: E501 - self._kind = None - self._reason = None - self._fields = None - self._indexes = None - self.discriminator = None - - if kind is not None: - self.kind = kind - if reason is not None: - self.reason = reason - if fields is not None: - self.fields = fields - if indexes is not None: - self.indexes = indexes - - @property - def kind(self): - """Get the kind of this TemplateSummaryErrors. - - :return: The kind of this TemplateSummaryErrors. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummaryErrors. - - :param kind: The kind of this TemplateSummaryErrors. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def reason(self): - """Get the reason of this TemplateSummaryErrors. - - :return: The reason of this TemplateSummaryErrors. - :rtype: str - """ # noqa: E501 - return self._reason - - @reason.setter - def reason(self, reason): - """Set the reason of this TemplateSummaryErrors. - - :param reason: The reason of this TemplateSummaryErrors. - :type: str - """ # noqa: E501 - self._reason = reason - - @property - def fields(self): - """Get the fields of this TemplateSummaryErrors. - - :return: The fields of this TemplateSummaryErrors. - :rtype: list[str] - """ # noqa: E501 - return self._fields - - @fields.setter - def fields(self, fields): - """Set the fields of this TemplateSummaryErrors. - - :param fields: The fields of this TemplateSummaryErrors. - :type: list[str] - """ # noqa: E501 - self._fields = fields - - @property - def indexes(self): - """Get the indexes of this TemplateSummaryErrors. - - :return: The indexes of this TemplateSummaryErrors. - :rtype: list[int] - """ # noqa: E501 - return self._indexes - - @indexes.setter - def indexes(self, indexes): - """Set the indexes of this TemplateSummaryErrors. - - :param indexes: The indexes of this TemplateSummaryErrors. - :type: list[int] - """ # noqa: E501 - self._indexes = indexes - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryErrors): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_label.py b/frogpilot/third_party/influxdb_client/domain/template_summary_label.py deleted file mode 100644 index 727260ad7..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_label.py +++ /dev/null @@ -1,245 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryLabel(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'org_id': 'str', - 'kind': 'TemplateKind', - 'template_meta_name': 'str', - 'name': 'str', - 'properties': 'TemplateSummaryLabelProperties', - 'env_references': 'list[object]' - } - - attribute_map = { - 'id': 'id', - 'org_id': 'orgID', - 'kind': 'kind', - 'template_meta_name': 'templateMetaName', - 'name': 'name', - 'properties': 'properties', - 'env_references': 'envReferences' - } - - def __init__(self, id=None, org_id=None, kind=None, template_meta_name=None, name=None, properties=None, env_references=None): # noqa: E501,D401,D403 - """TemplateSummaryLabel - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._org_id = None - self._kind = None - self._template_meta_name = None - self._name = None - self._properties = None - self._env_references = None - self.discriminator = None - - if id is not None: - self.id = id - if org_id is not None: - self.org_id = org_id - if kind is not None: - self.kind = kind - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if name is not None: - self.name = name - if properties is not None: - self.properties = properties - if env_references is not None: - self.env_references = env_references - - @property - def id(self): - """Get the id of this TemplateSummaryLabel. - - :return: The id of this TemplateSummaryLabel. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummaryLabel. - - :param id: The id of this TemplateSummaryLabel. - :type: str - """ # noqa: E501 - self._id = id - - @property - def org_id(self): - """Get the org_id of this TemplateSummaryLabel. - - :return: The org_id of this TemplateSummaryLabel. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this TemplateSummaryLabel. - - :param org_id: The org_id of this TemplateSummaryLabel. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def kind(self): - """Get the kind of this TemplateSummaryLabel. - - :return: The kind of this TemplateSummaryLabel. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummaryLabel. - - :param kind: The kind of this TemplateSummaryLabel. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummaryLabel. - - :return: The template_meta_name of this TemplateSummaryLabel. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummaryLabel. - - :param template_meta_name: The template_meta_name of this TemplateSummaryLabel. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def name(self): - """Get the name of this TemplateSummaryLabel. - - :return: The name of this TemplateSummaryLabel. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateSummaryLabel. - - :param name: The name of this TemplateSummaryLabel. - :type: str - """ # noqa: E501 - self._name = name - - @property - def properties(self): - """Get the properties of this TemplateSummaryLabel. - - :return: The properties of this TemplateSummaryLabel. - :rtype: TemplateSummaryLabelProperties - """ # noqa: E501 - return self._properties - - @properties.setter - def properties(self, properties): - """Set the properties of this TemplateSummaryLabel. - - :param properties: The properties of this TemplateSummaryLabel. - :type: TemplateSummaryLabelProperties - """ # noqa: E501 - self._properties = properties - - @property - def env_references(self): - """Get the env_references of this TemplateSummaryLabel. - - :return: The env_references of this TemplateSummaryLabel. - :rtype: list[object] - """ # noqa: E501 - return self._env_references - - @env_references.setter - def env_references(self, env_references): - """Set the env_references of this TemplateSummaryLabel. - - :param env_references: The env_references of this TemplateSummaryLabel. - :type: list[object] - """ # noqa: E501 - self._env_references = env_references - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryLabel): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_label_properties.py b/frogpilot/third_party/influxdb_client/domain/template_summary_label_properties.py deleted file mode 100644 index 82bab1e72..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_label_properties.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummaryLabelProperties(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'color': 'str', - 'description': 'str' - } - - attribute_map = { - 'color': 'color', - 'description': 'description' - } - - def __init__(self, color=None, description=None): # noqa: E501,D401,D403 - """TemplateSummaryLabelProperties - a model defined in OpenAPI.""" # noqa: E501 - self._color = None - self._description = None - self.discriminator = None - - if color is not None: - self.color = color - if description is not None: - self.description = description - - @property - def color(self): - """Get the color of this TemplateSummaryLabelProperties. - - :return: The color of this TemplateSummaryLabelProperties. - :rtype: str - """ # noqa: E501 - return self._color - - @color.setter - def color(self, color): - """Set the color of this TemplateSummaryLabelProperties. - - :param color: The color of this TemplateSummaryLabelProperties. - :type: str - """ # noqa: E501 - self._color = color - - @property - def description(self): - """Get the description of this TemplateSummaryLabelProperties. - - :return: The description of this TemplateSummaryLabelProperties. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TemplateSummaryLabelProperties. - - :param description: The description of this TemplateSummaryLabelProperties. - :type: str - """ # noqa: E501 - self._description = description - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummaryLabelProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary.py b/frogpilot/third_party/influxdb_client/domain/template_summary_summary.py deleted file mode 100644 index 5ca10021a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_summary.py +++ /dev/null @@ -1,360 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummarySummary(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'buckets': 'list[TemplateSummarySummaryBuckets]', - 'checks': 'list[CheckDiscriminator]', - 'dashboards': 'list[TemplateSummarySummaryDashboards]', - 'labels': 'list[TemplateSummaryLabel]', - 'label_mappings': 'list[TemplateSummarySummaryLabelMappings]', - 'missing_env_refs': 'list[str]', - 'missing_secrets': 'list[str]', - 'notification_endpoints': 'list[NotificationEndpointDiscriminator]', - 'notification_rules': 'list[TemplateSummarySummaryNotificationRules]', - 'tasks': 'list[TemplateSummarySummaryTasks]', - 'telegraf_configs': 'list[TelegrafRequest]', - 'variables': 'list[TemplateSummarySummaryVariables]' - } - - attribute_map = { - 'buckets': 'buckets', - 'checks': 'checks', - 'dashboards': 'dashboards', - 'labels': 'labels', - 'label_mappings': 'labelMappings', - 'missing_env_refs': 'missingEnvRefs', - 'missing_secrets': 'missingSecrets', - 'notification_endpoints': 'notificationEndpoints', - 'notification_rules': 'notificationRules', - 'tasks': 'tasks', - 'telegraf_configs': 'telegrafConfigs', - 'variables': 'variables' - } - - def __init__(self, buckets=None, checks=None, dashboards=None, labels=None, label_mappings=None, missing_env_refs=None, missing_secrets=None, notification_endpoints=None, notification_rules=None, tasks=None, telegraf_configs=None, variables=None): # noqa: E501,D401,D403 - """TemplateSummarySummary - a model defined in OpenAPI.""" # noqa: E501 - self._buckets = None - self._checks = None - self._dashboards = None - self._labels = None - self._label_mappings = None - self._missing_env_refs = None - self._missing_secrets = None - self._notification_endpoints = None - self._notification_rules = None - self._tasks = None - self._telegraf_configs = None - self._variables = None - self.discriminator = None - - if buckets is not None: - self.buckets = buckets - if checks is not None: - self.checks = checks - if dashboards is not None: - self.dashboards = dashboards - if labels is not None: - self.labels = labels - if label_mappings is not None: - self.label_mappings = label_mappings - if missing_env_refs is not None: - self.missing_env_refs = missing_env_refs - if missing_secrets is not None: - self.missing_secrets = missing_secrets - if notification_endpoints is not None: - self.notification_endpoints = notification_endpoints - if notification_rules is not None: - self.notification_rules = notification_rules - if tasks is not None: - self.tasks = tasks - if telegraf_configs is not None: - self.telegraf_configs = telegraf_configs - if variables is not None: - self.variables = variables - - @property - def buckets(self): - """Get the buckets of this TemplateSummarySummary. - - :return: The buckets of this TemplateSummarySummary. - :rtype: list[TemplateSummarySummaryBuckets] - """ # noqa: E501 - return self._buckets - - @buckets.setter - def buckets(self, buckets): - """Set the buckets of this TemplateSummarySummary. - - :param buckets: The buckets of this TemplateSummarySummary. - :type: list[TemplateSummarySummaryBuckets] - """ # noqa: E501 - self._buckets = buckets - - @property - def checks(self): - """Get the checks of this TemplateSummarySummary. - - :return: The checks of this TemplateSummarySummary. - :rtype: list[CheckDiscriminator] - """ # noqa: E501 - return self._checks - - @checks.setter - def checks(self, checks): - """Set the checks of this TemplateSummarySummary. - - :param checks: The checks of this TemplateSummarySummary. - :type: list[CheckDiscriminator] - """ # noqa: E501 - self._checks = checks - - @property - def dashboards(self): - """Get the dashboards of this TemplateSummarySummary. - - :return: The dashboards of this TemplateSummarySummary. - :rtype: list[TemplateSummarySummaryDashboards] - """ # noqa: E501 - return self._dashboards - - @dashboards.setter - def dashboards(self, dashboards): - """Set the dashboards of this TemplateSummarySummary. - - :param dashboards: The dashboards of this TemplateSummarySummary. - :type: list[TemplateSummarySummaryDashboards] - """ # noqa: E501 - self._dashboards = dashboards - - @property - def labels(self): - """Get the labels of this TemplateSummarySummary. - - :return: The labels of this TemplateSummarySummary. - :rtype: list[TemplateSummaryLabel] - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this TemplateSummarySummary. - - :param labels: The labels of this TemplateSummarySummary. - :type: list[TemplateSummaryLabel] - """ # noqa: E501 - self._labels = labels - - @property - def label_mappings(self): - """Get the label_mappings of this TemplateSummarySummary. - - :return: The label_mappings of this TemplateSummarySummary. - :rtype: list[TemplateSummarySummaryLabelMappings] - """ # noqa: E501 - return self._label_mappings - - @label_mappings.setter - def label_mappings(self, label_mappings): - """Set the label_mappings of this TemplateSummarySummary. - - :param label_mappings: The label_mappings of this TemplateSummarySummary. - :type: list[TemplateSummarySummaryLabelMappings] - """ # noqa: E501 - self._label_mappings = label_mappings - - @property - def missing_env_refs(self): - """Get the missing_env_refs of this TemplateSummarySummary. - - :return: The missing_env_refs of this TemplateSummarySummary. - :rtype: list[str] - """ # noqa: E501 - return self._missing_env_refs - - @missing_env_refs.setter - def missing_env_refs(self, missing_env_refs): - """Set the missing_env_refs of this TemplateSummarySummary. - - :param missing_env_refs: The missing_env_refs of this TemplateSummarySummary. - :type: list[str] - """ # noqa: E501 - self._missing_env_refs = missing_env_refs - - @property - def missing_secrets(self): - """Get the missing_secrets of this TemplateSummarySummary. - - :return: The missing_secrets of this TemplateSummarySummary. - :rtype: list[str] - """ # noqa: E501 - return self._missing_secrets - - @missing_secrets.setter - def missing_secrets(self, missing_secrets): - """Set the missing_secrets of this TemplateSummarySummary. - - :param missing_secrets: The missing_secrets of this TemplateSummarySummary. - :type: list[str] - """ # noqa: E501 - self._missing_secrets = missing_secrets - - @property - def notification_endpoints(self): - """Get the notification_endpoints of this TemplateSummarySummary. - - :return: The notification_endpoints of this TemplateSummarySummary. - :rtype: list[NotificationEndpointDiscriminator] - """ # noqa: E501 - return self._notification_endpoints - - @notification_endpoints.setter - def notification_endpoints(self, notification_endpoints): - """Set the notification_endpoints of this TemplateSummarySummary. - - :param notification_endpoints: The notification_endpoints of this TemplateSummarySummary. - :type: list[NotificationEndpointDiscriminator] - """ # noqa: E501 - self._notification_endpoints = notification_endpoints - - @property - def notification_rules(self): - """Get the notification_rules of this TemplateSummarySummary. - - :return: The notification_rules of this TemplateSummarySummary. - :rtype: list[TemplateSummarySummaryNotificationRules] - """ # noqa: E501 - return self._notification_rules - - @notification_rules.setter - def notification_rules(self, notification_rules): - """Set the notification_rules of this TemplateSummarySummary. - - :param notification_rules: The notification_rules of this TemplateSummarySummary. - :type: list[TemplateSummarySummaryNotificationRules] - """ # noqa: E501 - self._notification_rules = notification_rules - - @property - def tasks(self): - """Get the tasks of this TemplateSummarySummary. - - :return: The tasks of this TemplateSummarySummary. - :rtype: list[TemplateSummarySummaryTasks] - """ # noqa: E501 - return self._tasks - - @tasks.setter - def tasks(self, tasks): - """Set the tasks of this TemplateSummarySummary. - - :param tasks: The tasks of this TemplateSummarySummary. - :type: list[TemplateSummarySummaryTasks] - """ # noqa: E501 - self._tasks = tasks - - @property - def telegraf_configs(self): - """Get the telegraf_configs of this TemplateSummarySummary. - - :return: The telegraf_configs of this TemplateSummarySummary. - :rtype: list[TelegrafRequest] - """ # noqa: E501 - return self._telegraf_configs - - @telegraf_configs.setter - def telegraf_configs(self, telegraf_configs): - """Set the telegraf_configs of this TemplateSummarySummary. - - :param telegraf_configs: The telegraf_configs of this TemplateSummarySummary. - :type: list[TelegrafRequest] - """ # noqa: E501 - self._telegraf_configs = telegraf_configs - - @property - def variables(self): - """Get the variables of this TemplateSummarySummary. - - :return: The variables of this TemplateSummarySummary. - :rtype: list[TemplateSummarySummaryVariables] - """ # noqa: E501 - return self._variables - - @variables.setter - def variables(self, variables): - """Set the variables of this TemplateSummarySummary. - - :param variables: The variables of this TemplateSummarySummary. - :type: list[TemplateSummarySummaryVariables] - """ # noqa: E501 - self._variables = variables - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummarySummary): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_buckets.py b/frogpilot/third_party/influxdb_client/domain/template_summary_summary_buckets.py deleted file mode 100644 index ba43e8ca1..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_buckets.py +++ /dev/null @@ -1,291 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummarySummaryBuckets(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'org_id': 'str', - 'kind': 'TemplateKind', - 'template_meta_name': 'str', - 'name': 'str', - 'description': 'str', - 'retention_period': 'int', - 'label_associations': 'list[TemplateSummaryLabel]', - 'env_references': 'list[object]' - } - - attribute_map = { - 'id': 'id', - 'org_id': 'orgID', - 'kind': 'kind', - 'template_meta_name': 'templateMetaName', - 'name': 'name', - 'description': 'description', - 'retention_period': 'retentionPeriod', - 'label_associations': 'labelAssociations', - 'env_references': 'envReferences' - } - - def __init__(self, id=None, org_id=None, kind=None, template_meta_name=None, name=None, description=None, retention_period=None, label_associations=None, env_references=None): # noqa: E501,D401,D403 - """TemplateSummarySummaryBuckets - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._org_id = None - self._kind = None - self._template_meta_name = None - self._name = None - self._description = None - self._retention_period = None - self._label_associations = None - self._env_references = None - self.discriminator = None - - if id is not None: - self.id = id - if org_id is not None: - self.org_id = org_id - if kind is not None: - self.kind = kind - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if name is not None: - self.name = name - if description is not None: - self.description = description - if retention_period is not None: - self.retention_period = retention_period - if label_associations is not None: - self.label_associations = label_associations - if env_references is not None: - self.env_references = env_references - - @property - def id(self): - """Get the id of this TemplateSummarySummaryBuckets. - - :return: The id of this TemplateSummarySummaryBuckets. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummarySummaryBuckets. - - :param id: The id of this TemplateSummarySummaryBuckets. - :type: str - """ # noqa: E501 - self._id = id - - @property - def org_id(self): - """Get the org_id of this TemplateSummarySummaryBuckets. - - :return: The org_id of this TemplateSummarySummaryBuckets. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this TemplateSummarySummaryBuckets. - - :param org_id: The org_id of this TemplateSummarySummaryBuckets. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def kind(self): - """Get the kind of this TemplateSummarySummaryBuckets. - - :return: The kind of this TemplateSummarySummaryBuckets. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummarySummaryBuckets. - - :param kind: The kind of this TemplateSummarySummaryBuckets. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummarySummaryBuckets. - - :return: The template_meta_name of this TemplateSummarySummaryBuckets. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummarySummaryBuckets. - - :param template_meta_name: The template_meta_name of this TemplateSummarySummaryBuckets. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def name(self): - """Get the name of this TemplateSummarySummaryBuckets. - - :return: The name of this TemplateSummarySummaryBuckets. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateSummarySummaryBuckets. - - :param name: The name of this TemplateSummarySummaryBuckets. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this TemplateSummarySummaryBuckets. - - :return: The description of this TemplateSummarySummaryBuckets. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TemplateSummarySummaryBuckets. - - :param description: The description of this TemplateSummarySummaryBuckets. - :type: str - """ # noqa: E501 - self._description = description - - @property - def retention_period(self): - """Get the retention_period of this TemplateSummarySummaryBuckets. - - :return: The retention_period of this TemplateSummarySummaryBuckets. - :rtype: int - """ # noqa: E501 - return self._retention_period - - @retention_period.setter - def retention_period(self, retention_period): - """Set the retention_period of this TemplateSummarySummaryBuckets. - - :param retention_period: The retention_period of this TemplateSummarySummaryBuckets. - :type: int - """ # noqa: E501 - self._retention_period = retention_period - - @property - def label_associations(self): - """Get the label_associations of this TemplateSummarySummaryBuckets. - - :return: The label_associations of this TemplateSummarySummaryBuckets. - :rtype: list[TemplateSummaryLabel] - """ # noqa: E501 - return self._label_associations - - @label_associations.setter - def label_associations(self, label_associations): - """Set the label_associations of this TemplateSummarySummaryBuckets. - - :param label_associations: The label_associations of this TemplateSummarySummaryBuckets. - :type: list[TemplateSummaryLabel] - """ # noqa: E501 - self._label_associations = label_associations - - @property - def env_references(self): - """Get the env_references of this TemplateSummarySummaryBuckets. - - :return: The env_references of this TemplateSummarySummaryBuckets. - :rtype: list[object] - """ # noqa: E501 - return self._env_references - - @env_references.setter - def env_references(self, env_references): - """Set the env_references of this TemplateSummarySummaryBuckets. - - :param env_references: The env_references of this TemplateSummarySummaryBuckets. - :type: list[object] - """ # noqa: E501 - self._env_references = env_references - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummarySummaryBuckets): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_dashboards.py b/frogpilot/third_party/influxdb_client/domain/template_summary_summary_dashboards.py deleted file mode 100644 index 91a548494..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_dashboards.py +++ /dev/null @@ -1,291 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummarySummaryDashboards(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'org_id': 'str', - 'kind': 'TemplateKind', - 'template_meta_name': 'str', - 'name': 'str', - 'description': 'str', - 'label_associations': 'list[TemplateSummaryLabel]', - 'charts': 'list[TemplateChart]', - 'env_references': 'list[object]' - } - - attribute_map = { - 'id': 'id', - 'org_id': 'orgID', - 'kind': 'kind', - 'template_meta_name': 'templateMetaName', - 'name': 'name', - 'description': 'description', - 'label_associations': 'labelAssociations', - 'charts': 'charts', - 'env_references': 'envReferences' - } - - def __init__(self, id=None, org_id=None, kind=None, template_meta_name=None, name=None, description=None, label_associations=None, charts=None, env_references=None): # noqa: E501,D401,D403 - """TemplateSummarySummaryDashboards - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._org_id = None - self._kind = None - self._template_meta_name = None - self._name = None - self._description = None - self._label_associations = None - self._charts = None - self._env_references = None - self.discriminator = None - - if id is not None: - self.id = id - if org_id is not None: - self.org_id = org_id - if kind is not None: - self.kind = kind - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if name is not None: - self.name = name - if description is not None: - self.description = description - if label_associations is not None: - self.label_associations = label_associations - if charts is not None: - self.charts = charts - if env_references is not None: - self.env_references = env_references - - @property - def id(self): - """Get the id of this TemplateSummarySummaryDashboards. - - :return: The id of this TemplateSummarySummaryDashboards. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummarySummaryDashboards. - - :param id: The id of this TemplateSummarySummaryDashboards. - :type: str - """ # noqa: E501 - self._id = id - - @property - def org_id(self): - """Get the org_id of this TemplateSummarySummaryDashboards. - - :return: The org_id of this TemplateSummarySummaryDashboards. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this TemplateSummarySummaryDashboards. - - :param org_id: The org_id of this TemplateSummarySummaryDashboards. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def kind(self): - """Get the kind of this TemplateSummarySummaryDashboards. - - :return: The kind of this TemplateSummarySummaryDashboards. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummarySummaryDashboards. - - :param kind: The kind of this TemplateSummarySummaryDashboards. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummarySummaryDashboards. - - :return: The template_meta_name of this TemplateSummarySummaryDashboards. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummarySummaryDashboards. - - :param template_meta_name: The template_meta_name of this TemplateSummarySummaryDashboards. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def name(self): - """Get the name of this TemplateSummarySummaryDashboards. - - :return: The name of this TemplateSummarySummaryDashboards. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateSummarySummaryDashboards. - - :param name: The name of this TemplateSummarySummaryDashboards. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this TemplateSummarySummaryDashboards. - - :return: The description of this TemplateSummarySummaryDashboards. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TemplateSummarySummaryDashboards. - - :param description: The description of this TemplateSummarySummaryDashboards. - :type: str - """ # noqa: E501 - self._description = description - - @property - def label_associations(self): - """Get the label_associations of this TemplateSummarySummaryDashboards. - - :return: The label_associations of this TemplateSummarySummaryDashboards. - :rtype: list[TemplateSummaryLabel] - """ # noqa: E501 - return self._label_associations - - @label_associations.setter - def label_associations(self, label_associations): - """Set the label_associations of this TemplateSummarySummaryDashboards. - - :param label_associations: The label_associations of this TemplateSummarySummaryDashboards. - :type: list[TemplateSummaryLabel] - """ # noqa: E501 - self._label_associations = label_associations - - @property - def charts(self): - """Get the charts of this TemplateSummarySummaryDashboards. - - :return: The charts of this TemplateSummarySummaryDashboards. - :rtype: list[TemplateChart] - """ # noqa: E501 - return self._charts - - @charts.setter - def charts(self, charts): - """Set the charts of this TemplateSummarySummaryDashboards. - - :param charts: The charts of this TemplateSummarySummaryDashboards. - :type: list[TemplateChart] - """ # noqa: E501 - self._charts = charts - - @property - def env_references(self): - """Get the env_references of this TemplateSummarySummaryDashboards. - - :return: The env_references of this TemplateSummarySummaryDashboards. - :rtype: list[object] - """ # noqa: E501 - return self._env_references - - @env_references.setter - def env_references(self, env_references): - """Set the env_references of this TemplateSummarySummaryDashboards. - - :param env_references: The env_references of this TemplateSummarySummaryDashboards. - :type: list[object] - """ # noqa: E501 - self._env_references = env_references - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummarySummaryDashboards): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_label_mappings.py b/frogpilot/third_party/influxdb_client/domain/template_summary_summary_label_mappings.py deleted file mode 100644 index 9051866ce..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_label_mappings.py +++ /dev/null @@ -1,268 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummarySummaryLabelMappings(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'status': 'str', - 'resource_template_meta_name': 'str', - 'resource_name': 'str', - 'resource_id': 'str', - 'resource_type': 'str', - 'label_template_meta_name': 'str', - 'label_name': 'str', - 'label_id': 'str' - } - - attribute_map = { - 'status': 'status', - 'resource_template_meta_name': 'resourceTemplateMetaName', - 'resource_name': 'resourceName', - 'resource_id': 'resourceID', - 'resource_type': 'resourceType', - 'label_template_meta_name': 'labelTemplateMetaName', - 'label_name': 'labelName', - 'label_id': 'labelID' - } - - def __init__(self, status=None, resource_template_meta_name=None, resource_name=None, resource_id=None, resource_type=None, label_template_meta_name=None, label_name=None, label_id=None): # noqa: E501,D401,D403 - """TemplateSummarySummaryLabelMappings - a model defined in OpenAPI.""" # noqa: E501 - self._status = None - self._resource_template_meta_name = None - self._resource_name = None - self._resource_id = None - self._resource_type = None - self._label_template_meta_name = None - self._label_name = None - self._label_id = None - self.discriminator = None - - if status is not None: - self.status = status - if resource_template_meta_name is not None: - self.resource_template_meta_name = resource_template_meta_name - if resource_name is not None: - self.resource_name = resource_name - if resource_id is not None: - self.resource_id = resource_id - if resource_type is not None: - self.resource_type = resource_type - if label_template_meta_name is not None: - self.label_template_meta_name = label_template_meta_name - if label_name is not None: - self.label_name = label_name - if label_id is not None: - self.label_id = label_id - - @property - def status(self): - """Get the status of this TemplateSummarySummaryLabelMappings. - - :return: The status of this TemplateSummarySummaryLabelMappings. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this TemplateSummarySummaryLabelMappings. - - :param status: The status of this TemplateSummarySummaryLabelMappings. - :type: str - """ # noqa: E501 - self._status = status - - @property - def resource_template_meta_name(self): - """Get the resource_template_meta_name of this TemplateSummarySummaryLabelMappings. - - :return: The resource_template_meta_name of this TemplateSummarySummaryLabelMappings. - :rtype: str - """ # noqa: E501 - return self._resource_template_meta_name - - @resource_template_meta_name.setter - def resource_template_meta_name(self, resource_template_meta_name): - """Set the resource_template_meta_name of this TemplateSummarySummaryLabelMappings. - - :param resource_template_meta_name: The resource_template_meta_name of this TemplateSummarySummaryLabelMappings. - :type: str - """ # noqa: E501 - self._resource_template_meta_name = resource_template_meta_name - - @property - def resource_name(self): - """Get the resource_name of this TemplateSummarySummaryLabelMappings. - - :return: The resource_name of this TemplateSummarySummaryLabelMappings. - :rtype: str - """ # noqa: E501 - return self._resource_name - - @resource_name.setter - def resource_name(self, resource_name): - """Set the resource_name of this TemplateSummarySummaryLabelMappings. - - :param resource_name: The resource_name of this TemplateSummarySummaryLabelMappings. - :type: str - """ # noqa: E501 - self._resource_name = resource_name - - @property - def resource_id(self): - """Get the resource_id of this TemplateSummarySummaryLabelMappings. - - :return: The resource_id of this TemplateSummarySummaryLabelMappings. - :rtype: str - """ # noqa: E501 - return self._resource_id - - @resource_id.setter - def resource_id(self, resource_id): - """Set the resource_id of this TemplateSummarySummaryLabelMappings. - - :param resource_id: The resource_id of this TemplateSummarySummaryLabelMappings. - :type: str - """ # noqa: E501 - self._resource_id = resource_id - - @property - def resource_type(self): - """Get the resource_type of this TemplateSummarySummaryLabelMappings. - - :return: The resource_type of this TemplateSummarySummaryLabelMappings. - :rtype: str - """ # noqa: E501 - return self._resource_type - - @resource_type.setter - def resource_type(self, resource_type): - """Set the resource_type of this TemplateSummarySummaryLabelMappings. - - :param resource_type: The resource_type of this TemplateSummarySummaryLabelMappings. - :type: str - """ # noqa: E501 - self._resource_type = resource_type - - @property - def label_template_meta_name(self): - """Get the label_template_meta_name of this TemplateSummarySummaryLabelMappings. - - :return: The label_template_meta_name of this TemplateSummarySummaryLabelMappings. - :rtype: str - """ # noqa: E501 - return self._label_template_meta_name - - @label_template_meta_name.setter - def label_template_meta_name(self, label_template_meta_name): - """Set the label_template_meta_name of this TemplateSummarySummaryLabelMappings. - - :param label_template_meta_name: The label_template_meta_name of this TemplateSummarySummaryLabelMappings. - :type: str - """ # noqa: E501 - self._label_template_meta_name = label_template_meta_name - - @property - def label_name(self): - """Get the label_name of this TemplateSummarySummaryLabelMappings. - - :return: The label_name of this TemplateSummarySummaryLabelMappings. - :rtype: str - """ # noqa: E501 - return self._label_name - - @label_name.setter - def label_name(self, label_name): - """Set the label_name of this TemplateSummarySummaryLabelMappings. - - :param label_name: The label_name of this TemplateSummarySummaryLabelMappings. - :type: str - """ # noqa: E501 - self._label_name = label_name - - @property - def label_id(self): - """Get the label_id of this TemplateSummarySummaryLabelMappings. - - :return: The label_id of this TemplateSummarySummaryLabelMappings. - :rtype: str - """ # noqa: E501 - return self._label_id - - @label_id.setter - def label_id(self, label_id): - """Set the label_id of this TemplateSummarySummaryLabelMappings. - - :param label_id: The label_id of this TemplateSummarySummaryLabelMappings. - :type: str - """ # noqa: E501 - self._label_id = label_id - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummarySummaryLabelMappings): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_notification_rules.py b/frogpilot/third_party/influxdb_client/domain/template_summary_summary_notification_rules.py deleted file mode 100644 index 63168ed0e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_notification_rules.py +++ /dev/null @@ -1,429 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummarySummaryNotificationRules(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kind': 'TemplateKind', - 'template_meta_name': 'str', - 'name': 'str', - 'description': 'str', - 'endpoint_template_meta_name': 'str', - 'endpoint_id': 'str', - 'endpoint_type': 'str', - 'every': 'str', - 'offset': 'str', - 'message_template': 'str', - 'status': 'str', - 'status_rules': 'list[TemplateSummarySummaryStatusRules]', - 'tag_rules': 'list[TemplateSummarySummaryTagRules]', - 'label_associations': 'list[TemplateSummaryLabel]', - 'env_references': 'list[object]' - } - - attribute_map = { - 'kind': 'kind', - 'template_meta_name': 'templateMetaName', - 'name': 'name', - 'description': 'description', - 'endpoint_template_meta_name': 'endpointTemplateMetaName', - 'endpoint_id': 'endpointID', - 'endpoint_type': 'endpointType', - 'every': 'every', - 'offset': 'offset', - 'message_template': 'messageTemplate', - 'status': 'status', - 'status_rules': 'statusRules', - 'tag_rules': 'tagRules', - 'label_associations': 'labelAssociations', - 'env_references': 'envReferences' - } - - def __init__(self, kind=None, template_meta_name=None, name=None, description=None, endpoint_template_meta_name=None, endpoint_id=None, endpoint_type=None, every=None, offset=None, message_template=None, status=None, status_rules=None, tag_rules=None, label_associations=None, env_references=None): # noqa: E501,D401,D403 - """TemplateSummarySummaryNotificationRules - a model defined in OpenAPI.""" # noqa: E501 - self._kind = None - self._template_meta_name = None - self._name = None - self._description = None - self._endpoint_template_meta_name = None - self._endpoint_id = None - self._endpoint_type = None - self._every = None - self._offset = None - self._message_template = None - self._status = None - self._status_rules = None - self._tag_rules = None - self._label_associations = None - self._env_references = None - self.discriminator = None - - if kind is not None: - self.kind = kind - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if name is not None: - self.name = name - if description is not None: - self.description = description - if endpoint_template_meta_name is not None: - self.endpoint_template_meta_name = endpoint_template_meta_name - if endpoint_id is not None: - self.endpoint_id = endpoint_id - if endpoint_type is not None: - self.endpoint_type = endpoint_type - if every is not None: - self.every = every - if offset is not None: - self.offset = offset - if message_template is not None: - self.message_template = message_template - if status is not None: - self.status = status - if status_rules is not None: - self.status_rules = status_rules - if tag_rules is not None: - self.tag_rules = tag_rules - if label_associations is not None: - self.label_associations = label_associations - if env_references is not None: - self.env_references = env_references - - @property - def kind(self): - """Get the kind of this TemplateSummarySummaryNotificationRules. - - :return: The kind of this TemplateSummarySummaryNotificationRules. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummarySummaryNotificationRules. - - :param kind: The kind of this TemplateSummarySummaryNotificationRules. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummarySummaryNotificationRules. - - :return: The template_meta_name of this TemplateSummarySummaryNotificationRules. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummarySummaryNotificationRules. - - :param template_meta_name: The template_meta_name of this TemplateSummarySummaryNotificationRules. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def name(self): - """Get the name of this TemplateSummarySummaryNotificationRules. - - :return: The name of this TemplateSummarySummaryNotificationRules. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateSummarySummaryNotificationRules. - - :param name: The name of this TemplateSummarySummaryNotificationRules. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this TemplateSummarySummaryNotificationRules. - - :return: The description of this TemplateSummarySummaryNotificationRules. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TemplateSummarySummaryNotificationRules. - - :param description: The description of this TemplateSummarySummaryNotificationRules. - :type: str - """ # noqa: E501 - self._description = description - - @property - def endpoint_template_meta_name(self): - """Get the endpoint_template_meta_name of this TemplateSummarySummaryNotificationRules. - - :return: The endpoint_template_meta_name of this TemplateSummarySummaryNotificationRules. - :rtype: str - """ # noqa: E501 - return self._endpoint_template_meta_name - - @endpoint_template_meta_name.setter - def endpoint_template_meta_name(self, endpoint_template_meta_name): - """Set the endpoint_template_meta_name of this TemplateSummarySummaryNotificationRules. - - :param endpoint_template_meta_name: The endpoint_template_meta_name of this TemplateSummarySummaryNotificationRules. - :type: str - """ # noqa: E501 - self._endpoint_template_meta_name = endpoint_template_meta_name - - @property - def endpoint_id(self): - """Get the endpoint_id of this TemplateSummarySummaryNotificationRules. - - :return: The endpoint_id of this TemplateSummarySummaryNotificationRules. - :rtype: str - """ # noqa: E501 - return self._endpoint_id - - @endpoint_id.setter - def endpoint_id(self, endpoint_id): - """Set the endpoint_id of this TemplateSummarySummaryNotificationRules. - - :param endpoint_id: The endpoint_id of this TemplateSummarySummaryNotificationRules. - :type: str - """ # noqa: E501 - self._endpoint_id = endpoint_id - - @property - def endpoint_type(self): - """Get the endpoint_type of this TemplateSummarySummaryNotificationRules. - - :return: The endpoint_type of this TemplateSummarySummaryNotificationRules. - :rtype: str - """ # noqa: E501 - return self._endpoint_type - - @endpoint_type.setter - def endpoint_type(self, endpoint_type): - """Set the endpoint_type of this TemplateSummarySummaryNotificationRules. - - :param endpoint_type: The endpoint_type of this TemplateSummarySummaryNotificationRules. - :type: str - """ # noqa: E501 - self._endpoint_type = endpoint_type - - @property - def every(self): - """Get the every of this TemplateSummarySummaryNotificationRules. - - :return: The every of this TemplateSummarySummaryNotificationRules. - :rtype: str - """ # noqa: E501 - return self._every - - @every.setter - def every(self, every): - """Set the every of this TemplateSummarySummaryNotificationRules. - - :param every: The every of this TemplateSummarySummaryNotificationRules. - :type: str - """ # noqa: E501 - self._every = every - - @property - def offset(self): - """Get the offset of this TemplateSummarySummaryNotificationRules. - - :return: The offset of this TemplateSummarySummaryNotificationRules. - :rtype: str - """ # noqa: E501 - return self._offset - - @offset.setter - def offset(self, offset): - """Set the offset of this TemplateSummarySummaryNotificationRules. - - :param offset: The offset of this TemplateSummarySummaryNotificationRules. - :type: str - """ # noqa: E501 - self._offset = offset - - @property - def message_template(self): - """Get the message_template of this TemplateSummarySummaryNotificationRules. - - :return: The message_template of this TemplateSummarySummaryNotificationRules. - :rtype: str - """ # noqa: E501 - return self._message_template - - @message_template.setter - def message_template(self, message_template): - """Set the message_template of this TemplateSummarySummaryNotificationRules. - - :param message_template: The message_template of this TemplateSummarySummaryNotificationRules. - :type: str - """ # noqa: E501 - self._message_template = message_template - - @property - def status(self): - """Get the status of this TemplateSummarySummaryNotificationRules. - - :return: The status of this TemplateSummarySummaryNotificationRules. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this TemplateSummarySummaryNotificationRules. - - :param status: The status of this TemplateSummarySummaryNotificationRules. - :type: str - """ # noqa: E501 - self._status = status - - @property - def status_rules(self): - """Get the status_rules of this TemplateSummarySummaryNotificationRules. - - :return: The status_rules of this TemplateSummarySummaryNotificationRules. - :rtype: list[TemplateSummarySummaryStatusRules] - """ # noqa: E501 - return self._status_rules - - @status_rules.setter - def status_rules(self, status_rules): - """Set the status_rules of this TemplateSummarySummaryNotificationRules. - - :param status_rules: The status_rules of this TemplateSummarySummaryNotificationRules. - :type: list[TemplateSummarySummaryStatusRules] - """ # noqa: E501 - self._status_rules = status_rules - - @property - def tag_rules(self): - """Get the tag_rules of this TemplateSummarySummaryNotificationRules. - - :return: The tag_rules of this TemplateSummarySummaryNotificationRules. - :rtype: list[TemplateSummarySummaryTagRules] - """ # noqa: E501 - return self._tag_rules - - @tag_rules.setter - def tag_rules(self, tag_rules): - """Set the tag_rules of this TemplateSummarySummaryNotificationRules. - - :param tag_rules: The tag_rules of this TemplateSummarySummaryNotificationRules. - :type: list[TemplateSummarySummaryTagRules] - """ # noqa: E501 - self._tag_rules = tag_rules - - @property - def label_associations(self): - """Get the label_associations of this TemplateSummarySummaryNotificationRules. - - :return: The label_associations of this TemplateSummarySummaryNotificationRules. - :rtype: list[TemplateSummaryLabel] - """ # noqa: E501 - return self._label_associations - - @label_associations.setter - def label_associations(self, label_associations): - """Set the label_associations of this TemplateSummarySummaryNotificationRules. - - :param label_associations: The label_associations of this TemplateSummarySummaryNotificationRules. - :type: list[TemplateSummaryLabel] - """ # noqa: E501 - self._label_associations = label_associations - - @property - def env_references(self): - """Get the env_references of this TemplateSummarySummaryNotificationRules. - - :return: The env_references of this TemplateSummarySummaryNotificationRules. - :rtype: list[object] - """ # noqa: E501 - return self._env_references - - @env_references.setter - def env_references(self, env_references): - """Set the env_references of this TemplateSummarySummaryNotificationRules. - - :param env_references: The env_references of this TemplateSummarySummaryNotificationRules. - :type: list[object] - """ # noqa: E501 - self._env_references = env_references - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummarySummaryNotificationRules): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_status_rules.py b/frogpilot/third_party/influxdb_client/domain/template_summary_summary_status_rules.py deleted file mode 100644 index 90a7c5a9c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_status_rules.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummarySummaryStatusRules(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'current_level': 'str', - 'previous_level': 'str' - } - - attribute_map = { - 'current_level': 'currentLevel', - 'previous_level': 'previousLevel' - } - - def __init__(self, current_level=None, previous_level=None): # noqa: E501,D401,D403 - """TemplateSummarySummaryStatusRules - a model defined in OpenAPI.""" # noqa: E501 - self._current_level = None - self._previous_level = None - self.discriminator = None - - if current_level is not None: - self.current_level = current_level - if previous_level is not None: - self.previous_level = previous_level - - @property - def current_level(self): - """Get the current_level of this TemplateSummarySummaryStatusRules. - - :return: The current_level of this TemplateSummarySummaryStatusRules. - :rtype: str - """ # noqa: E501 - return self._current_level - - @current_level.setter - def current_level(self, current_level): - """Set the current_level of this TemplateSummarySummaryStatusRules. - - :param current_level: The current_level of this TemplateSummarySummaryStatusRules. - :type: str - """ # noqa: E501 - self._current_level = current_level - - @property - def previous_level(self): - """Get the previous_level of this TemplateSummarySummaryStatusRules. - - :return: The previous_level of this TemplateSummarySummaryStatusRules. - :rtype: str - """ # noqa: E501 - return self._previous_level - - @previous_level.setter - def previous_level(self, previous_level): - """Set the previous_level of this TemplateSummarySummaryStatusRules. - - :param previous_level: The previous_level of this TemplateSummarySummaryStatusRules. - :type: str - """ # noqa: E501 - self._previous_level = previous_level - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummarySummaryStatusRules): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_tag_rules.py b/frogpilot/third_party/influxdb_client/domain/template_summary_summary_tag_rules.py deleted file mode 100644 index 3c1a4475c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_tag_rules.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummarySummaryTagRules(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'key': 'str', - 'value': 'str', - 'operator': 'str' - } - - attribute_map = { - 'key': 'key', - 'value': 'value', - 'operator': 'operator' - } - - def __init__(self, key=None, value=None, operator=None): # noqa: E501,D401,D403 - """TemplateSummarySummaryTagRules - a model defined in OpenAPI.""" # noqa: E501 - self._key = None - self._value = None - self._operator = None - self.discriminator = None - - if key is not None: - self.key = key - if value is not None: - self.value = value - if operator is not None: - self.operator = operator - - @property - def key(self): - """Get the key of this TemplateSummarySummaryTagRules. - - :return: The key of this TemplateSummarySummaryTagRules. - :rtype: str - """ # noqa: E501 - return self._key - - @key.setter - def key(self, key): - """Set the key of this TemplateSummarySummaryTagRules. - - :param key: The key of this TemplateSummarySummaryTagRules. - :type: str - """ # noqa: E501 - self._key = key - - @property - def value(self): - """Get the value of this TemplateSummarySummaryTagRules. - - :return: The value of this TemplateSummarySummaryTagRules. - :rtype: str - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this TemplateSummarySummaryTagRules. - - :param value: The value of this TemplateSummarySummaryTagRules. - :type: str - """ # noqa: E501 - self._value = value - - @property - def operator(self): - """Get the operator of this TemplateSummarySummaryTagRules. - - :return: The operator of this TemplateSummarySummaryTagRules. - :rtype: str - """ # noqa: E501 - return self._operator - - @operator.setter - def operator(self, operator): - """Set the operator of this TemplateSummarySummaryTagRules. - - :param operator: The operator of this TemplateSummarySummaryTagRules. - :type: str - """ # noqa: E501 - self._operator = operator - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummarySummaryTagRules): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_tasks.py b/frogpilot/third_party/influxdb_client/domain/template_summary_summary_tasks.py deleted file mode 100644 index 7b8db7518..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_tasks.py +++ /dev/null @@ -1,337 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummarySummaryTasks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kind': 'TemplateKind', - 'template_meta_name': 'str', - 'id': 'str', - 'name': 'str', - 'cron': 'str', - 'description': 'str', - 'every': 'str', - 'offset': 'str', - 'query': 'str', - 'status': 'str', - 'env_references': 'list[object]' - } - - attribute_map = { - 'kind': 'kind', - 'template_meta_name': 'templateMetaName', - 'id': 'id', - 'name': 'name', - 'cron': 'cron', - 'description': 'description', - 'every': 'every', - 'offset': 'offset', - 'query': 'query', - 'status': 'status', - 'env_references': 'envReferences' - } - - def __init__(self, kind=None, template_meta_name=None, id=None, name=None, cron=None, description=None, every=None, offset=None, query=None, status=None, env_references=None): # noqa: E501,D401,D403 - """TemplateSummarySummaryTasks - a model defined in OpenAPI.""" # noqa: E501 - self._kind = None - self._template_meta_name = None - self._id = None - self._name = None - self._cron = None - self._description = None - self._every = None - self._offset = None - self._query = None - self._status = None - self._env_references = None - self.discriminator = None - - if kind is not None: - self.kind = kind - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if id is not None: - self.id = id - if name is not None: - self.name = name - if cron is not None: - self.cron = cron - if description is not None: - self.description = description - if every is not None: - self.every = every - if offset is not None: - self.offset = offset - if query is not None: - self.query = query - if status is not None: - self.status = status - if env_references is not None: - self.env_references = env_references - - @property - def kind(self): - """Get the kind of this TemplateSummarySummaryTasks. - - :return: The kind of this TemplateSummarySummaryTasks. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummarySummaryTasks. - - :param kind: The kind of this TemplateSummarySummaryTasks. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummarySummaryTasks. - - :return: The template_meta_name of this TemplateSummarySummaryTasks. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummarySummaryTasks. - - :param template_meta_name: The template_meta_name of this TemplateSummarySummaryTasks. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def id(self): - """Get the id of this TemplateSummarySummaryTasks. - - :return: The id of this TemplateSummarySummaryTasks. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummarySummaryTasks. - - :param id: The id of this TemplateSummarySummaryTasks. - :type: str - """ # noqa: E501 - self._id = id - - @property - def name(self): - """Get the name of this TemplateSummarySummaryTasks. - - :return: The name of this TemplateSummarySummaryTasks. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateSummarySummaryTasks. - - :param name: The name of this TemplateSummarySummaryTasks. - :type: str - """ # noqa: E501 - self._name = name - - @property - def cron(self): - """Get the cron of this TemplateSummarySummaryTasks. - - :return: The cron of this TemplateSummarySummaryTasks. - :rtype: str - """ # noqa: E501 - return self._cron - - @cron.setter - def cron(self, cron): - """Set the cron of this TemplateSummarySummaryTasks. - - :param cron: The cron of this TemplateSummarySummaryTasks. - :type: str - """ # noqa: E501 - self._cron = cron - - @property - def description(self): - """Get the description of this TemplateSummarySummaryTasks. - - :return: The description of this TemplateSummarySummaryTasks. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TemplateSummarySummaryTasks. - - :param description: The description of this TemplateSummarySummaryTasks. - :type: str - """ # noqa: E501 - self._description = description - - @property - def every(self): - """Get the every of this TemplateSummarySummaryTasks. - - :return: The every of this TemplateSummarySummaryTasks. - :rtype: str - """ # noqa: E501 - return self._every - - @every.setter - def every(self, every): - """Set the every of this TemplateSummarySummaryTasks. - - :param every: The every of this TemplateSummarySummaryTasks. - :type: str - """ # noqa: E501 - self._every = every - - @property - def offset(self): - """Get the offset of this TemplateSummarySummaryTasks. - - :return: The offset of this TemplateSummarySummaryTasks. - :rtype: str - """ # noqa: E501 - return self._offset - - @offset.setter - def offset(self, offset): - """Set the offset of this TemplateSummarySummaryTasks. - - :param offset: The offset of this TemplateSummarySummaryTasks. - :type: str - """ # noqa: E501 - self._offset = offset - - @property - def query(self): - """Get the query of this TemplateSummarySummaryTasks. - - :return: The query of this TemplateSummarySummaryTasks. - :rtype: str - """ # noqa: E501 - return self._query - - @query.setter - def query(self, query): - """Set the query of this TemplateSummarySummaryTasks. - - :param query: The query of this TemplateSummarySummaryTasks. - :type: str - """ # noqa: E501 - self._query = query - - @property - def status(self): - """Get the status of this TemplateSummarySummaryTasks. - - :return: The status of this TemplateSummarySummaryTasks. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this TemplateSummarySummaryTasks. - - :param status: The status of this TemplateSummarySummaryTasks. - :type: str - """ # noqa: E501 - self._status = status - - @property - def env_references(self): - """Get the env_references of this TemplateSummarySummaryTasks. - - :return: The env_references of this TemplateSummarySummaryTasks. - :rtype: list[object] - """ # noqa: E501 - return self._env_references - - @env_references.setter - def env_references(self, env_references): - """Set the env_references of this TemplateSummarySummaryTasks. - - :param env_references: The env_references of this TemplateSummarySummaryTasks. - :type: list[object] - """ # noqa: E501 - self._env_references = env_references - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummarySummaryTasks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_variables.py b/frogpilot/third_party/influxdb_client/domain/template_summary_summary_variables.py deleted file mode 100644 index 458ea473d..000000000 --- a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_variables.py +++ /dev/null @@ -1,291 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class TemplateSummarySummaryVariables(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'kind': 'TemplateKind', - 'template_meta_name': 'str', - 'id': 'str', - 'org_id': 'str', - 'name': 'str', - 'description': 'str', - 'arguments': 'VariableProperties', - 'label_associations': 'list[TemplateSummaryLabel]', - 'env_references': 'list[object]' - } - - attribute_map = { - 'kind': 'kind', - 'template_meta_name': 'templateMetaName', - 'id': 'id', - 'org_id': 'orgID', - 'name': 'name', - 'description': 'description', - 'arguments': 'arguments', - 'label_associations': 'labelAssociations', - 'env_references': 'envReferences' - } - - def __init__(self, kind=None, template_meta_name=None, id=None, org_id=None, name=None, description=None, arguments=None, label_associations=None, env_references=None): # noqa: E501,D401,D403 - """TemplateSummarySummaryVariables - a model defined in OpenAPI.""" # noqa: E501 - self._kind = None - self._template_meta_name = None - self._id = None - self._org_id = None - self._name = None - self._description = None - self._arguments = None - self._label_associations = None - self._env_references = None - self.discriminator = None - - if kind is not None: - self.kind = kind - if template_meta_name is not None: - self.template_meta_name = template_meta_name - if id is not None: - self.id = id - if org_id is not None: - self.org_id = org_id - if name is not None: - self.name = name - if description is not None: - self.description = description - if arguments is not None: - self.arguments = arguments - if label_associations is not None: - self.label_associations = label_associations - if env_references is not None: - self.env_references = env_references - - @property - def kind(self): - """Get the kind of this TemplateSummarySummaryVariables. - - :return: The kind of this TemplateSummarySummaryVariables. - :rtype: TemplateKind - """ # noqa: E501 - return self._kind - - @kind.setter - def kind(self, kind): - """Set the kind of this TemplateSummarySummaryVariables. - - :param kind: The kind of this TemplateSummarySummaryVariables. - :type: TemplateKind - """ # noqa: E501 - self._kind = kind - - @property - def template_meta_name(self): - """Get the template_meta_name of this TemplateSummarySummaryVariables. - - :return: The template_meta_name of this TemplateSummarySummaryVariables. - :rtype: str - """ # noqa: E501 - return self._template_meta_name - - @template_meta_name.setter - def template_meta_name(self, template_meta_name): - """Set the template_meta_name of this TemplateSummarySummaryVariables. - - :param template_meta_name: The template_meta_name of this TemplateSummarySummaryVariables. - :type: str - """ # noqa: E501 - self._template_meta_name = template_meta_name - - @property - def id(self): - """Get the id of this TemplateSummarySummaryVariables. - - :return: The id of this TemplateSummarySummaryVariables. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this TemplateSummarySummaryVariables. - - :param id: The id of this TemplateSummarySummaryVariables. - :type: str - """ # noqa: E501 - self._id = id - - @property - def org_id(self): - """Get the org_id of this TemplateSummarySummaryVariables. - - :return: The org_id of this TemplateSummarySummaryVariables. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this TemplateSummarySummaryVariables. - - :param org_id: The org_id of this TemplateSummarySummaryVariables. - :type: str - """ # noqa: E501 - self._org_id = org_id - - @property - def name(self): - """Get the name of this TemplateSummarySummaryVariables. - - :return: The name of this TemplateSummarySummaryVariables. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this TemplateSummarySummaryVariables. - - :param name: The name of this TemplateSummarySummaryVariables. - :type: str - """ # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this TemplateSummarySummaryVariables. - - :return: The description of this TemplateSummarySummaryVariables. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this TemplateSummarySummaryVariables. - - :param description: The description of this TemplateSummarySummaryVariables. - :type: str - """ # noqa: E501 - self._description = description - - @property - def arguments(self): - """Get the arguments of this TemplateSummarySummaryVariables. - - :return: The arguments of this TemplateSummarySummaryVariables. - :rtype: VariableProperties - """ # noqa: E501 - return self._arguments - - @arguments.setter - def arguments(self, arguments): - """Set the arguments of this TemplateSummarySummaryVariables. - - :param arguments: The arguments of this TemplateSummarySummaryVariables. - :type: VariableProperties - """ # noqa: E501 - self._arguments = arguments - - @property - def label_associations(self): - """Get the label_associations of this TemplateSummarySummaryVariables. - - :return: The label_associations of this TemplateSummarySummaryVariables. - :rtype: list[TemplateSummaryLabel] - """ # noqa: E501 - return self._label_associations - - @label_associations.setter - def label_associations(self, label_associations): - """Set the label_associations of this TemplateSummarySummaryVariables. - - :param label_associations: The label_associations of this TemplateSummarySummaryVariables. - :type: list[TemplateSummaryLabel] - """ # noqa: E501 - self._label_associations = label_associations - - @property - def env_references(self): - """Get the env_references of this TemplateSummarySummaryVariables. - - :return: The env_references of this TemplateSummarySummaryVariables. - :rtype: list[object] - """ # noqa: E501 - return self._env_references - - @env_references.setter - def env_references(self, env_references): - """Set the env_references of this TemplateSummarySummaryVariables. - - :param env_references: The env_references of this TemplateSummarySummaryVariables. - :type: list[object] - """ # noqa: E501 - self._env_references = env_references - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TemplateSummarySummaryVariables): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/test_statement.py b/frogpilot/third_party/influxdb_client/domain/test_statement.py deleted file mode 100644 index e95753659..000000000 --- a/frogpilot/third_party/influxdb_client/domain/test_statement.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.statement import Statement - - -class TestStatement(Statement): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'assignment': 'VariableAssignment' - } - - attribute_map = { - 'type': 'type', - 'assignment': 'assignment' - } - - def __init__(self, type=None, assignment=None): # noqa: E501,D401,D403 - """TestStatement - a model defined in OpenAPI.""" # noqa: E501 - Statement.__init__(self) # noqa: E501 - - self._type = None - self._assignment = None - self.discriminator = None - - if type is not None: - self.type = type - if assignment is not None: - self.assignment = assignment - - @property - def type(self): - """Get the type of this TestStatement. - - Type of AST node - - :return: The type of this TestStatement. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this TestStatement. - - Type of AST node - - :param type: The type of this TestStatement. - :type: str - """ # noqa: E501 - self._type = type - - @property - def assignment(self): - """Get the assignment of this TestStatement. - - :return: The assignment of this TestStatement. - :rtype: VariableAssignment - """ # noqa: E501 - return self._assignment - - @assignment.setter - def assignment(self, assignment): - """Set the assignment of this TestStatement. - - :param assignment: The assignment of this TestStatement. - :type: VariableAssignment - """ # noqa: E501 - self._assignment = assignment - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, TestStatement): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/threshold.py b/frogpilot/third_party/influxdb_client/domain/threshold.py deleted file mode 100644 index 0999dc79c..000000000 --- a/frogpilot/third_party/influxdb_client/domain/threshold.py +++ /dev/null @@ -1,120 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Threshold(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - } - - attribute_map = { - 'type': 'type', - } - - discriminator_value_class_map = { - 'greater': 'GreaterThreshold', - 'lesser': 'LesserThreshold', - 'range': 'RangeThreshold' - } - - def __init__(self, type=None): # noqa: E501,D401,D403 - """Threshold - a model defined in OpenAPI.""" # noqa: E501 - self._type = None - self.discriminator = 'type' - - self.type = type - - @property - def type(self): - """Get the type of this Threshold. - - :return: The type of this Threshold. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this Threshold. - - :param type: The type of this Threshold. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - def get_real_child_model(self, data): - """Return the real base class specified by the discriminator.""" - discriminator_key = self.attribute_map[self.discriminator] - discriminator_value = data[discriminator_key] - return self.discriminator_value_class_map.get(discriminator_value) - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Threshold): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/threshold_base.py b/frogpilot/third_party/influxdb_client/domain/threshold_base.py deleted file mode 100644 index dad715ca0..000000000 --- a/frogpilot/third_party/influxdb_client/domain/threshold_base.py +++ /dev/null @@ -1,134 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ThresholdBase(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'level': 'CheckStatusLevel', - 'all_values': 'bool' - } - - attribute_map = { - 'level': 'level', - 'all_values': 'allValues' - } - - def __init__(self, level=None, all_values=None): # noqa: E501,D401,D403 - """ThresholdBase - a model defined in OpenAPI.""" # noqa: E501 - self._level = None - self._all_values = None - self.discriminator = None - - if level is not None: - self.level = level - if all_values is not None: - self.all_values = all_values - - @property - def level(self): - """Get the level of this ThresholdBase. - - :return: The level of this ThresholdBase. - :rtype: CheckStatusLevel - """ # noqa: E501 - return self._level - - @level.setter - def level(self, level): - """Set the level of this ThresholdBase. - - :param level: The level of this ThresholdBase. - :type: CheckStatusLevel - """ # noqa: E501 - self._level = level - - @property - def all_values(self): - """Get the all_values of this ThresholdBase. - - If true, only alert if all values meet threshold. - - :return: The all_values of this ThresholdBase. - :rtype: bool - """ # noqa: E501 - return self._all_values - - @all_values.setter - def all_values(self, all_values): - """Set the all_values of this ThresholdBase. - - If true, only alert if all values meet threshold. - - :param all_values: The all_values of this ThresholdBase. - :type: bool - """ # noqa: E501 - self._all_values = all_values - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ThresholdBase): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/threshold_check.py b/frogpilot/third_party/influxdb_client/domain/threshold_check.py deleted file mode 100644 index 30504cb02..000000000 --- a/frogpilot/third_party/influxdb_client/domain/threshold_check.py +++ /dev/null @@ -1,273 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.check_discriminator import CheckDiscriminator - - -class ThresholdCheck(CheckDiscriminator): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'thresholds': 'list[Threshold]', - 'every': 'str', - 'offset': 'str', - 'tags': 'list[object]', - 'status_message_template': 'str', - 'id': 'str', - 'name': 'str', - 'org_id': 'str', - 'task_id': 'str', - 'owner_id': 'str', - 'created_at': 'datetime', - 'updated_at': 'datetime', - 'query': 'DashboardQuery', - 'status': 'TaskStatusType', - 'description': 'str', - 'latest_completed': 'datetime', - 'last_run_status': 'str', - 'last_run_error': 'str', - 'labels': 'list[Label]', - 'links': 'CheckBaseLinks' - } - - attribute_map = { - 'type': 'type', - 'thresholds': 'thresholds', - 'every': 'every', - 'offset': 'offset', - 'tags': 'tags', - 'status_message_template': 'statusMessageTemplate', - 'id': 'id', - 'name': 'name', - 'org_id': 'orgID', - 'task_id': 'taskID', - 'owner_id': 'ownerID', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt', - 'query': 'query', - 'status': 'status', - 'description': 'description', - 'latest_completed': 'latestCompleted', - 'last_run_status': 'lastRunStatus', - 'last_run_error': 'lastRunError', - 'labels': 'labels', - 'links': 'links' - } - - def __init__(self, type="threshold", thresholds=None, every=None, offset=None, tags=None, status_message_template=None, id=None, name=None, org_id=None, task_id=None, owner_id=None, created_at=None, updated_at=None, query=None, status=None, description=None, latest_completed=None, last_run_status=None, last_run_error=None, labels=None, links=None): # noqa: E501,D401,D403 - """ThresholdCheck - a model defined in OpenAPI.""" # noqa: E501 - CheckDiscriminator.__init__(self, id=id, name=name, org_id=org_id, task_id=task_id, owner_id=owner_id, created_at=created_at, updated_at=updated_at, query=query, status=status, description=description, latest_completed=latest_completed, last_run_status=last_run_status, last_run_error=last_run_error, labels=labels, links=links) # noqa: E501 - - self._type = None - self._thresholds = None - self._every = None - self._offset = None - self._tags = None - self._status_message_template = None - self.discriminator = None - - self.type = type - if thresholds is not None: - self.thresholds = thresholds - if every is not None: - self.every = every - if offset is not None: - self.offset = offset - if tags is not None: - self.tags = tags - if status_message_template is not None: - self.status_message_template = status_message_template - - @property - def type(self): - """Get the type of this ThresholdCheck. - - :return: The type of this ThresholdCheck. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this ThresholdCheck. - - :param type: The type of this ThresholdCheck. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def thresholds(self): - """Get the thresholds of this ThresholdCheck. - - :return: The thresholds of this ThresholdCheck. - :rtype: list[Threshold] - """ # noqa: E501 - return self._thresholds - - @thresholds.setter - def thresholds(self, thresholds): - """Set the thresholds of this ThresholdCheck. - - :param thresholds: The thresholds of this ThresholdCheck. - :type: list[Threshold] - """ # noqa: E501 - self._thresholds = thresholds - - @property - def every(self): - """Get the every of this ThresholdCheck. - - Check repetition interval. - - :return: The every of this ThresholdCheck. - :rtype: str - """ # noqa: E501 - return self._every - - @every.setter - def every(self, every): - """Set the every of this ThresholdCheck. - - Check repetition interval. - - :param every: The every of this ThresholdCheck. - :type: str - """ # noqa: E501 - self._every = every - - @property - def offset(self): - """Get the offset of this ThresholdCheck. - - Duration to delay after the schedule, before executing check. - - :return: The offset of this ThresholdCheck. - :rtype: str - """ # noqa: E501 - return self._offset - - @offset.setter - def offset(self, offset): - """Set the offset of this ThresholdCheck. - - Duration to delay after the schedule, before executing check. - - :param offset: The offset of this ThresholdCheck. - :type: str - """ # noqa: E501 - self._offset = offset - - @property - def tags(self): - """Get the tags of this ThresholdCheck. - - List of tags to write to each status. - - :return: The tags of this ThresholdCheck. - :rtype: list[object] - """ # noqa: E501 - return self._tags - - @tags.setter - def tags(self, tags): - """Set the tags of this ThresholdCheck. - - List of tags to write to each status. - - :param tags: The tags of this ThresholdCheck. - :type: list[object] - """ # noqa: E501 - self._tags = tags - - @property - def status_message_template(self): - """Get the status_message_template of this ThresholdCheck. - - The template used to generate and write a status message. - - :return: The status_message_template of this ThresholdCheck. - :rtype: str - """ # noqa: E501 - return self._status_message_template - - @status_message_template.setter - def status_message_template(self, status_message_template): - """Set the status_message_template of this ThresholdCheck. - - The template used to generate and write a status message. - - :param status_message_template: The status_message_template of this ThresholdCheck. - :type: str - """ # noqa: E501 - self._status_message_template = status_message_template - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ThresholdCheck): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/unary_expression.py b/frogpilot/third_party/influxdb_client/domain/unary_expression.py deleted file mode 100644 index 0d6fae08a..000000000 --- a/frogpilot/third_party/influxdb_client/domain/unary_expression.py +++ /dev/null @@ -1,161 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class UnaryExpression(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'operator': 'str', - 'argument': 'Expression' - } - - attribute_map = { - 'type': 'type', - 'operator': 'operator', - 'argument': 'argument' - } - - def __init__(self, type=None, operator=None, argument=None): # noqa: E501,D401,D403 - """UnaryExpression - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._operator = None - self._argument = None - self.discriminator = None - - if type is not None: - self.type = type - if operator is not None: - self.operator = operator - if argument is not None: - self.argument = argument - - @property - def type(self): - """Get the type of this UnaryExpression. - - Type of AST node - - :return: The type of this UnaryExpression. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this UnaryExpression. - - Type of AST node - - :param type: The type of this UnaryExpression. - :type: str - """ # noqa: E501 - self._type = type - - @property - def operator(self): - """Get the operator of this UnaryExpression. - - :return: The operator of this UnaryExpression. - :rtype: str - """ # noqa: E501 - return self._operator - - @operator.setter - def operator(self, operator): - """Set the operator of this UnaryExpression. - - :param operator: The operator of this UnaryExpression. - :type: str - """ # noqa: E501 - self._operator = operator - - @property - def argument(self): - """Get the argument of this UnaryExpression. - - :return: The argument of this UnaryExpression. - :rtype: Expression - """ # noqa: E501 - return self._argument - - @argument.setter - def argument(self, argument): - """Set the argument of this UnaryExpression. - - :param argument: The argument of this UnaryExpression. - :type: Expression - """ # noqa: E501 - self._argument = argument - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, UnaryExpression): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/unsigned_integer_literal.py b/frogpilot/third_party/influxdb_client/domain/unsigned_integer_literal.py deleted file mode 100644 index b7692a15f..000000000 --- a/frogpilot/third_party/influxdb_client/domain/unsigned_integer_literal.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.expression import Expression - - -class UnsignedIntegerLiteral(Expression): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'value': 'str' - } - - attribute_map = { - 'type': 'type', - 'value': 'value' - } - - def __init__(self, type=None, value=None): # noqa: E501,D401,D403 - """UnsignedIntegerLiteral - a model defined in OpenAPI.""" # noqa: E501 - Expression.__init__(self) # noqa: E501 - - self._type = None - self._value = None - self.discriminator = None - - if type is not None: - self.type = type - if value is not None: - self.value = value - - @property - def type(self): - """Get the type of this UnsignedIntegerLiteral. - - Type of AST node - - :return: The type of this UnsignedIntegerLiteral. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this UnsignedIntegerLiteral. - - Type of AST node - - :param type: The type of this UnsignedIntegerLiteral. - :type: str - """ # noqa: E501 - self._type = type - - @property - def value(self): - """Get the value of this UnsignedIntegerLiteral. - - :return: The value of this UnsignedIntegerLiteral. - :rtype: str - """ # noqa: E501 - return self._value - - @value.setter - def value(self, value): - """Set the value of this UnsignedIntegerLiteral. - - :param value: The value of this UnsignedIntegerLiteral. - :type: str - """ # noqa: E501 - self._value = value - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, UnsignedIntegerLiteral): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/user.py b/frogpilot/third_party/influxdb_client/domain/user.py deleted file mode 100644 index 6b7a28c68..000000000 --- a/frogpilot/third_party/influxdb_client/domain/user.py +++ /dev/null @@ -1,166 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class User(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'name': 'str', - 'status': 'str' - } - - attribute_map = { - 'id': 'id', - 'name': 'name', - 'status': 'status' - } - - def __init__(self, id=None, name=None, status='active'): # noqa: E501,D401,D403 - """User - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._name = None - self._status = None - self.discriminator = None - - if id is not None: - self.id = id - self.name = name - if status is not None: - self.status = status - - @property - def id(self): - """Get the id of this User. - - The user ID. - - :return: The id of this User. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this User. - - The user ID. - - :param id: The id of this User. - :type: str - """ # noqa: E501 - self._id = id - - @property - def name(self): - """Get the name of this User. - - The user name. - - :return: The name of this User. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this User. - - The user name. - - :param name: The name of this User. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def status(self): - """Get the status of this User. - - If `inactive`, the user is inactive. Default is `active`. - - :return: The status of this User. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this User. - - If `inactive`, the user is inactive. Default is `active`. - - :param status: The status of this User. - :type: str - """ # noqa: E501 - self._status = status - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, User): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/user_response.py b/frogpilot/third_party/influxdb_client/domain/user_response.py deleted file mode 100644 index a4a163f78..000000000 --- a/frogpilot/third_party/influxdb_client/domain/user_response.py +++ /dev/null @@ -1,189 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class UserResponse(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'name': 'str', - 'status': 'str', - 'links': 'UserResponseLinks' - } - - attribute_map = { - 'id': 'id', - 'name': 'name', - 'status': 'status', - 'links': 'links' - } - - def __init__(self, id=None, name=None, status='active', links=None): # noqa: E501,D401,D403 - """UserResponse - a model defined in OpenAPI.""" # noqa: E501 - self._id = None - self._name = None - self._status = None - self._links = None - self.discriminator = None - - if id is not None: - self.id = id - self.name = name - if status is not None: - self.status = status - if links is not None: - self.links = links - - @property - def id(self): - """Get the id of this UserResponse. - - The user ID. - - :return: The id of this UserResponse. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this UserResponse. - - The user ID. - - :param id: The id of this UserResponse. - :type: str - """ # noqa: E501 - self._id = id - - @property - def name(self): - """Get the name of this UserResponse. - - The user name. - - :return: The name of this UserResponse. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this UserResponse. - - The user name. - - :param name: The name of this UserResponse. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def status(self): - """Get the status of this UserResponse. - - The status of a user. An inactive user can't read or write resources. - - :return: The status of this UserResponse. - :rtype: str - """ # noqa: E501 - return self._status - - @status.setter - def status(self, status): - """Set the status of this UserResponse. - - The status of a user. An inactive user can't read or write resources. - - :param status: The status of this UserResponse. - :type: str - """ # noqa: E501 - self._status = status - - @property - def links(self): - """Get the links of this UserResponse. - - :return: The links of this UserResponse. - :rtype: UserResponseLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this UserResponse. - - :param links: The links of this UserResponse. - :type: UserResponseLinks - """ # noqa: E501 - self._links = links - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, UserResponse): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/user_response_links.py b/frogpilot/third_party/influxdb_client/domain/user_response_links.py deleted file mode 100644 index bf825cf2b..000000000 --- a/frogpilot/third_party/influxdb_client/domain/user_response_links.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class UserResponseLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str' - } - - attribute_map = { - '_self': 'self' - } - - def __init__(self, _self=None): # noqa: E501,D401,D403 - """UserResponseLinks - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self.discriminator = None - - if _self is not None: - self._self = _self - - @property - def _self(self): - """Get the _self of this UserResponseLinks. - - :return: The _self of this UserResponseLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this UserResponseLinks. - - :param _self: The _self of this UserResponseLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, UserResponseLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/users.py b/frogpilot/third_party/influxdb_client/domain/users.py deleted file mode 100644 index 067116c98..000000000 --- a/frogpilot/third_party/influxdb_client/domain/users.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Users(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'ResourceMembersLinks', - 'users': 'list[UserResponse]' - } - - attribute_map = { - 'links': 'links', - 'users': 'users' - } - - def __init__(self, links=None, users=None): # noqa: E501,D401,D403 - """Users - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._users = None - self.discriminator = None - - if links is not None: - self.links = links - if users is not None: - self.users = users - - @property - def links(self): - """Get the links of this Users. - - :return: The links of this Users. - :rtype: ResourceMembersLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Users. - - :param links: The links of this Users. - :type: ResourceMembersLinks - """ # noqa: E501 - self._links = links - - @property - def users(self): - """Get the users of this Users. - - :return: The users of this Users. - :rtype: list[UserResponse] - """ # noqa: E501 - return self._users - - @users.setter - def users(self, users): - """Set the users of this Users. - - :param users: The users of this Users. - :type: list[UserResponse] - """ # noqa: E501 - self._users = users - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Users): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/variable.py b/frogpilot/third_party/influxdb_client/domain/variable.py deleted file mode 100644 index 4c1b2800f..000000000 --- a/frogpilot/third_party/influxdb_client/domain/variable.py +++ /dev/null @@ -1,317 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Variable(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'VariableLinks', - 'id': 'str', - 'org_id': 'str', - 'name': 'str', - 'description': 'str', - 'selected': 'list[str]', - 'labels': 'list[Label]', - 'arguments': 'VariableProperties', - 'created_at': 'datetime', - 'updated_at': 'datetime' - } - - attribute_map = { - 'links': 'links', - 'id': 'id', - 'org_id': 'orgID', - 'name': 'name', - 'description': 'description', - 'selected': 'selected', - 'labels': 'labels', - 'arguments': 'arguments', - 'created_at': 'createdAt', - 'updated_at': 'updatedAt' - } - - def __init__(self, links=None, id=None, org_id=None, name=None, description=None, selected=None, labels=None, arguments=None, created_at=None, updated_at=None): # noqa: E501,D401,D403 - """Variable - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._id = None - self._org_id = None - self._name = None - self._description = None - self._selected = None - self._labels = None - self._arguments = None - self._created_at = None - self._updated_at = None - self.discriminator = None - - if links is not None: - self.links = links - if id is not None: - self.id = id - self.org_id = org_id - self.name = name - if description is not None: - self.description = description - if selected is not None: - self.selected = selected - if labels is not None: - self.labels = labels - self.arguments = arguments - if created_at is not None: - self.created_at = created_at - if updated_at is not None: - self.updated_at = updated_at - - @property - def links(self): - """Get the links of this Variable. - - :return: The links of this Variable. - :rtype: VariableLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Variable. - - :param links: The links of this Variable. - :type: VariableLinks - """ # noqa: E501 - self._links = links - - @property - def id(self): - """Get the id of this Variable. - - :return: The id of this Variable. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this Variable. - - :param id: The id of this Variable. - :type: str - """ # noqa: E501 - self._id = id - - @property - def org_id(self): - """Get the org_id of this Variable. - - :return: The org_id of this Variable. - :rtype: str - """ # noqa: E501 - return self._org_id - - @org_id.setter - def org_id(self, org_id): - """Set the org_id of this Variable. - - :param org_id: The org_id of this Variable. - :type: str - """ # noqa: E501 - if org_id is None: - raise ValueError("Invalid value for `org_id`, must not be `None`") # noqa: E501 - self._org_id = org_id - - @property - def name(self): - """Get the name of this Variable. - - :return: The name of this Variable. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this Variable. - - :param name: The name of this Variable. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def description(self): - """Get the description of this Variable. - - :return: The description of this Variable. - :rtype: str - """ # noqa: E501 - return self._description - - @description.setter - def description(self, description): - """Set the description of this Variable. - - :param description: The description of this Variable. - :type: str - """ # noqa: E501 - self._description = description - - @property - def selected(self): - """Get the selected of this Variable. - - :return: The selected of this Variable. - :rtype: list[str] - """ # noqa: E501 - return self._selected - - @selected.setter - def selected(self, selected): - """Set the selected of this Variable. - - :param selected: The selected of this Variable. - :type: list[str] - """ # noqa: E501 - self._selected = selected - - @property - def labels(self): - """Get the labels of this Variable. - - :return: The labels of this Variable. - :rtype: list[Label] - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this Variable. - - :param labels: The labels of this Variable. - :type: list[Label] - """ # noqa: E501 - self._labels = labels - - @property - def arguments(self): - """Get the arguments of this Variable. - - :return: The arguments of this Variable. - :rtype: VariableProperties - """ # noqa: E501 - return self._arguments - - @arguments.setter - def arguments(self, arguments): - """Set the arguments of this Variable. - - :param arguments: The arguments of this Variable. - :type: VariableProperties - """ # noqa: E501 - if arguments is None: - raise ValueError("Invalid value for `arguments`, must not be `None`") # noqa: E501 - self._arguments = arguments - - @property - def created_at(self): - """Get the created_at of this Variable. - - :return: The created_at of this Variable. - :rtype: datetime - """ # noqa: E501 - return self._created_at - - @created_at.setter - def created_at(self, created_at): - """Set the created_at of this Variable. - - :param created_at: The created_at of this Variable. - :type: datetime - """ # noqa: E501 - self._created_at = created_at - - @property - def updated_at(self): - """Get the updated_at of this Variable. - - :return: The updated_at of this Variable. - :rtype: datetime - """ # noqa: E501 - return self._updated_at - - @updated_at.setter - def updated_at(self, updated_at): - """Set the updated_at of this Variable. - - :param updated_at: The updated_at of this Variable. - :type: datetime - """ # noqa: E501 - self._updated_at = updated_at - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Variable): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/variable_assignment.py b/frogpilot/third_party/influxdb_client/domain/variable_assignment.py deleted file mode 100644 index c13e54939..000000000 --- a/frogpilot/third_party/influxdb_client/domain/variable_assignment.py +++ /dev/null @@ -1,161 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.statement import Statement - - -class VariableAssignment(Statement): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'str', - 'id': 'Identifier', - 'init': 'Expression' - } - - attribute_map = { - 'type': 'type', - 'id': 'id', - 'init': 'init' - } - - def __init__(self, type=None, id=None, init=None): # noqa: E501,D401,D403 - """VariableAssignment - a model defined in OpenAPI.""" # noqa: E501 - Statement.__init__(self) # noqa: E501 - - self._type = None - self._id = None - self._init = None - self.discriminator = None - - if type is not None: - self.type = type - if id is not None: - self.id = id - if init is not None: - self.init = init - - @property - def type(self): - """Get the type of this VariableAssignment. - - Type of AST node - - :return: The type of this VariableAssignment. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this VariableAssignment. - - Type of AST node - - :param type: The type of this VariableAssignment. - :type: str - """ # noqa: E501 - self._type = type - - @property - def id(self): - """Get the id of this VariableAssignment. - - :return: The id of this VariableAssignment. - :rtype: Identifier - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this VariableAssignment. - - :param id: The id of this VariableAssignment. - :type: Identifier - """ # noqa: E501 - self._id = id - - @property - def init(self): - """Get the init of this VariableAssignment. - - :return: The init of this VariableAssignment. - :rtype: Expression - """ # noqa: E501 - return self._init - - @init.setter - def init(self, init): - """Set the init of this VariableAssignment. - - :param init: The init of this VariableAssignment. - :type: Expression - """ # noqa: E501 - self._init = init - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, VariableAssignment): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/variable_links.py b/frogpilot/third_party/influxdb_client/domain/variable_links.py deleted file mode 100644 index 44a8237d1..000000000 --- a/frogpilot/third_party/influxdb_client/domain/variable_links.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class VariableLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str', - 'org': 'str', - 'labels': 'str' - } - - attribute_map = { - '_self': 'self', - 'org': 'org', - 'labels': 'labels' - } - - def __init__(self, _self=None, org=None, labels=None): # noqa: E501,D401,D403 - """VariableLinks - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self._org = None - self._labels = None - self.discriminator = None - - if _self is not None: - self._self = _self - if org is not None: - self.org = org - if labels is not None: - self.labels = labels - - @property - def _self(self): - """Get the _self of this VariableLinks. - - :return: The _self of this VariableLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this VariableLinks. - - :param _self: The _self of this VariableLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - @property - def org(self): - """Get the org of this VariableLinks. - - :return: The org of this VariableLinks. - :rtype: str - """ # noqa: E501 - return self._org - - @org.setter - def org(self, org): - """Set the org of this VariableLinks. - - :param org: The org of this VariableLinks. - :type: str - """ # noqa: E501 - self._org = org - - @property - def labels(self): - """Get the labels of this VariableLinks. - - :return: The labels of this VariableLinks. - :rtype: str - """ # noqa: E501 - return self._labels - - @labels.setter - def labels(self, labels): - """Set the labels of this VariableLinks. - - :param labels: The labels of this VariableLinks. - :type: str - """ # noqa: E501 - self._labels = labels - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, VariableLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/variable_properties.py b/frogpilot/third_party/influxdb_client/domain/variable_properties.py deleted file mode 100644 index c9d9d1532..000000000 --- a/frogpilot/third_party/influxdb_client/domain/variable_properties.py +++ /dev/null @@ -1,82 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class VariableProperties(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """VariableProperties - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, VariableProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/variables.py b/frogpilot/third_party/influxdb_client/domain/variables.py deleted file mode 100644 index 50ebbf3c6..000000000 --- a/frogpilot/third_party/influxdb_client/domain/variables.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Variables(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'variables': 'list[Variable]' - } - - attribute_map = { - 'variables': 'variables' - } - - def __init__(self, variables=None): # noqa: E501,D401,D403 - """Variables - a model defined in OpenAPI.""" # noqa: E501 - self._variables = None - self.discriminator = None - - if variables is not None: - self.variables = variables - - @property - def variables(self): - """Get the variables of this Variables. - - :return: The variables of this Variables. - :rtype: list[Variable] - """ # noqa: E501 - return self._variables - - @variables.setter - def variables(self, variables): - """Set the variables of this Variables. - - :param variables: The variables of this Variables. - :type: list[Variable] - """ # noqa: E501 - self._variables = variables - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Variables): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/view.py b/frogpilot/third_party/influxdb_client/domain/view.py deleted file mode 100644 index 567125364..000000000 --- a/frogpilot/third_party/influxdb_client/domain/view.py +++ /dev/null @@ -1,178 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class View(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'ViewLinks', - 'id': 'str', - 'name': 'str', - 'properties': 'ViewProperties' - } - - attribute_map = { - 'links': 'links', - 'id': 'id', - 'name': 'name', - 'properties': 'properties' - } - - def __init__(self, links=None, id=None, name=None, properties=None): # noqa: E501,D401,D403 - """View - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._id = None - self._name = None - self._properties = None - self.discriminator = None - - if links is not None: - self.links = links - if id is not None: - self.id = id - self.name = name - self.properties = properties - - @property - def links(self): - """Get the links of this View. - - :return: The links of this View. - :rtype: ViewLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this View. - - :param links: The links of this View. - :type: ViewLinks - """ # noqa: E501 - self._links = links - - @property - def id(self): - """Get the id of this View. - - :return: The id of this View. - :rtype: str - """ # noqa: E501 - return self._id - - @id.setter - def id(self, id): - """Set the id of this View. - - :param id: The id of this View. - :type: str - """ # noqa: E501 - self._id = id - - @property - def name(self): - """Get the name of this View. - - :return: The name of this View. - :rtype: str - """ # noqa: E501 - return self._name - - @name.setter - def name(self, name): - """Set the name of this View. - - :param name: The name of this View. - :type: str - """ # noqa: E501 - if name is None: - raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 - self._name = name - - @property - def properties(self): - """Get the properties of this View. - - :return: The properties of this View. - :rtype: ViewProperties - """ # noqa: E501 - return self._properties - - @properties.setter - def properties(self, properties): - """Set the properties of this View. - - :param properties: The properties of this View. - :type: ViewProperties - """ # noqa: E501 - if properties is None: - raise ValueError("Invalid value for `properties`, must not be `None`") # noqa: E501 - self._properties = properties - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, View): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/view_links.py b/frogpilot/third_party/influxdb_client/domain/view_links.py deleted file mode 100644 index 8705bc1f4..000000000 --- a/frogpilot/third_party/influxdb_client/domain/view_links.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ViewLinks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - '_self': 'str' - } - - attribute_map = { - '_self': 'self' - } - - def __init__(self, _self=None): # noqa: E501,D401,D403 - """ViewLinks - a model defined in OpenAPI.""" # noqa: E501 - self.__self = None - self.discriminator = None - - if _self is not None: - self._self = _self - - @property - def _self(self): - """Get the _self of this ViewLinks. - - :return: The _self of this ViewLinks. - :rtype: str - """ # noqa: E501 - return self.__self - - @_self.setter - def _self(self, _self): - """Set the _self of this ViewLinks. - - :param _self: The _self of this ViewLinks. - :type: str - """ # noqa: E501 - self.__self = _self - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ViewLinks): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/view_properties.py b/frogpilot/third_party/influxdb_client/domain/view_properties.py deleted file mode 100644 index e08c354ae..000000000 --- a/frogpilot/third_party/influxdb_client/domain/view_properties.py +++ /dev/null @@ -1,82 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class ViewProperties(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """ViewProperties - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, ViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/views.py b/frogpilot/third_party/influxdb_client/domain/views.py deleted file mode 100644 index a9bbb6490..000000000 --- a/frogpilot/third_party/influxdb_client/domain/views.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class Views(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'links': 'ViewLinks', - 'views': 'list[View]' - } - - attribute_map = { - 'links': 'links', - 'views': 'views' - } - - def __init__(self, links=None, views=None): # noqa: E501,D401,D403 - """Views - a model defined in OpenAPI.""" # noqa: E501 - self._links = None - self._views = None - self.discriminator = None - - if links is not None: - self.links = links - if views is not None: - self.views = views - - @property - def links(self): - """Get the links of this Views. - - :return: The links of this Views. - :rtype: ViewLinks - """ # noqa: E501 - return self._links - - @links.setter - def links(self, links): - """Set the links of this Views. - - :param links: The links of this Views. - :type: ViewLinks - """ # noqa: E501 - self._links = links - - @property - def views(self): - """Get the views of this Views. - - :return: The views of this Views. - :rtype: list[View] - """ # noqa: E501 - return self._views - - @views.setter - def views(self, views): - """Set the views of this Views. - - :param views: The views of this Views. - :type: list[View] - """ # noqa: E501 - self._views = views - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, Views): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/write_precision.py b/frogpilot/third_party/influxdb_client/domain/write_precision.py deleted file mode 100644 index 41a0db934..000000000 --- a/frogpilot/third_party/influxdb_client/domain/write_precision.py +++ /dev/null @@ -1,90 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class WritePrecision(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - MS = "ms" - S = "s" - US = "us" - NS = "ns" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """WritePrecision - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, WritePrecision): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/xy_geom.py b/frogpilot/third_party/influxdb_client/domain/xy_geom.py deleted file mode 100644 index 367806b4e..000000000 --- a/frogpilot/third_party/influxdb_client/domain/xy_geom.py +++ /dev/null @@ -1,93 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - - -class XYGeom(object): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - allowed enum values - """ - LINE = "line" - STEP = "step" - STACKED = "stacked" - BAR = "bar" - MONOTONEX = "monotoneX" - STEPBEFORE = "stepBefore" - STEPAFTER = "stepAfter" - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self): # noqa: E501,D401,D403 - """XYGeom - a model defined in OpenAPI.""" # noqa: E501 self.discriminator = None - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, XYGeom): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/domain/xy_view_properties.py b/frogpilot/third_party/influxdb_client/domain/xy_view_properties.py deleted file mode 100644 index 817967c21..000000000 --- a/frogpilot/third_party/influxdb_client/domain/xy_view_properties.py +++ /dev/null @@ -1,776 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -import pprint -import re # noqa: F401 - -from influxdb_client.domain.view_properties import ViewProperties - - -class XYViewProperties(ViewProperties): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'adaptive_zoom_hide': 'bool', - 'time_format': 'str', - 'type': 'str', - 'queries': 'list[DashboardQuery]', - 'colors': 'list[DashboardColor]', - 'color_mapping': 'dict(str, str)', - 'shape': 'str', - 'note': 'str', - 'show_note_when_empty': 'bool', - 'axes': 'Axes', - 'static_legend': 'StaticLegend', - 'x_column': 'str', - 'generate_x_axis_ticks': 'list[str]', - 'x_total_ticks': 'int', - 'x_tick_start': 'float', - 'x_tick_step': 'float', - 'y_column': 'str', - 'generate_y_axis_ticks': 'list[str]', - 'y_total_ticks': 'int', - 'y_tick_start': 'float', - 'y_tick_step': 'float', - 'shade_below': 'bool', - 'hover_dimension': 'str', - 'position': 'str', - 'geom': 'XYGeom', - 'legend_colorize_rows': 'bool', - 'legend_hide': 'bool', - 'legend_opacity': 'float', - 'legend_orientation_threshold': 'int' - } - - attribute_map = { - 'adaptive_zoom_hide': 'adaptiveZoomHide', - 'time_format': 'timeFormat', - 'type': 'type', - 'queries': 'queries', - 'colors': 'colors', - 'color_mapping': 'colorMapping', - 'shape': 'shape', - 'note': 'note', - 'show_note_when_empty': 'showNoteWhenEmpty', - 'axes': 'axes', - 'static_legend': 'staticLegend', - 'x_column': 'xColumn', - 'generate_x_axis_ticks': 'generateXAxisTicks', - 'x_total_ticks': 'xTotalTicks', - 'x_tick_start': 'xTickStart', - 'x_tick_step': 'xTickStep', - 'y_column': 'yColumn', - 'generate_y_axis_ticks': 'generateYAxisTicks', - 'y_total_ticks': 'yTotalTicks', - 'y_tick_start': 'yTickStart', - 'y_tick_step': 'yTickStep', - 'shade_below': 'shadeBelow', - 'hover_dimension': 'hoverDimension', - 'position': 'position', - 'geom': 'geom', - 'legend_colorize_rows': 'legendColorizeRows', - 'legend_hide': 'legendHide', - 'legend_opacity': 'legendOpacity', - 'legend_orientation_threshold': 'legendOrientationThreshold' - } - - def __init__(self, adaptive_zoom_hide=None, time_format=None, type=None, queries=None, colors=None, color_mapping=None, shape=None, note=None, show_note_when_empty=None, axes=None, static_legend=None, x_column=None, generate_x_axis_ticks=None, x_total_ticks=None, x_tick_start=None, x_tick_step=None, y_column=None, generate_y_axis_ticks=None, y_total_ticks=None, y_tick_start=None, y_tick_step=None, shade_below=None, hover_dimension=None, position=None, geom=None, legend_colorize_rows=None, legend_hide=None, legend_opacity=None, legend_orientation_threshold=None): # noqa: E501,D401,D403 - """XYViewProperties - a model defined in OpenAPI.""" # noqa: E501 - ViewProperties.__init__(self) # noqa: E501 - - self._adaptive_zoom_hide = None - self._time_format = None - self._type = None - self._queries = None - self._colors = None - self._color_mapping = None - self._shape = None - self._note = None - self._show_note_when_empty = None - self._axes = None - self._static_legend = None - self._x_column = None - self._generate_x_axis_ticks = None - self._x_total_ticks = None - self._x_tick_start = None - self._x_tick_step = None - self._y_column = None - self._generate_y_axis_ticks = None - self._y_total_ticks = None - self._y_tick_start = None - self._y_tick_step = None - self._shade_below = None - self._hover_dimension = None - self._position = None - self._geom = None - self._legend_colorize_rows = None - self._legend_hide = None - self._legend_opacity = None - self._legend_orientation_threshold = None - self.discriminator = None - - if adaptive_zoom_hide is not None: - self.adaptive_zoom_hide = adaptive_zoom_hide - if time_format is not None: - self.time_format = time_format - self.type = type - self.queries = queries - self.colors = colors - if color_mapping is not None: - self.color_mapping = color_mapping - self.shape = shape - self.note = note - self.show_note_when_empty = show_note_when_empty - self.axes = axes - if static_legend is not None: - self.static_legend = static_legend - if x_column is not None: - self.x_column = x_column - if generate_x_axis_ticks is not None: - self.generate_x_axis_ticks = generate_x_axis_ticks - if x_total_ticks is not None: - self.x_total_ticks = x_total_ticks - if x_tick_start is not None: - self.x_tick_start = x_tick_start - if x_tick_step is not None: - self.x_tick_step = x_tick_step - if y_column is not None: - self.y_column = y_column - if generate_y_axis_ticks is not None: - self.generate_y_axis_ticks = generate_y_axis_ticks - if y_total_ticks is not None: - self.y_total_ticks = y_total_ticks - if y_tick_start is not None: - self.y_tick_start = y_tick_start - if y_tick_step is not None: - self.y_tick_step = y_tick_step - if shade_below is not None: - self.shade_below = shade_below - if hover_dimension is not None: - self.hover_dimension = hover_dimension - self.position = position - self.geom = geom - if legend_colorize_rows is not None: - self.legend_colorize_rows = legend_colorize_rows - if legend_hide is not None: - self.legend_hide = legend_hide - if legend_opacity is not None: - self.legend_opacity = legend_opacity - if legend_orientation_threshold is not None: - self.legend_orientation_threshold = legend_orientation_threshold - - @property - def adaptive_zoom_hide(self): - """Get the adaptive_zoom_hide of this XYViewProperties. - - :return: The adaptive_zoom_hide of this XYViewProperties. - :rtype: bool - """ # noqa: E501 - return self._adaptive_zoom_hide - - @adaptive_zoom_hide.setter - def adaptive_zoom_hide(self, adaptive_zoom_hide): - """Set the adaptive_zoom_hide of this XYViewProperties. - - :param adaptive_zoom_hide: The adaptive_zoom_hide of this XYViewProperties. - :type: bool - """ # noqa: E501 - self._adaptive_zoom_hide = adaptive_zoom_hide - - @property - def time_format(self): - """Get the time_format of this XYViewProperties. - - :return: The time_format of this XYViewProperties. - :rtype: str - """ # noqa: E501 - return self._time_format - - @time_format.setter - def time_format(self, time_format): - """Set the time_format of this XYViewProperties. - - :param time_format: The time_format of this XYViewProperties. - :type: str - """ # noqa: E501 - self._time_format = time_format - - @property - def type(self): - """Get the type of this XYViewProperties. - - :return: The type of this XYViewProperties. - :rtype: str - """ # noqa: E501 - return self._type - - @type.setter - def type(self, type): - """Set the type of this XYViewProperties. - - :param type: The type of this XYViewProperties. - :type: str - """ # noqa: E501 - if type is None: - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - self._type = type - - @property - def queries(self): - """Get the queries of this XYViewProperties. - - :return: The queries of this XYViewProperties. - :rtype: list[DashboardQuery] - """ # noqa: E501 - return self._queries - - @queries.setter - def queries(self, queries): - """Set the queries of this XYViewProperties. - - :param queries: The queries of this XYViewProperties. - :type: list[DashboardQuery] - """ # noqa: E501 - if queries is None: - raise ValueError("Invalid value for `queries`, must not be `None`") # noqa: E501 - self._queries = queries - - @property - def colors(self): - """Get the colors of this XYViewProperties. - - Colors define color encoding of data into a visualization - - :return: The colors of this XYViewProperties. - :rtype: list[DashboardColor] - """ # noqa: E501 - return self._colors - - @colors.setter - def colors(self, colors): - """Set the colors of this XYViewProperties. - - Colors define color encoding of data into a visualization - - :param colors: The colors of this XYViewProperties. - :type: list[DashboardColor] - """ # noqa: E501 - if colors is None: - raise ValueError("Invalid value for `colors`, must not be `None`") # noqa: E501 - self._colors = colors - - @property - def color_mapping(self): - """Get the color_mapping of this XYViewProperties. - - A color mapping is an object that maps time series data to a UI color scheme to allow the UI to render graphs consistent colors across reloads. - - :return: The color_mapping of this XYViewProperties. - :rtype: dict(str, str) - """ # noqa: E501 - return self._color_mapping - - @color_mapping.setter - def color_mapping(self, color_mapping): - """Set the color_mapping of this XYViewProperties. - - A color mapping is an object that maps time series data to a UI color scheme to allow the UI to render graphs consistent colors across reloads. - - :param color_mapping: The color_mapping of this XYViewProperties. - :type: dict(str, str) - """ # noqa: E501 - self._color_mapping = color_mapping - - @property - def shape(self): - """Get the shape of this XYViewProperties. - - :return: The shape of this XYViewProperties. - :rtype: str - """ # noqa: E501 - return self._shape - - @shape.setter - def shape(self, shape): - """Set the shape of this XYViewProperties. - - :param shape: The shape of this XYViewProperties. - :type: str - """ # noqa: E501 - if shape is None: - raise ValueError("Invalid value for `shape`, must not be `None`") # noqa: E501 - self._shape = shape - - @property - def note(self): - """Get the note of this XYViewProperties. - - :return: The note of this XYViewProperties. - :rtype: str - """ # noqa: E501 - return self._note - - @note.setter - def note(self, note): - """Set the note of this XYViewProperties. - - :param note: The note of this XYViewProperties. - :type: str - """ # noqa: E501 - if note is None: - raise ValueError("Invalid value for `note`, must not be `None`") # noqa: E501 - self._note = note - - @property - def show_note_when_empty(self): - """Get the show_note_when_empty of this XYViewProperties. - - If true, will display note when empty - - :return: The show_note_when_empty of this XYViewProperties. - :rtype: bool - """ # noqa: E501 - return self._show_note_when_empty - - @show_note_when_empty.setter - def show_note_when_empty(self, show_note_when_empty): - """Set the show_note_when_empty of this XYViewProperties. - - If true, will display note when empty - - :param show_note_when_empty: The show_note_when_empty of this XYViewProperties. - :type: bool - """ # noqa: E501 - if show_note_when_empty is None: - raise ValueError("Invalid value for `show_note_when_empty`, must not be `None`") # noqa: E501 - self._show_note_when_empty = show_note_when_empty - - @property - def axes(self): - """Get the axes of this XYViewProperties. - - :return: The axes of this XYViewProperties. - :rtype: Axes - """ # noqa: E501 - return self._axes - - @axes.setter - def axes(self, axes): - """Set the axes of this XYViewProperties. - - :param axes: The axes of this XYViewProperties. - :type: Axes - """ # noqa: E501 - if axes is None: - raise ValueError("Invalid value for `axes`, must not be `None`") # noqa: E501 - self._axes = axes - - @property - def static_legend(self): - """Get the static_legend of this XYViewProperties. - - :return: The static_legend of this XYViewProperties. - :rtype: StaticLegend - """ # noqa: E501 - return self._static_legend - - @static_legend.setter - def static_legend(self, static_legend): - """Set the static_legend of this XYViewProperties. - - :param static_legend: The static_legend of this XYViewProperties. - :type: StaticLegend - """ # noqa: E501 - self._static_legend = static_legend - - @property - def x_column(self): - """Get the x_column of this XYViewProperties. - - :return: The x_column of this XYViewProperties. - :rtype: str - """ # noqa: E501 - return self._x_column - - @x_column.setter - def x_column(self, x_column): - """Set the x_column of this XYViewProperties. - - :param x_column: The x_column of this XYViewProperties. - :type: str - """ # noqa: E501 - self._x_column = x_column - - @property - def generate_x_axis_ticks(self): - """Get the generate_x_axis_ticks of this XYViewProperties. - - :return: The generate_x_axis_ticks of this XYViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._generate_x_axis_ticks - - @generate_x_axis_ticks.setter - def generate_x_axis_ticks(self, generate_x_axis_ticks): - """Set the generate_x_axis_ticks of this XYViewProperties. - - :param generate_x_axis_ticks: The generate_x_axis_ticks of this XYViewProperties. - :type: list[str] - """ # noqa: E501 - self._generate_x_axis_ticks = generate_x_axis_ticks - - @property - def x_total_ticks(self): - """Get the x_total_ticks of this XYViewProperties. - - :return: The x_total_ticks of this XYViewProperties. - :rtype: int - """ # noqa: E501 - return self._x_total_ticks - - @x_total_ticks.setter - def x_total_ticks(self, x_total_ticks): - """Set the x_total_ticks of this XYViewProperties. - - :param x_total_ticks: The x_total_ticks of this XYViewProperties. - :type: int - """ # noqa: E501 - self._x_total_ticks = x_total_ticks - - @property - def x_tick_start(self): - """Get the x_tick_start of this XYViewProperties. - - :return: The x_tick_start of this XYViewProperties. - :rtype: float - """ # noqa: E501 - return self._x_tick_start - - @x_tick_start.setter - def x_tick_start(self, x_tick_start): - """Set the x_tick_start of this XYViewProperties. - - :param x_tick_start: The x_tick_start of this XYViewProperties. - :type: float - """ # noqa: E501 - self._x_tick_start = x_tick_start - - @property - def x_tick_step(self): - """Get the x_tick_step of this XYViewProperties. - - :return: The x_tick_step of this XYViewProperties. - :rtype: float - """ # noqa: E501 - return self._x_tick_step - - @x_tick_step.setter - def x_tick_step(self, x_tick_step): - """Set the x_tick_step of this XYViewProperties. - - :param x_tick_step: The x_tick_step of this XYViewProperties. - :type: float - """ # noqa: E501 - self._x_tick_step = x_tick_step - - @property - def y_column(self): - """Get the y_column of this XYViewProperties. - - :return: The y_column of this XYViewProperties. - :rtype: str - """ # noqa: E501 - return self._y_column - - @y_column.setter - def y_column(self, y_column): - """Set the y_column of this XYViewProperties. - - :param y_column: The y_column of this XYViewProperties. - :type: str - """ # noqa: E501 - self._y_column = y_column - - @property - def generate_y_axis_ticks(self): - """Get the generate_y_axis_ticks of this XYViewProperties. - - :return: The generate_y_axis_ticks of this XYViewProperties. - :rtype: list[str] - """ # noqa: E501 - return self._generate_y_axis_ticks - - @generate_y_axis_ticks.setter - def generate_y_axis_ticks(self, generate_y_axis_ticks): - """Set the generate_y_axis_ticks of this XYViewProperties. - - :param generate_y_axis_ticks: The generate_y_axis_ticks of this XYViewProperties. - :type: list[str] - """ # noqa: E501 - self._generate_y_axis_ticks = generate_y_axis_ticks - - @property - def y_total_ticks(self): - """Get the y_total_ticks of this XYViewProperties. - - :return: The y_total_ticks of this XYViewProperties. - :rtype: int - """ # noqa: E501 - return self._y_total_ticks - - @y_total_ticks.setter - def y_total_ticks(self, y_total_ticks): - """Set the y_total_ticks of this XYViewProperties. - - :param y_total_ticks: The y_total_ticks of this XYViewProperties. - :type: int - """ # noqa: E501 - self._y_total_ticks = y_total_ticks - - @property - def y_tick_start(self): - """Get the y_tick_start of this XYViewProperties. - - :return: The y_tick_start of this XYViewProperties. - :rtype: float - """ # noqa: E501 - return self._y_tick_start - - @y_tick_start.setter - def y_tick_start(self, y_tick_start): - """Set the y_tick_start of this XYViewProperties. - - :param y_tick_start: The y_tick_start of this XYViewProperties. - :type: float - """ # noqa: E501 - self._y_tick_start = y_tick_start - - @property - def y_tick_step(self): - """Get the y_tick_step of this XYViewProperties. - - :return: The y_tick_step of this XYViewProperties. - :rtype: float - """ # noqa: E501 - return self._y_tick_step - - @y_tick_step.setter - def y_tick_step(self, y_tick_step): - """Set the y_tick_step of this XYViewProperties. - - :param y_tick_step: The y_tick_step of this XYViewProperties. - :type: float - """ # noqa: E501 - self._y_tick_step = y_tick_step - - @property - def shade_below(self): - """Get the shade_below of this XYViewProperties. - - :return: The shade_below of this XYViewProperties. - :rtype: bool - """ # noqa: E501 - return self._shade_below - - @shade_below.setter - def shade_below(self, shade_below): - """Set the shade_below of this XYViewProperties. - - :param shade_below: The shade_below of this XYViewProperties. - :type: bool - """ # noqa: E501 - self._shade_below = shade_below - - @property - def hover_dimension(self): - """Get the hover_dimension of this XYViewProperties. - - :return: The hover_dimension of this XYViewProperties. - :rtype: str - """ # noqa: E501 - return self._hover_dimension - - @hover_dimension.setter - def hover_dimension(self, hover_dimension): - """Set the hover_dimension of this XYViewProperties. - - :param hover_dimension: The hover_dimension of this XYViewProperties. - :type: str - """ # noqa: E501 - self._hover_dimension = hover_dimension - - @property - def position(self): - """Get the position of this XYViewProperties. - - :return: The position of this XYViewProperties. - :rtype: str - """ # noqa: E501 - return self._position - - @position.setter - def position(self, position): - """Set the position of this XYViewProperties. - - :param position: The position of this XYViewProperties. - :type: str - """ # noqa: E501 - if position is None: - raise ValueError("Invalid value for `position`, must not be `None`") # noqa: E501 - self._position = position - - @property - def geom(self): - """Get the geom of this XYViewProperties. - - :return: The geom of this XYViewProperties. - :rtype: XYGeom - """ # noqa: E501 - return self._geom - - @geom.setter - def geom(self, geom): - """Set the geom of this XYViewProperties. - - :param geom: The geom of this XYViewProperties. - :type: XYGeom - """ # noqa: E501 - if geom is None: - raise ValueError("Invalid value for `geom`, must not be `None`") # noqa: E501 - self._geom = geom - - @property - def legend_colorize_rows(self): - """Get the legend_colorize_rows of this XYViewProperties. - - :return: The legend_colorize_rows of this XYViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_colorize_rows - - @legend_colorize_rows.setter - def legend_colorize_rows(self, legend_colorize_rows): - """Set the legend_colorize_rows of this XYViewProperties. - - :param legend_colorize_rows: The legend_colorize_rows of this XYViewProperties. - :type: bool - """ # noqa: E501 - self._legend_colorize_rows = legend_colorize_rows - - @property - def legend_hide(self): - """Get the legend_hide of this XYViewProperties. - - :return: The legend_hide of this XYViewProperties. - :rtype: bool - """ # noqa: E501 - return self._legend_hide - - @legend_hide.setter - def legend_hide(self, legend_hide): - """Set the legend_hide of this XYViewProperties. - - :param legend_hide: The legend_hide of this XYViewProperties. - :type: bool - """ # noqa: E501 - self._legend_hide = legend_hide - - @property - def legend_opacity(self): - """Get the legend_opacity of this XYViewProperties. - - :return: The legend_opacity of this XYViewProperties. - :rtype: float - """ # noqa: E501 - return self._legend_opacity - - @legend_opacity.setter - def legend_opacity(self, legend_opacity): - """Set the legend_opacity of this XYViewProperties. - - :param legend_opacity: The legend_opacity of this XYViewProperties. - :type: float - """ # noqa: E501 - self._legend_opacity = legend_opacity - - @property - def legend_orientation_threshold(self): - """Get the legend_orientation_threshold of this XYViewProperties. - - :return: The legend_orientation_threshold of this XYViewProperties. - :rtype: int - """ # noqa: E501 - return self._legend_orientation_threshold - - @legend_orientation_threshold.setter - def legend_orientation_threshold(self, legend_orientation_threshold): - """Set the legend_orientation_threshold of this XYViewProperties. - - :param legend_orientation_threshold: The legend_orientation_threshold of this XYViewProperties. - :type: int - """ # noqa: E501 - self._legend_orientation_threshold = legend_orientation_threshold - - def to_dict(self): - """Return the model properties as a dict.""" - result = {} - - for attr, _ in self.openapi_types.items(): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Return the string representation of the model.""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`.""" - return self.to_str() - - def __eq__(self, other): - """Return true if both objects are equal.""" - if not isinstance(other, XYViewProperties): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Return true if both objects are not equal.""" - return not self == other diff --git a/frogpilot/third_party/influxdb_client/extras.py b/frogpilot/third_party/influxdb_client/extras.py deleted file mode 100644 index 63ceb3b34..000000000 --- a/frogpilot/third_party/influxdb_client/extras.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Extras to selectively import Pandas or NumPy.""" - -try: - import pandas as pd -except ModuleNotFoundError as err: - raise ImportError(f"`query_data_frame` requires Pandas which couldn't be imported due: {err}") - -try: - import numpy as np -except ModuleNotFoundError as err: - raise ImportError(f"`data_frame` requires numpy which couldn't be imported due: {err}") - -__all__ = ['pd', 'np'] diff --git a/frogpilot/third_party/influxdb_client/py.typed b/frogpilot/third_party/influxdb_client/py.typed deleted file mode 100644 index e69de29bb..000000000 diff --git a/frogpilot/third_party/influxdb_client/rest.py b/frogpilot/third_party/influxdb_client/rest.py deleted file mode 100644 index cd4dbff45..000000000 --- a/frogpilot/third_party/influxdb_client/rest.py +++ /dev/null @@ -1,91 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - -from __future__ import absolute_import - -import logging -from typing import Dict -from urllib3 import HTTPResponse -from influxdb_client.client.exceptions import InfluxDBError -from influxdb_client.configuration import Configuration - -_UTF_8_encoding = 'utf-8' - - -class ApiException(InfluxDBError): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - Do not edit the class manually. - """ - - def __init__(self, status=None, reason=None, http_resp=None): - """Initialize with HTTP response.""" - super().__init__(response=http_resp) - if http_resp: - self.status = http_resp.status - self.reason = http_resp.reason - self.body = http_resp.data - if isinstance(http_resp, HTTPResponse): # response is HTTPResponse - self.headers = http_resp.headers - else: # response is RESTResponse - self.headers = http_resp.getheaders() - else: - self.status = status - self.reason = reason - self.body = None - self.headers = None - - def __str__(self): - """Get custom error messages for exception.""" - error_message = "({0})\n" \ - "Reason: {1}\n".format(self.status, self.reason) - if self.headers: - error_message += "HTTP response headers: {0}\n".format( - self.headers) - - if self.body: - error_message += "HTTP response body: {0}\n".format(self.body) - - return error_message - - -class _BaseRESTClient(object): - logger = logging.getLogger('influxdb_client.client.http') - - @staticmethod - def log_request(method: str, url: str): - _BaseRESTClient.logger.debug(f">>> Request: '{method} {url}'") - - @staticmethod - def log_response(status: str): - _BaseRESTClient.logger.debug(f"<<< Response: {status}") - - @staticmethod - def log_body(body: object, prefix: str): - _BaseRESTClient.logger.debug(f"{prefix} Body: {body}") - - @staticmethod - def log_headers(headers: Dict[str, str], prefix: str): - for key, v in headers.items(): - value = v - if 'authorization' == key.lower(): - value = '***' - _BaseRESTClient.logger.debug(f"{prefix} {key}: {value}") - - -def _requires_create_user_session(configuration: Configuration, cookie: str, resource_path: str): - _unauthorized = ['/api/v2/signin', '/api/v2/signout'] - return configuration.username and configuration.password and not cookie and resource_path not in _unauthorized - - -def _requires_expire_user_session(configuration: Configuration, cookie: str): - return configuration.username and configuration.password and cookie diff --git a/frogpilot/third_party/influxdb_client/service/__init__.py b/frogpilot/third_party/influxdb_client/service/__init__.py deleted file mode 100644 index 0d21a4384..000000000 --- a/frogpilot/third_party/influxdb_client/service/__init__.py +++ /dev/null @@ -1,56 +0,0 @@ -# flake8: noqa - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -# import apis into api package -from influxdb_client.service.authorizations_service import AuthorizationsService -from influxdb_client.service.backup_service import BackupService -from influxdb_client.service.bucket_schemas_service import BucketSchemasService -from influxdb_client.service.buckets_service import BucketsService -from influxdb_client.service.cells_service import CellsService -from influxdb_client.service.checks_service import ChecksService -from influxdb_client.service.config_service import ConfigService -from influxdb_client.service.dbr_ps_service import DBRPsService -from influxdb_client.service.dashboards_service import DashboardsService -from influxdb_client.service.delete_service import DeleteService -from influxdb_client.service.health_service import HealthService -from influxdb_client.service.invokable_scripts_service import InvokableScriptsService -from influxdb_client.service.labels_service import LabelsService -from influxdb_client.service.legacy_authorizations_service import LegacyAuthorizationsService -from influxdb_client.service.metrics_service import MetricsService -from influxdb_client.service.notification_endpoints_service import NotificationEndpointsService -from influxdb_client.service.notification_rules_service import NotificationRulesService -from influxdb_client.service.organizations_service import OrganizationsService -from influxdb_client.service.ping_service import PingService -from influxdb_client.service.query_service import QueryService -from influxdb_client.service.ready_service import ReadyService -from influxdb_client.service.remote_connections_service import RemoteConnectionsService -from influxdb_client.service.replications_service import ReplicationsService -from influxdb_client.service.resources_service import ResourcesService -from influxdb_client.service.restore_service import RestoreService -from influxdb_client.service.routes_service import RoutesService -from influxdb_client.service.rules_service import RulesService -from influxdb_client.service.scraper_targets_service import ScraperTargetsService -from influxdb_client.service.secrets_service import SecretsService -from influxdb_client.service.setup_service import SetupService -from influxdb_client.service.signin_service import SigninService -from influxdb_client.service.signout_service import SignoutService -from influxdb_client.service.sources_service import SourcesService -from influxdb_client.service.tasks_service import TasksService -from influxdb_client.service.telegraf_plugins_service import TelegrafPluginsService -from influxdb_client.service.telegrafs_service import TelegrafsService -from influxdb_client.service.templates_service import TemplatesService -from influxdb_client.service.users_service import UsersService -from influxdb_client.service.variables_service import VariablesService -from influxdb_client.service.views_service import ViewsService -from influxdb_client.service.write_service import WriteService diff --git a/frogpilot/third_party/influxdb_client/service/_base_service.py b/frogpilot/third_party/influxdb_client/service/_base_service.py deleted file mode 100644 index d3e8f9955..000000000 --- a/frogpilot/third_party/influxdb_client/service/_base_service.py +++ /dev/null @@ -1,67 +0,0 @@ - - -# noinspection PyMethodMayBeStatic -class _BaseService(object): - - def __init__(self, api_client=None): - """Init common services operation.""" - if api_client is None: - raise ValueError("Invalid value for `api_client`, must be defined.") - self.api_client = api_client - self._build_type = None - - def _check_operation_params(self, operation_id, supported_params, local_params): - supported_params.append('async_req') - supported_params.append('_return_http_data_only') - supported_params.append('_preload_content') - supported_params.append('_request_timeout') - supported_params.append('urlopen_kw') - for key, val in local_params['kwargs'].items(): - if key not in supported_params: - raise TypeError( - f"Got an unexpected keyword argument '{key}'" - f" to method {operation_id}" - ) - local_params[key] = val - del local_params['kwargs'] - - def _is_cloud_instance(self) -> bool: - if not self._build_type: - self._build_type = self.build_type() - return 'cloud' in self._build_type.lower() - - async def _is_cloud_instance_async(self) -> bool: - if not self._build_type: - self._build_type = await self.build_type_async() - return 'cloud' in self._build_type.lower() - - def build_type(self) -> str: - """ - Return the build type of the connected InfluxDB Server. - - :return: The type of InfluxDB build. - """ - from influxdb_client import PingService - ping_service = PingService(self.api_client) - - response = ping_service.get_ping_with_http_info(_return_http_data_only=False) - return self.response_header(response, header_name='X-Influxdb-Build') - - async def build_type_async(self) -> str: - """ - Return the build type of the connected InfluxDB Server. - - :return: The type of InfluxDB build. - """ - from influxdb_client import PingService - ping_service = PingService(self.api_client) - - response = await ping_service.get_ping_async(_return_http_data_only=False) - return self.response_header(response, header_name='X-Influxdb-Build') - - def response_header(self, response, header_name='X-Influxdb-Version') -> str: - if response is not None and len(response) >= 3: - if header_name in response[2]: - return response[2][header_name] - - return "unknown" diff --git a/frogpilot/third_party/influxdb_client/service/authorizations_service.py b/frogpilot/third_party/influxdb_client/service/authorizations_service.py deleted file mode 100644 index 100160e29..000000000 --- a/frogpilot/third_party/influxdb_client/service/authorizations_service.py +++ /dev/null @@ -1,658 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class AuthorizationsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """AuthorizationsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_authorizations_id(self, auth_id, **kwargs): # noqa: E501,D401,D403 - """Delete an authorization. - - Deletes an authorization. Use the endpoint to delete an API token. If you want to disable an API token instead of delete it, [update the authorization's status to `inactive`](#operation/PatchAuthorizationsID). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_authorizations_id(auth_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: An authorization ID. Specifies the authorization to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_authorizations_id_with_http_info(auth_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_authorizations_id_with_http_info(auth_id, **kwargs) # noqa: E501 - return data - - def delete_authorizations_id_with_http_info(self, auth_id, **kwargs): # noqa: E501,D401,D403 - """Delete an authorization. - - Deletes an authorization. Use the endpoint to delete an API token. If you want to disable an API token instead of delete it, [update the authorization's status to `inactive`](#operation/PatchAuthorizationsID). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_authorizations_id_with_http_info(auth_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: An authorization ID. Specifies the authorization to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_authorizations_id_prepare(auth_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/authorizations/{authID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_authorizations_id_async(self, auth_id, **kwargs): # noqa: E501,D401,D403 - """Delete an authorization. - - Deletes an authorization. Use the endpoint to delete an API token. If you want to disable an API token instead of delete it, [update the authorization's status to `inactive`](#operation/PatchAuthorizationsID). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str auth_id: An authorization ID. Specifies the authorization to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_authorizations_id_prepare(auth_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/authorizations/{authID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_authorizations_id_prepare(self, auth_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['auth_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_authorizations_id', all_params, local_var_params) - # verify the required parameter 'auth_id' is set - if ('auth_id' not in local_var_params or - local_var_params['auth_id'] is None): - raise ValueError("Missing the required parameter `auth_id` when calling `delete_authorizations_id`") # noqa: E501 - - path_params = {} - if 'auth_id' in local_var_params: - path_params['authID'] = local_var_params['auth_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_authorizations(self, **kwargs): # noqa: E501,D401,D403 - """List authorizations. - - Lists authorizations. To limit which authorizations are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all authorizations. #### InfluxDB Cloud - InfluxDB Cloud doesn't expose [API token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token) values in `GET /api/v2/authorizations` responses; returns `token: redacted` for all authorizations. #### Required permissions To retrieve an authorization, the request must use an API token that has the following permissions: - `read-authorizations` - `read-user` for the user that the authorization is scoped to #### Related guides - [View tokens](https://docs.influxdata.com/influxdb/latest/security/tokens/view-tokens/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_authorizations(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str user_id: A user ID. Only returns authorizations scoped to the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). - :param str user: A user name. Only returns authorizations scoped to the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). - :param str org_id: An organization ID. Only returns authorizations that belong to the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). - :param str org: An organization name. Only returns authorizations that belong to the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). - :param str token: An API [token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token) value. Specifies an authorization by its `token` property value and returns the authorization. #### InfluxDB OSS - Doesn't support this parameter. InfluxDB OSS ignores the `token=` parameter, applies other parameters, and then returns the result. #### Limitations - The parameter is non-repeatable. If you specify more than one, only the first one is used. If a resource with the specified property value doesn't exist, then the response body contains an empty list. - :return: Authorizations - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_authorizations_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_authorizations_with_http_info(**kwargs) # noqa: E501 - return data - - def get_authorizations_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List authorizations. - - Lists authorizations. To limit which authorizations are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all authorizations. #### InfluxDB Cloud - InfluxDB Cloud doesn't expose [API token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token) values in `GET /api/v2/authorizations` responses; returns `token: redacted` for all authorizations. #### Required permissions To retrieve an authorization, the request must use an API token that has the following permissions: - `read-authorizations` - `read-user` for the user that the authorization is scoped to #### Related guides - [View tokens](https://docs.influxdata.com/influxdb/latest/security/tokens/view-tokens/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_authorizations_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str user_id: A user ID. Only returns authorizations scoped to the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). - :param str user: A user name. Only returns authorizations scoped to the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). - :param str org_id: An organization ID. Only returns authorizations that belong to the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). - :param str org: An organization name. Only returns authorizations that belong to the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). - :param str token: An API [token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token) value. Specifies an authorization by its `token` property value and returns the authorization. #### InfluxDB OSS - Doesn't support this parameter. InfluxDB OSS ignores the `token=` parameter, applies other parameters, and then returns the result. #### Limitations - The parameter is non-repeatable. If you specify more than one, only the first one is used. If a resource with the specified property value doesn't exist, then the response body contains an empty list. - :return: Authorizations - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_authorizations_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/authorizations', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorizations', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_authorizations_async(self, **kwargs): # noqa: E501,D401,D403 - """List authorizations. - - Lists authorizations. To limit which authorizations are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all authorizations. #### InfluxDB Cloud - InfluxDB Cloud doesn't expose [API token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token) values in `GET /api/v2/authorizations` responses; returns `token: redacted` for all authorizations. #### Required permissions To retrieve an authorization, the request must use an API token that has the following permissions: - `read-authorizations` - `read-user` for the user that the authorization is scoped to #### Related guides - [View tokens](https://docs.influxdata.com/influxdb/latest/security/tokens/view-tokens/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str user_id: A user ID. Only returns authorizations scoped to the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). - :param str user: A user name. Only returns authorizations scoped to the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). - :param str org_id: An organization ID. Only returns authorizations that belong to the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). - :param str org: An organization name. Only returns authorizations that belong to the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). - :param str token: An API [token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token) value. Specifies an authorization by its `token` property value and returns the authorization. #### InfluxDB OSS - Doesn't support this parameter. InfluxDB OSS ignores the `token=` parameter, applies other parameters, and then returns the result. #### Limitations - The parameter is non-repeatable. If you specify more than one, only the first one is used. If a resource with the specified property value doesn't exist, then the response body contains an empty list. - :return: Authorizations - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_authorizations_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/authorizations', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorizations', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_authorizations_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'user_id', 'user', 'org_id', 'org', 'token'] # noqa: E501 - self._check_operation_params('get_authorizations', all_params, local_var_params) - - path_params = {} - - query_params = [] - if 'user_id' in local_var_params: - query_params.append(('userID', local_var_params['user_id'])) # noqa: E501 - if 'user' in local_var_params: - query_params.append(('user', local_var_params['user'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'token' in local_var_params: - query_params.append(('token', local_var_params['token'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_authorizations_id(self, auth_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve an authorization. - - Retrieves an authorization. Use this endpoint to retrieve information about an API token, including the token's permissions and the user that the token is scoped to. #### InfluxDB OSS - InfluxDB OSS returns [API token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token) values in authorizations. - If the request uses an _[operator token](https://docs.influxdata.com/influxdb/latest/security/tokens/#operator-token)_, InfluxDB OSS returns authorizations for all organizations in the instance. #### Related guides - [View tokens](https://docs.influxdata.com/influxdb/latest/security/tokens/view-tokens/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_authorizations_id(auth_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: An authorization ID. Specifies the authorization to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_authorizations_id_with_http_info(auth_id, **kwargs) # noqa: E501 - else: - (data) = self.get_authorizations_id_with_http_info(auth_id, **kwargs) # noqa: E501 - return data - - def get_authorizations_id_with_http_info(self, auth_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve an authorization. - - Retrieves an authorization. Use this endpoint to retrieve information about an API token, including the token's permissions and the user that the token is scoped to. #### InfluxDB OSS - InfluxDB OSS returns [API token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token) values in authorizations. - If the request uses an _[operator token](https://docs.influxdata.com/influxdb/latest/security/tokens/#operator-token)_, InfluxDB OSS returns authorizations for all organizations in the instance. #### Related guides - [View tokens](https://docs.influxdata.com/influxdb/latest/security/tokens/view-tokens/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_authorizations_id_with_http_info(auth_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: An authorization ID. Specifies the authorization to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_authorizations_id_prepare(auth_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/authorizations/{authID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_authorizations_id_async(self, auth_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve an authorization. - - Retrieves an authorization. Use this endpoint to retrieve information about an API token, including the token's permissions and the user that the token is scoped to. #### InfluxDB OSS - InfluxDB OSS returns [API token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token) values in authorizations. - If the request uses an _[operator token](https://docs.influxdata.com/influxdb/latest/security/tokens/#operator-token)_, InfluxDB OSS returns authorizations for all organizations in the instance. #### Related guides - [View tokens](https://docs.influxdata.com/influxdb/latest/security/tokens/view-tokens/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str auth_id: An authorization ID. Specifies the authorization to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_authorizations_id_prepare(auth_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/authorizations/{authID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_authorizations_id_prepare(self, auth_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['auth_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_authorizations_id', all_params, local_var_params) - # verify the required parameter 'auth_id' is set - if ('auth_id' not in local_var_params or - local_var_params['auth_id'] is None): - raise ValueError("Missing the required parameter `auth_id` when calling `get_authorizations_id`") # noqa: E501 - - path_params = {} - if 'auth_id' in local_var_params: - path_params['authID'] = local_var_params['auth_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_authorizations_id(self, auth_id, authorization_update_request, **kwargs): # noqa: E501,D401,D403 - """Update an API token to be active or inactive. - - Updates an authorization. Use this endpoint to set an API token's status to be _active_ or _inactive_. InfluxDB rejects requests that use inactive API tokens. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_authorizations_id(auth_id, authorization_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: An authorization ID. Specifies the authorization to update. (required) - :param AuthorizationUpdateRequest authorization_update_request: In the request body, provide the authorization properties to update. (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_authorizations_id_with_http_info(auth_id, authorization_update_request, **kwargs) # noqa: E501 - else: - (data) = self.patch_authorizations_id_with_http_info(auth_id, authorization_update_request, **kwargs) # noqa: E501 - return data - - def patch_authorizations_id_with_http_info(self, auth_id, authorization_update_request, **kwargs): # noqa: E501,D401,D403 - """Update an API token to be active or inactive. - - Updates an authorization. Use this endpoint to set an API token's status to be _active_ or _inactive_. InfluxDB rejects requests that use inactive API tokens. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_authorizations_id_with_http_info(auth_id, authorization_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: An authorization ID. Specifies the authorization to update. (required) - :param AuthorizationUpdateRequest authorization_update_request: In the request body, provide the authorization properties to update. (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_authorizations_id_prepare(auth_id, authorization_update_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/authorizations/{authID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_authorizations_id_async(self, auth_id, authorization_update_request, **kwargs): # noqa: E501,D401,D403 - """Update an API token to be active or inactive. - - Updates an authorization. Use this endpoint to set an API token's status to be _active_ or _inactive_. InfluxDB rejects requests that use inactive API tokens. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str auth_id: An authorization ID. Specifies the authorization to update. (required) - :param AuthorizationUpdateRequest authorization_update_request: In the request body, provide the authorization properties to update. (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_authorizations_id_prepare(auth_id, authorization_update_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/authorizations/{authID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_authorizations_id_prepare(self, auth_id, authorization_update_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['auth_id', 'authorization_update_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_authorizations_id', all_params, local_var_params) - # verify the required parameter 'auth_id' is set - if ('auth_id' not in local_var_params or - local_var_params['auth_id'] is None): - raise ValueError("Missing the required parameter `auth_id` when calling `patch_authorizations_id`") # noqa: E501 - # verify the required parameter 'authorization_update_request' is set - if ('authorization_update_request' not in local_var_params or - local_var_params['authorization_update_request'] is None): - raise ValueError("Missing the required parameter `authorization_update_request` when calling `patch_authorizations_id`") # noqa: E501 - - path_params = {} - if 'auth_id' in local_var_params: - path_params['authID'] = local_var_params['auth_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'authorization_update_request' in local_var_params: - body_params = local_var_params['authorization_update_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_authorizations(self, authorization_post_request, **kwargs): # noqa: E501,D401,D403 - """Create an authorization. - - Creates an authorization and returns the authorization with the generated API [token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token). Use this endpoint to create an authorization, which generates an API token with permissions to `read` or `write` to a specific resource or `type` of resource. The API token is the authorization's `token` property value. To follow best practices for secure API token generation and retrieval, InfluxDB enforces access restrictions on API tokens. - InfluxDB allows access to the API token value immediately after the authorization is created. - You can’t change access (read/write) permissions for an API token after it’s created. - Tokens stop working when the user who created the token is deleted. We recommend the following for managing your tokens: - Create a generic user to create and manage tokens for writing data. - Store your tokens in a secure password vault for future access. #### Required permissions - `write-authorizations` - `write-user` for the user that the authorization is scoped to #### Related guides - [Create a token](https://docs.influxdata.com/influxdb/latest/security/tokens/create-token/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_authorizations(authorization_post_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param AuthorizationPostRequest authorization_post_request: The authorization to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_authorizations_with_http_info(authorization_post_request, **kwargs) # noqa: E501 - else: - (data) = self.post_authorizations_with_http_info(authorization_post_request, **kwargs) # noqa: E501 - return data - - def post_authorizations_with_http_info(self, authorization_post_request, **kwargs): # noqa: E501,D401,D403 - """Create an authorization. - - Creates an authorization and returns the authorization with the generated API [token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token). Use this endpoint to create an authorization, which generates an API token with permissions to `read` or `write` to a specific resource or `type` of resource. The API token is the authorization's `token` property value. To follow best practices for secure API token generation and retrieval, InfluxDB enforces access restrictions on API tokens. - InfluxDB allows access to the API token value immediately after the authorization is created. - You can’t change access (read/write) permissions for an API token after it’s created. - Tokens stop working when the user who created the token is deleted. We recommend the following for managing your tokens: - Create a generic user to create and manage tokens for writing data. - Store your tokens in a secure password vault for future access. #### Required permissions - `write-authorizations` - `write-user` for the user that the authorization is scoped to #### Related guides - [Create a token](https://docs.influxdata.com/influxdb/latest/security/tokens/create-token/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_authorizations_with_http_info(authorization_post_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param AuthorizationPostRequest authorization_post_request: The authorization to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_authorizations_prepare(authorization_post_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/authorizations', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_authorizations_async(self, authorization_post_request, **kwargs): # noqa: E501,D401,D403 - """Create an authorization. - - Creates an authorization and returns the authorization with the generated API [token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token). Use this endpoint to create an authorization, which generates an API token with permissions to `read` or `write` to a specific resource or `type` of resource. The API token is the authorization's `token` property value. To follow best practices for secure API token generation and retrieval, InfluxDB enforces access restrictions on API tokens. - InfluxDB allows access to the API token value immediately after the authorization is created. - You can’t change access (read/write) permissions for an API token after it’s created. - Tokens stop working when the user who created the token is deleted. We recommend the following for managing your tokens: - Create a generic user to create and manage tokens for writing data. - Store your tokens in a secure password vault for future access. #### Required permissions - `write-authorizations` - `write-user` for the user that the authorization is scoped to #### Related guides - [Create a token](https://docs.influxdata.com/influxdb/latest/security/tokens/create-token/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param AuthorizationPostRequest authorization_post_request: The authorization to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_authorizations_prepare(authorization_post_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/authorizations', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_authorizations_prepare(self, authorization_post_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['authorization_post_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_authorizations', all_params, local_var_params) - # verify the required parameter 'authorization_post_request' is set - if ('authorization_post_request' not in local_var_params or - local_var_params['authorization_post_request'] is None): - raise ValueError("Missing the required parameter `authorization_post_request` when calling `post_authorizations`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'authorization_post_request' in local_var_params: - body_params = local_var_params['authorization_post_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/backup_service.py b/frogpilot/third_party/influxdb_client/service/backup_service.py deleted file mode 100644 index 0bc520c9f..000000000 --- a/frogpilot/third_party/influxdb_client/service/backup_service.py +++ /dev/null @@ -1,378 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class BackupService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """BackupService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def get_backup_kv(self, **kwargs): # noqa: E501,D401,D403 - """Download snapshot of metadata stored in the server's embedded KV store. Don't use with InfluxDB versions greater than InfluxDB 2.1.x.. - - Retrieves a snapshot of metadata stored in the server's embedded KV store. InfluxDB versions greater than 2.1.x don't include metadata stored in embedded SQL; avoid using this endpoint with versions greater than 2.1.x. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_backup_kv(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: file - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_backup_kv_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_backup_kv_with_http_info(**kwargs) # noqa: E501 - return data - - def get_backup_kv_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Download snapshot of metadata stored in the server's embedded KV store. Don't use with InfluxDB versions greater than InfluxDB 2.1.x.. - - Retrieves a snapshot of metadata stored in the server's embedded KV store. InfluxDB versions greater than 2.1.x don't include metadata stored in embedded SQL; avoid using this endpoint with versions greater than 2.1.x. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_backup_kv_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: file - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_backup_kv_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/backup/kv', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='file', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_backup_kv_async(self, **kwargs): # noqa: E501,D401,D403 - """Download snapshot of metadata stored in the server's embedded KV store. Don't use with InfluxDB versions greater than InfluxDB 2.1.x.. - - Retrieves a snapshot of metadata stored in the server's embedded KV store. InfluxDB versions greater than 2.1.x don't include metadata stored in embedded SQL; avoid using this endpoint with versions greater than 2.1.x. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: file - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_backup_kv_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/backup/kv', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='file', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_backup_kv_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span'] # noqa: E501 - self._check_operation_params('get_backup_kv', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/octet-stream', 'application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_backup_metadata(self, **kwargs): # noqa: E501,D401,D403 - """Download snapshot of all metadata in the server. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_backup_metadata(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str accept_encoding: Indicates the content encoding (usually a compression algorithm) that the client can understand. - :return: MetadataBackup - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_backup_metadata_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_backup_metadata_with_http_info(**kwargs) # noqa: E501 - return data - - def get_backup_metadata_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Download snapshot of all metadata in the server. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_backup_metadata_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str accept_encoding: Indicates the content encoding (usually a compression algorithm) that the client can understand. - :return: MetadataBackup - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_backup_metadata_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/backup/metadata', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='MetadataBackup', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_backup_metadata_async(self, **kwargs): # noqa: E501,D401,D403 - """Download snapshot of all metadata in the server. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str accept_encoding: Indicates the content encoding (usually a compression algorithm) that the client can understand. - :return: MetadataBackup - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_backup_metadata_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/backup/metadata', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='MetadataBackup', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_backup_metadata_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'accept_encoding'] # noqa: E501 - self._check_operation_params('get_backup_metadata', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'accept_encoding' in local_var_params: - header_params['Accept-Encoding'] = local_var_params['accept_encoding'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['multipart/mixed', 'application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_backup_shard_id(self, shard_id, **kwargs): # noqa: E501,D401,D403 - """Download snapshot of all TSM data in a shard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_backup_shard_id(shard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param int shard_id: The shard ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str accept_encoding: Indicates the content encoding (usually a compression algorithm) that the client can understand. - :param datetime since: The earliest time [RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp) to include in the snapshot. - :return: file - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_backup_shard_id_with_http_info(shard_id, **kwargs) # noqa: E501 - else: - (data) = self.get_backup_shard_id_with_http_info(shard_id, **kwargs) # noqa: E501 - return data - - def get_backup_shard_id_with_http_info(self, shard_id, **kwargs): # noqa: E501,D401,D403 - """Download snapshot of all TSM data in a shard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_backup_shard_id_with_http_info(shard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param int shard_id: The shard ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str accept_encoding: Indicates the content encoding (usually a compression algorithm) that the client can understand. - :param datetime since: The earliest time [RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp) to include in the snapshot. - :return: file - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_backup_shard_id_prepare(shard_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/backup/shards/{shardID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='file', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_backup_shard_id_async(self, shard_id, **kwargs): # noqa: E501,D401,D403 - """Download snapshot of all TSM data in a shard. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param int shard_id: The shard ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str accept_encoding: Indicates the content encoding (usually a compression algorithm) that the client can understand. - :param datetime since: The earliest time [RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp) to include in the snapshot. - :return: file - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_backup_shard_id_prepare(shard_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/backup/shards/{shardID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='file', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_backup_shard_id_prepare(self, shard_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['shard_id', 'zap_trace_span', 'accept_encoding', 'since'] # noqa: E501 - self._check_operation_params('get_backup_shard_id', all_params, local_var_params) - # verify the required parameter 'shard_id' is set - if ('shard_id' not in local_var_params or - local_var_params['shard_id'] is None): - raise ValueError("Missing the required parameter `shard_id` when calling `get_backup_shard_id`") # noqa: E501 - - path_params = {} - if 'shard_id' in local_var_params: - path_params['shardID'] = local_var_params['shard_id'] # noqa: E501 - - query_params = [] - if 'since' in local_var_params: - query_params.append(('since', local_var_params['since'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'accept_encoding' in local_var_params: - header_params['Accept-Encoding'] = local_var_params['accept_encoding'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/octet-stream', 'application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/bucket_schemas_service.py b/frogpilot/third_party/influxdb_client/service/bucket_schemas_service.py deleted file mode 100644 index 7a25338c3..000000000 --- a/frogpilot/third_party/influxdb_client/service/bucket_schemas_service.py +++ /dev/null @@ -1,607 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class BucketSchemasService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """BucketSchemasService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def create_measurement_schema(self, bucket_id, measurement_schema_create_request, **kwargs): # noqa: E501,D401,D403 - """Create a measurement schema for a bucket. - - Creates an _explict_ measurement [schema](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#schema) for a bucket. _Explicit_ schemas are used to enforce column names, tags, fields, and data types for your data. By default, buckets have an _implicit_ schema-type (`"schemaType": "implicit"`) that conforms to your data. Use this endpoint to create schemas that prevent non-conforming write requests. #### Limitations - Buckets must be created with the "explict" `schemaType` in order to use schemas. #### Related guides - [Manage bucket schemas](https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/). - [Create a bucket with an explicit schema](https://docs.influxdata.com/influxdb/cloud/organizations/buckets/create-bucket/#create-a-bucket-with-an-explicit-schema) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.create_measurement_schema(bucket_id, measurement_schema_create_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: A bucket ID. Adds a schema for the specified bucket. (required) - :param MeasurementSchemaCreateRequest measurement_schema_create_request: (required) - :param str org: An organization name. Specifies the organization that owns the schema. - :param str org_id: An organization ID. Specifies the organization that owns the schema. - :return: MeasurementSchema - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.create_measurement_schema_with_http_info(bucket_id, measurement_schema_create_request, **kwargs) # noqa: E501 - else: - (data) = self.create_measurement_schema_with_http_info(bucket_id, measurement_schema_create_request, **kwargs) # noqa: E501 - return data - - def create_measurement_schema_with_http_info(self, bucket_id, measurement_schema_create_request, **kwargs): # noqa: E501,D401,D403 - """Create a measurement schema for a bucket. - - Creates an _explict_ measurement [schema](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#schema) for a bucket. _Explicit_ schemas are used to enforce column names, tags, fields, and data types for your data. By default, buckets have an _implicit_ schema-type (`"schemaType": "implicit"`) that conforms to your data. Use this endpoint to create schemas that prevent non-conforming write requests. #### Limitations - Buckets must be created with the "explict" `schemaType` in order to use schemas. #### Related guides - [Manage bucket schemas](https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/). - [Create a bucket with an explicit schema](https://docs.influxdata.com/influxdb/cloud/organizations/buckets/create-bucket/#create-a-bucket-with-an-explicit-schema) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.create_measurement_schema_with_http_info(bucket_id, measurement_schema_create_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: A bucket ID. Adds a schema for the specified bucket. (required) - :param MeasurementSchemaCreateRequest measurement_schema_create_request: (required) - :param str org: An organization name. Specifies the organization that owns the schema. - :param str org_id: An organization ID. Specifies the organization that owns the schema. - :return: MeasurementSchema - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not self._is_cloud_instance(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('BucketSchemasService', - 'https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._create_measurement_schema_prepare(bucket_id, measurement_schema_create_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}/schema/measurements', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='MeasurementSchema', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def create_measurement_schema_async(self, bucket_id, measurement_schema_create_request, **kwargs): # noqa: E501,D401,D403 - """Create a measurement schema for a bucket. - - Creates an _explict_ measurement [schema](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#schema) for a bucket. _Explicit_ schemas are used to enforce column names, tags, fields, and data types for your data. By default, buckets have an _implicit_ schema-type (`"schemaType": "implicit"`) that conforms to your data. Use this endpoint to create schemas that prevent non-conforming write requests. #### Limitations - Buckets must be created with the "explict" `schemaType` in order to use schemas. #### Related guides - [Manage bucket schemas](https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/). - [Create a bucket with an explicit schema](https://docs.influxdata.com/influxdb/cloud/organizations/buckets/create-bucket/#create-a-bucket-with-an-explicit-schema) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: A bucket ID. Adds a schema for the specified bucket. (required) - :param MeasurementSchemaCreateRequest measurement_schema_create_request: (required) - :param str org: An organization name. Specifies the organization that owns the schema. - :param str org_id: An organization ID. Specifies the organization that owns the schema. - :return: MeasurementSchema - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not await self._is_cloud_instance_async(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('BucketSchemasService', - 'https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._create_measurement_schema_prepare(bucket_id, measurement_schema_create_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}/schema/measurements', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='MeasurementSchema', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _create_measurement_schema_prepare(self, bucket_id, measurement_schema_create_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'measurement_schema_create_request', 'org', 'org_id'] # noqa: E501 - self._check_operation_params('create_measurement_schema', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `create_measurement_schema`") # noqa: E501 - # verify the required parameter 'measurement_schema_create_request' is set - if ('measurement_schema_create_request' not in local_var_params or - local_var_params['measurement_schema_create_request'] is None): - raise ValueError("Missing the required parameter `measurement_schema_create_request` when calling `create_measurement_schema`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - - header_params = {} - - body_params = None - if 'measurement_schema_create_request' in local_var_params: - body_params = local_var_params['measurement_schema_create_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_measurement_schema(self, bucket_id, measurement_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a measurement schema. - - Retrieves an explicit measurement [schema](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#schema). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_measurement_schema(bucket_id, measurement_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: A bucket ID. Retrieves schemas for the specified bucket. (required) - :param str measurement_id: The measurement schema ID. Specifies the measurement schema to retrieve. (required) - :param str org: Organization name. Specifies the organization that owns the schema. - :param str org_id: Organization ID. Specifies the organization that owns the schema. - :return: MeasurementSchema - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_measurement_schema_with_http_info(bucket_id, measurement_id, **kwargs) # noqa: E501 - else: - (data) = self.get_measurement_schema_with_http_info(bucket_id, measurement_id, **kwargs) # noqa: E501 - return data - - def get_measurement_schema_with_http_info(self, bucket_id, measurement_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a measurement schema. - - Retrieves an explicit measurement [schema](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#schema). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_measurement_schema_with_http_info(bucket_id, measurement_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: A bucket ID. Retrieves schemas for the specified bucket. (required) - :param str measurement_id: The measurement schema ID. Specifies the measurement schema to retrieve. (required) - :param str org: Organization name. Specifies the organization that owns the schema. - :param str org_id: Organization ID. Specifies the organization that owns the schema. - :return: MeasurementSchema - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not self._is_cloud_instance(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('BucketSchemasService', - 'https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_measurement_schema_prepare(bucket_id, measurement_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}/schema/measurements/{measurementID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='MeasurementSchema', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_measurement_schema_async(self, bucket_id, measurement_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a measurement schema. - - Retrieves an explicit measurement [schema](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#schema). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: A bucket ID. Retrieves schemas for the specified bucket. (required) - :param str measurement_id: The measurement schema ID. Specifies the measurement schema to retrieve. (required) - :param str org: Organization name. Specifies the organization that owns the schema. - :param str org_id: Organization ID. Specifies the organization that owns the schema. - :return: MeasurementSchema - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not await self._is_cloud_instance_async(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('BucketSchemasService', - 'https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_measurement_schema_prepare(bucket_id, measurement_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}/schema/measurements/{measurementID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='MeasurementSchema', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_measurement_schema_prepare(self, bucket_id, measurement_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'measurement_id', 'org', 'org_id'] # noqa: E501 - self._check_operation_params('get_measurement_schema', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `get_measurement_schema`") # noqa: E501 - # verify the required parameter 'measurement_id' is set - if ('measurement_id' not in local_var_params or - local_var_params['measurement_id'] is None): - raise ValueError("Missing the required parameter `measurement_id` when calling `get_measurement_schema`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - if 'measurement_id' in local_var_params: - path_params['measurementID'] = local_var_params['measurement_id'] # noqa: E501 - - query_params = [] - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - - header_params = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_measurement_schemas(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """List measurement schemas of a bucket. - - Lists _explicit_ [schemas](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#schema) (`"schemaType": "explicit"`) for a bucket. _Explicit_ schemas are used to enforce column names, tags, fields, and data types for your data. By default, buckets have an _implicit_ schema-type (`"schemaType": "implicit"`) that conforms to your data. #### Related guides - [Using bucket schemas](https://www.influxdata.com/blog/new-bucket-schema-option-protect-from-unwanted-schema-changes/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_measurement_schemas(bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: A bucket ID. Lists measurement schemas for the specified bucket. (required) - :param str org: An organization name. Specifies the organization that owns the schema. - :param str org_id: An organization ID. Specifies the organization that owns the schema. - :param str name: A measurement name. Only returns measurement schemas with the specified name. - :return: MeasurementSchemaList - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_measurement_schemas_with_http_info(bucket_id, **kwargs) # noqa: E501 - else: - (data) = self.get_measurement_schemas_with_http_info(bucket_id, **kwargs) # noqa: E501 - return data - - def get_measurement_schemas_with_http_info(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """List measurement schemas of a bucket. - - Lists _explicit_ [schemas](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#schema) (`"schemaType": "explicit"`) for a bucket. _Explicit_ schemas are used to enforce column names, tags, fields, and data types for your data. By default, buckets have an _implicit_ schema-type (`"schemaType": "implicit"`) that conforms to your data. #### Related guides - [Using bucket schemas](https://www.influxdata.com/blog/new-bucket-schema-option-protect-from-unwanted-schema-changes/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_measurement_schemas_with_http_info(bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: A bucket ID. Lists measurement schemas for the specified bucket. (required) - :param str org: An organization name. Specifies the organization that owns the schema. - :param str org_id: An organization ID. Specifies the organization that owns the schema. - :param str name: A measurement name. Only returns measurement schemas with the specified name. - :return: MeasurementSchemaList - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not self._is_cloud_instance(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('BucketSchemasService', - 'https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_measurement_schemas_prepare(bucket_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}/schema/measurements', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='MeasurementSchemaList', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_measurement_schemas_async(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """List measurement schemas of a bucket. - - Lists _explicit_ [schemas](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#schema) (`"schemaType": "explicit"`) for a bucket. _Explicit_ schemas are used to enforce column names, tags, fields, and data types for your data. By default, buckets have an _implicit_ schema-type (`"schemaType": "implicit"`) that conforms to your data. #### Related guides - [Using bucket schemas](https://www.influxdata.com/blog/new-bucket-schema-option-protect-from-unwanted-schema-changes/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: A bucket ID. Lists measurement schemas for the specified bucket. (required) - :param str org: An organization name. Specifies the organization that owns the schema. - :param str org_id: An organization ID. Specifies the organization that owns the schema. - :param str name: A measurement name. Only returns measurement schemas with the specified name. - :return: MeasurementSchemaList - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not await self._is_cloud_instance_async(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('BucketSchemasService', - 'https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_measurement_schemas_prepare(bucket_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}/schema/measurements', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='MeasurementSchemaList', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_measurement_schemas_prepare(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'org', 'org_id', 'name'] # noqa: E501 - self._check_operation_params('get_measurement_schemas', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `get_measurement_schemas`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'name' in local_var_params: - query_params.append(('name', local_var_params['name'])) # noqa: E501 - - header_params = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def update_measurement_schema(self, bucket_id, measurement_id, measurement_schema_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a measurement schema. - - Updates a measurement [schema](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#schema). Use this endpoint to update the fields (`name`, `type`, and `dataType`) of a measurement schema. #### Limitations - You can't update the `name` of a measurement. #### Related guides - [Manage bucket schemas](https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/). - [Using bucket schemas](https://www.influxdata.com/blog/new-bucket-schema-option-protect-from-unwanted-schema-changes/). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.update_measurement_schema(bucket_id, measurement_id, measurement_schema_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: A bucket ID. Specifies the bucket to retrieve schemas for. (required) - :param str measurement_id: A measurement schema ID. Retrieves the specified measurement schema. (required) - :param MeasurementSchemaUpdateRequest measurement_schema_update_request: (required) - :param str org: An organization name. Specifies the organization that owns the schema. - :param str org_id: An organization ID. Specifies the organization that owns the schema. - :return: MeasurementSchema - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.update_measurement_schema_with_http_info(bucket_id, measurement_id, measurement_schema_update_request, **kwargs) # noqa: E501 - else: - (data) = self.update_measurement_schema_with_http_info(bucket_id, measurement_id, measurement_schema_update_request, **kwargs) # noqa: E501 - return data - - def update_measurement_schema_with_http_info(self, bucket_id, measurement_id, measurement_schema_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a measurement schema. - - Updates a measurement [schema](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#schema). Use this endpoint to update the fields (`name`, `type`, and `dataType`) of a measurement schema. #### Limitations - You can't update the `name` of a measurement. #### Related guides - [Manage bucket schemas](https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/). - [Using bucket schemas](https://www.influxdata.com/blog/new-bucket-schema-option-protect-from-unwanted-schema-changes/). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.update_measurement_schema_with_http_info(bucket_id, measurement_id, measurement_schema_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: A bucket ID. Specifies the bucket to retrieve schemas for. (required) - :param str measurement_id: A measurement schema ID. Retrieves the specified measurement schema. (required) - :param MeasurementSchemaUpdateRequest measurement_schema_update_request: (required) - :param str org: An organization name. Specifies the organization that owns the schema. - :param str org_id: An organization ID. Specifies the organization that owns the schema. - :return: MeasurementSchema - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not self._is_cloud_instance(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('BucketSchemasService', - 'https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._update_measurement_schema_prepare(bucket_id, measurement_id, measurement_schema_update_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}/schema/measurements/{measurementID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='MeasurementSchema', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def update_measurement_schema_async(self, bucket_id, measurement_id, measurement_schema_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a measurement schema. - - Updates a measurement [schema](https://docs.influxdata.com/influxdb/cloud/reference/glossary/#schema). Use this endpoint to update the fields (`name`, `type`, and `dataType`) of a measurement schema. #### Limitations - You can't update the `name` of a measurement. #### Related guides - [Manage bucket schemas](https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/). - [Using bucket schemas](https://www.influxdata.com/blog/new-bucket-schema-option-protect-from-unwanted-schema-changes/). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: A bucket ID. Specifies the bucket to retrieve schemas for. (required) - :param str measurement_id: A measurement schema ID. Retrieves the specified measurement schema. (required) - :param MeasurementSchemaUpdateRequest measurement_schema_update_request: (required) - :param str org: An organization name. Specifies the organization that owns the schema. - :param str org_id: An organization ID. Specifies the organization that owns the schema. - :return: MeasurementSchema - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not await self._is_cloud_instance_async(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('BucketSchemasService', - 'https://docs.influxdata.com/influxdb/cloud/organizations/buckets/bucket-schema/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._update_measurement_schema_prepare(bucket_id, measurement_id, measurement_schema_update_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}/schema/measurements/{measurementID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='MeasurementSchema', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _update_measurement_schema_prepare(self, bucket_id, measurement_id, measurement_schema_update_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'measurement_id', 'measurement_schema_update_request', 'org', 'org_id'] # noqa: E501 - self._check_operation_params('update_measurement_schema', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `update_measurement_schema`") # noqa: E501 - # verify the required parameter 'measurement_id' is set - if ('measurement_id' not in local_var_params or - local_var_params['measurement_id'] is None): - raise ValueError("Missing the required parameter `measurement_id` when calling `update_measurement_schema`") # noqa: E501 - # verify the required parameter 'measurement_schema_update_request' is set - if ('measurement_schema_update_request' not in local_var_params or - local_var_params['measurement_schema_update_request'] is None): - raise ValueError("Missing the required parameter `measurement_schema_update_request` when calling `update_measurement_schema`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - if 'measurement_id' in local_var_params: - path_params['measurementID'] = local_var_params['measurement_id'] # noqa: E501 - - query_params = [] - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - - header_params = {} - - body_params = None - if 'measurement_schema_update_request' in local_var_params: - body_params = local_var_params['measurement_schema_update_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/buckets_service.py b/frogpilot/third_party/influxdb_client/service/buckets_service.py deleted file mode 100644 index 05cf0e1f8..000000000 --- a/frogpilot/third_party/influxdb_client/service/buckets_service.py +++ /dev/null @@ -1,1929 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class BucketsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """BucketsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_buckets_id(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """Delete a bucket. - - Deletes a bucket and all associated records. #### InfluxDB Cloud - Does the following when you send a delete request: 1. Validates the request and queues the delete. 2. Returns an HTTP `204` status code if queued; _error_ otherwise. 3. Handles the delete asynchronously. #### InfluxDB OSS - Validates the request, handles the delete synchronously, and then responds with success or failure. #### Limitations - Only one bucket can be deleted per request. #### Related Guides - [Delete a bucket](https://docs.influxdata.com/influxdb/latest/organizations/buckets/delete-bucket/#delete-a-bucket-in-the-influxdb-ui) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_buckets_id(bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: Bucket ID. The ID of the bucket to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_buckets_id_with_http_info(bucket_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_buckets_id_with_http_info(bucket_id, **kwargs) # noqa: E501 - return data - - def delete_buckets_id_with_http_info(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """Delete a bucket. - - Deletes a bucket and all associated records. #### InfluxDB Cloud - Does the following when you send a delete request: 1. Validates the request and queues the delete. 2. Returns an HTTP `204` status code if queued; _error_ otherwise. 3. Handles the delete asynchronously. #### InfluxDB OSS - Validates the request, handles the delete synchronously, and then responds with success or failure. #### Limitations - Only one bucket can be deleted per request. #### Related Guides - [Delete a bucket](https://docs.influxdata.com/influxdb/latest/organizations/buckets/delete-bucket/#delete-a-bucket-in-the-influxdb-ui) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_buckets_id_with_http_info(bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: Bucket ID. The ID of the bucket to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_buckets_id_prepare(bucket_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_buckets_id_async(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """Delete a bucket. - - Deletes a bucket and all associated records. #### InfluxDB Cloud - Does the following when you send a delete request: 1. Validates the request and queues the delete. 2. Returns an HTTP `204` status code if queued; _error_ otherwise. 3. Handles the delete asynchronously. #### InfluxDB OSS - Validates the request, handles the delete synchronously, and then responds with success or failure. #### Limitations - Only one bucket can be deleted per request. #### Related Guides - [Delete a bucket](https://docs.influxdata.com/influxdb/latest/organizations/buckets/delete-bucket/#delete-a-bucket-in-the-influxdb-ui) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: Bucket ID. The ID of the bucket to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_buckets_id_prepare(bucket_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_buckets_id_prepare(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_buckets_id', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `delete_buckets_id`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_buckets_id_labels_id(self, bucket_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a bucket. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_buckets_id_labels_id(bucket_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The bucket ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_buckets_id_labels_id_with_http_info(bucket_id, label_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_buckets_id_labels_id_with_http_info(bucket_id, label_id, **kwargs) # noqa: E501 - return data - - def delete_buckets_id_labels_id_with_http_info(self, bucket_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a bucket. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_buckets_id_labels_id_with_http_info(bucket_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The bucket ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_buckets_id_labels_id_prepare(bucket_id, label_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_buckets_id_labels_id_async(self, bucket_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a bucket. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: The bucket ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_buckets_id_labels_id_prepare(bucket_id, label_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_buckets_id_labels_id_prepare(self, bucket_id, label_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'label_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_buckets_id_labels_id', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `delete_buckets_id_labels_id`") # noqa: E501 - # verify the required parameter 'label_id' is set - if ('label_id' not in local_var_params or - local_var_params['label_id'] is None): - raise ValueError("Missing the required parameter `label_id` when calling `delete_buckets_id_labels_id`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - if 'label_id' in local_var_params: - path_params['labelID'] = local_var_params['label_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_buckets_id_members_id(self, user_id, bucket_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a bucket. - - Removes a member from a bucket. Use this endpoint to remove a user's member privileges from a bucket. This removes the user's `read` and `write` permissions for the bucket. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_buckets_id_members_id(user_id, bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the user to remove. (required) - :param str bucket_id: The ID of the bucket to remove a user from. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_buckets_id_members_id_with_http_info(user_id, bucket_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_buckets_id_members_id_with_http_info(user_id, bucket_id, **kwargs) # noqa: E501 - return data - - def delete_buckets_id_members_id_with_http_info(self, user_id, bucket_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a bucket. - - Removes a member from a bucket. Use this endpoint to remove a user's member privileges from a bucket. This removes the user's `read` and `write` permissions for the bucket. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_buckets_id_members_id_with_http_info(user_id, bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the user to remove. (required) - :param str bucket_id: The ID of the bucket to remove a user from. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_buckets_id_members_id_prepare(user_id, bucket_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}/members/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_buckets_id_members_id_async(self, user_id, bucket_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a bucket. - - Removes a member from a bucket. Use this endpoint to remove a user's member privileges from a bucket. This removes the user's `read` and `write` permissions for the bucket. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of the user to remove. (required) - :param str bucket_id: The ID of the bucket to remove a user from. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_buckets_id_members_id_prepare(user_id, bucket_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}/members/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_buckets_id_members_id_prepare(self, user_id, bucket_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'bucket_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_buckets_id_members_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `delete_buckets_id_members_id`") # noqa: E501 - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `delete_buckets_id_members_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_buckets_id_owners_id(self, user_id, bucket_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a bucket. - - Removes an owner from a bucket. Use this endpoint to remove a user's `owner` role for a bucket. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Owner permissions are separate from API token permissions. - Owner permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to remove an owner from. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_buckets_id_owners_id(user_id, bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the owner to remove. (required) - :param str bucket_id: The ID of the bucket to remove an owner from. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_buckets_id_owners_id_with_http_info(user_id, bucket_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_buckets_id_owners_id_with_http_info(user_id, bucket_id, **kwargs) # noqa: E501 - return data - - def delete_buckets_id_owners_id_with_http_info(self, user_id, bucket_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a bucket. - - Removes an owner from a bucket. Use this endpoint to remove a user's `owner` role for a bucket. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Owner permissions are separate from API token permissions. - Owner permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to remove an owner from. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_buckets_id_owners_id_with_http_info(user_id, bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the owner to remove. (required) - :param str bucket_id: The ID of the bucket to remove an owner from. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_buckets_id_owners_id_prepare(user_id, bucket_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}/owners/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_buckets_id_owners_id_async(self, user_id, bucket_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a bucket. - - Removes an owner from a bucket. Use this endpoint to remove a user's `owner` role for a bucket. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Owner permissions are separate from API token permissions. - Owner permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to remove an owner from. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of the owner to remove. (required) - :param str bucket_id: The ID of the bucket to remove an owner from. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_buckets_id_owners_id_prepare(user_id, bucket_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}/owners/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_buckets_id_owners_id_prepare(self, user_id, bucket_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'bucket_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_buckets_id_owners_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `delete_buckets_id_owners_id`") # noqa: E501 - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `delete_buckets_id_owners_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_buckets(self, **kwargs): # noqa: E501,D401,D403 - """List buckets. - - Lists [buckets](https://docs.influxdata.com/influxdb/latest/reference/glossary/#bucket). InfluxDB retrieves buckets owned by the [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) associated with the authorization ([API token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token)). To limit which buckets are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all buckets up to the default `limit`. #### InfluxDB OSS - If you use an _[operator token](https://docs.influxdata.com/influxdb/latest/security/tokens/#operator-token)_ to authenticate your request, InfluxDB retrieves resources for _all organizations_ in the instance. To retrieve resources for only a specific organization, use the `org` parameter or the `orgID` parameter to specify the organization. #### Required permissions | Action | Permission required | |:--------------------------|:--------------------| | Retrieve _user buckets_ | `read-buckets` | | Retrieve [_system buckets_](https://docs.influxdata.com/influxdb/latest/reference/internals/system-buckets/) | `read-orgs` | #### Related Guides - [Manage buckets](https://docs.influxdata.com/influxdb/latest/organizations/buckets/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_buckets(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param str after: A resource ID to seek from. Returns records created after the specified record; results don't include the specified record. Use `after` instead of the `offset` parameter. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param str org: An organization name. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Lists buckets for the organization associated with the authorization (API token). #### InfluxDB OSS - Lists buckets for the specified organization. - :param str org_id: An organization ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Lists buckets for the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or `orgID` parameter. - Lists buckets for the specified organization. - :param str name: A bucket name. Only returns buckets with the specified name. - :param str id: A bucket ID. Only returns the bucket with the specified ID. - :return: Buckets - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_buckets_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_buckets_with_http_info(**kwargs) # noqa: E501 - return data - - def get_buckets_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List buckets. - - Lists [buckets](https://docs.influxdata.com/influxdb/latest/reference/glossary/#bucket). InfluxDB retrieves buckets owned by the [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) associated with the authorization ([API token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token)). To limit which buckets are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all buckets up to the default `limit`. #### InfluxDB OSS - If you use an _[operator token](https://docs.influxdata.com/influxdb/latest/security/tokens/#operator-token)_ to authenticate your request, InfluxDB retrieves resources for _all organizations_ in the instance. To retrieve resources for only a specific organization, use the `org` parameter or the `orgID` parameter to specify the organization. #### Required permissions | Action | Permission required | |:--------------------------|:--------------------| | Retrieve _user buckets_ | `read-buckets` | | Retrieve [_system buckets_](https://docs.influxdata.com/influxdb/latest/reference/internals/system-buckets/) | `read-orgs` | #### Related Guides - [Manage buckets](https://docs.influxdata.com/influxdb/latest/organizations/buckets/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_buckets_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param str after: A resource ID to seek from. Returns records created after the specified record; results don't include the specified record. Use `after` instead of the `offset` parameter. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param str org: An organization name. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Lists buckets for the organization associated with the authorization (API token). #### InfluxDB OSS - Lists buckets for the specified organization. - :param str org_id: An organization ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Lists buckets for the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or `orgID` parameter. - Lists buckets for the specified organization. - :param str name: A bucket name. Only returns buckets with the specified name. - :param str id: A bucket ID. Only returns the bucket with the specified ID. - :return: Buckets - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_buckets_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Buckets', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_buckets_async(self, **kwargs): # noqa: E501,D401,D403 - """List buckets. - - Lists [buckets](https://docs.influxdata.com/influxdb/latest/reference/glossary/#bucket). InfluxDB retrieves buckets owned by the [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) associated with the authorization ([API token](https://docs.influxdata.com/influxdb/latest/reference/glossary/#token)). To limit which buckets are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all buckets up to the default `limit`. #### InfluxDB OSS - If you use an _[operator token](https://docs.influxdata.com/influxdb/latest/security/tokens/#operator-token)_ to authenticate your request, InfluxDB retrieves resources for _all organizations_ in the instance. To retrieve resources for only a specific organization, use the `org` parameter or the `orgID` parameter to specify the organization. #### Required permissions | Action | Permission required | |:--------------------------|:--------------------| | Retrieve _user buckets_ | `read-buckets` | | Retrieve [_system buckets_](https://docs.influxdata.com/influxdb/latest/reference/internals/system-buckets/) | `read-orgs` | #### Related Guides - [Manage buckets](https://docs.influxdata.com/influxdb/latest/organizations/buckets/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param str after: A resource ID to seek from. Returns records created after the specified record; results don't include the specified record. Use `after` instead of the `offset` parameter. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param str org: An organization name. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Lists buckets for the organization associated with the authorization (API token). #### InfluxDB OSS - Lists buckets for the specified organization. - :param str org_id: An organization ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Lists buckets for the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or `orgID` parameter. - Lists buckets for the specified organization. - :param str name: A bucket name. Only returns buckets with the specified name. - :param str id: A bucket ID. Only returns the bucket with the specified ID. - :return: Buckets - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_buckets_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Buckets', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_buckets_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'offset', 'limit', 'after', 'org', 'org_id', 'name', 'id'] # noqa: E501 - self._check_operation_params('get_buckets', all_params, local_var_params) - - if 'offset' in local_var_params and local_var_params['offset'] < 0: # noqa: E501 - raise ValueError("Invalid value for parameter `offset` when calling `get_buckets`, must be a value greater than or equal to `0`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] > 100: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_buckets`, must be a value less than or equal to `100`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] < 1: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_buckets`, must be a value greater than or equal to `1`") # noqa: E501 - path_params = {} - - query_params = [] - if 'offset' in local_var_params: - query_params.append(('offset', local_var_params['offset'])) # noqa: E501 - if 'limit' in local_var_params: - query_params.append(('limit', local_var_params['limit'])) # noqa: E501 - if 'after' in local_var_params: - query_params.append(('after', local_var_params['after'])) # noqa: E501 - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'name' in local_var_params: - query_params.append(('name', local_var_params['name'])) # noqa: E501 - if 'id' in local_var_params: - query_params.append(('id', local_var_params['id'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_buckets_id(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a bucket. - - Retrieves a bucket. Use this endpoint to retrieve information for a specific bucket. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_buckets_id(bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Bucket - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_buckets_id_with_http_info(bucket_id, **kwargs) # noqa: E501 - else: - (data) = self.get_buckets_id_with_http_info(bucket_id, **kwargs) # noqa: E501 - return data - - def get_buckets_id_with_http_info(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a bucket. - - Retrieves a bucket. Use this endpoint to retrieve information for a specific bucket. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_buckets_id_with_http_info(bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Bucket - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_buckets_id_prepare(bucket_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Bucket', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_buckets_id_async(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a bucket. - - Retrieves a bucket. Use this endpoint to retrieve information for a specific bucket. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Bucket - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_buckets_id_prepare(bucket_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Bucket', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_buckets_id_prepare(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_buckets_id', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `get_buckets_id`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_buckets_id_labels(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a bucket. - - Lists all labels for a bucket. Labels are objects that contain `labelID`, `name`, `description`, and `color` key-value pairs. They may be used for grouping and filtering InfluxDB resources. Labels are also capable of grouping across different resources--for example, you can apply a label named `air_sensor` to a bucket and a task to quickly organize resources. #### Related guides - Use the [`/api/v2/labels` InfluxDB API endpoint](#tag/Labels) to retrieve and manage labels. - [Manage labels in the InfluxDB UI](https://docs.influxdata.com/influxdb/latest/visualize-data/labels/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_buckets_id_labels(bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve labels for. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_buckets_id_labels_with_http_info(bucket_id, **kwargs) # noqa: E501 - else: - (data) = self.get_buckets_id_labels_with_http_info(bucket_id, **kwargs) # noqa: E501 - return data - - def get_buckets_id_labels_with_http_info(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a bucket. - - Lists all labels for a bucket. Labels are objects that contain `labelID`, `name`, `description`, and `color` key-value pairs. They may be used for grouping and filtering InfluxDB resources. Labels are also capable of grouping across different resources--for example, you can apply a label named `air_sensor` to a bucket and a task to quickly organize resources. #### Related guides - Use the [`/api/v2/labels` InfluxDB API endpoint](#tag/Labels) to retrieve and manage labels. - [Manage labels in the InfluxDB UI](https://docs.influxdata.com/influxdb/latest/visualize-data/labels/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_buckets_id_labels_with_http_info(bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve labels for. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_buckets_id_labels_prepare(bucket_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_buckets_id_labels_async(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a bucket. - - Lists all labels for a bucket. Labels are objects that contain `labelID`, `name`, `description`, and `color` key-value pairs. They may be used for grouping and filtering InfluxDB resources. Labels are also capable of grouping across different resources--for example, you can apply a label named `air_sensor` to a bucket and a task to quickly organize resources. #### Related guides - Use the [`/api/v2/labels` InfluxDB API endpoint](#tag/Labels) to retrieve and manage labels. - [Manage labels in the InfluxDB UI](https://docs.influxdata.com/influxdb/latest/visualize-data/labels/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve labels for. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_buckets_id_labels_prepare(bucket_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_buckets_id_labels_prepare(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_buckets_id_labels', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `get_buckets_id_labels`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_buckets_id_members(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """List all users with member privileges for a bucket. - - Lists all users for a bucket. InfluxDB [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) have permission to access InfluxDB. [Members](https://docs.influxdata.com/influxdb/latest/reference/glossary/#member) are users in an organization with access to the specified resource. Use this endpoint to retrieve all users with access to a bucket. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_buckets_id_members(bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve users for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_buckets_id_members_with_http_info(bucket_id, **kwargs) # noqa: E501 - else: - (data) = self.get_buckets_id_members_with_http_info(bucket_id, **kwargs) # noqa: E501 - return data - - def get_buckets_id_members_with_http_info(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """List all users with member privileges for a bucket. - - Lists all users for a bucket. InfluxDB [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) have permission to access InfluxDB. [Members](https://docs.influxdata.com/influxdb/latest/reference/glossary/#member) are users in an organization with access to the specified resource. Use this endpoint to retrieve all users with access to a bucket. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_buckets_id_members_with_http_info(bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve users for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_buckets_id_members_prepare(bucket_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}/members', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMembers', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_buckets_id_members_async(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """List all users with member privileges for a bucket. - - Lists all users for a bucket. InfluxDB [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) have permission to access InfluxDB. [Members](https://docs.influxdata.com/influxdb/latest/reference/glossary/#member) are users in an organization with access to the specified resource. Use this endpoint to retrieve all users with access to a bucket. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve users for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_buckets_id_members_prepare(bucket_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}/members', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMembers', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_buckets_id_members_prepare(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_buckets_id_members', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `get_buckets_id_members`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_buckets_id_owners(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of a bucket. - - Lists all [owners](https://docs.influxdata.com/influxdb/latest/reference/glossary/#owner) of a bucket. Bucket owners have permission to delete buckets and remove user and member permissions from the bucket. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Owner permissions are separate from API token permissions. - Owner permissions are used in the context of the InfluxDB UI. #### Required permissions - `read-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to retrieve a list of owners for. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_buckets_id_owners(bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve owners for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_buckets_id_owners_with_http_info(bucket_id, **kwargs) # noqa: E501 - else: - (data) = self.get_buckets_id_owners_with_http_info(bucket_id, **kwargs) # noqa: E501 - return data - - def get_buckets_id_owners_with_http_info(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of a bucket. - - Lists all [owners](https://docs.influxdata.com/influxdb/latest/reference/glossary/#owner) of a bucket. Bucket owners have permission to delete buckets and remove user and member permissions from the bucket. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Owner permissions are separate from API token permissions. - Owner permissions are used in the context of the InfluxDB UI. #### Required permissions - `read-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to retrieve a list of owners for. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_buckets_id_owners_with_http_info(bucket_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve owners for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_buckets_id_owners_prepare(bucket_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}/owners', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwners', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_buckets_id_owners_async(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of a bucket. - - Lists all [owners](https://docs.influxdata.com/influxdb/latest/reference/glossary/#owner) of a bucket. Bucket owners have permission to delete buckets and remove user and member permissions from the bucket. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Owner permissions are separate from API token permissions. - Owner permissions are used in the context of the InfluxDB UI. #### Required permissions - `read-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to retrieve a list of owners for. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve owners for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_buckets_id_owners_prepare(bucket_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}/owners', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwners', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_buckets_id_owners_prepare(self, bucket_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_buckets_id_owners', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `get_buckets_id_owners`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_sources_id_buckets(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Get buckets in a source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_sources_id_buckets(source_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str org: The name of the organization. - :return: Buckets - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_sources_id_buckets_with_http_info(source_id, **kwargs) # noqa: E501 - else: - (data) = self.get_sources_id_buckets_with_http_info(source_id, **kwargs) # noqa: E501 - return data - - def get_sources_id_buckets_with_http_info(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Get buckets in a source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_sources_id_buckets_with_http_info(source_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str org: The name of the organization. - :return: Buckets - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_sources_id_buckets_prepare(source_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/sources/{sourceID}/buckets', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Buckets', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_sources_id_buckets_async(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Get buckets in a source. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str org: The name of the organization. - :return: Buckets - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_sources_id_buckets_prepare(source_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/sources/{sourceID}/buckets', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Buckets', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_sources_id_buckets_prepare(self, source_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['source_id', 'zap_trace_span', 'org'] # noqa: E501 - self._check_operation_params('get_sources_id_buckets', all_params, local_var_params) - # verify the required parameter 'source_id' is set - if ('source_id' not in local_var_params or - local_var_params['source_id'] is None): - raise ValueError("Missing the required parameter `source_id` when calling `get_sources_id_buckets`") # noqa: E501 - - path_params = {} - if 'source_id' in local_var_params: - path_params['sourceID'] = local_var_params['source_id'] # noqa: E501 - - query_params = [] - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_buckets_id(self, bucket_id, patch_bucket_request, **kwargs): # noqa: E501,D401,D403 - """Update a bucket. - - Updates a bucket. Use this endpoint to update properties (`name`, `description`, and `retentionRules`) of a bucket. #### InfluxDB Cloud - Requires the `retentionRules` property in the request body. If you don't provide `retentionRules`, InfluxDB responds with an HTTP `403` status code. #### InfluxDB OSS - Doesn't require `retentionRules`. #### Related Guides - [Update a bucket](https://docs.influxdata.com/influxdb/latest/organizations/buckets/update-bucket/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_buckets_id(bucket_id, patch_bucket_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The bucket ID. (required) - :param PatchBucketRequest patch_bucket_request: The bucket update to apply. (required) - :param str zap_trace_span: OpenTracing span context - :return: Bucket - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_buckets_id_with_http_info(bucket_id, patch_bucket_request, **kwargs) # noqa: E501 - else: - (data) = self.patch_buckets_id_with_http_info(bucket_id, patch_bucket_request, **kwargs) # noqa: E501 - return data - - def patch_buckets_id_with_http_info(self, bucket_id, patch_bucket_request, **kwargs): # noqa: E501,D401,D403 - """Update a bucket. - - Updates a bucket. Use this endpoint to update properties (`name`, `description`, and `retentionRules`) of a bucket. #### InfluxDB Cloud - Requires the `retentionRules` property in the request body. If you don't provide `retentionRules`, InfluxDB responds with an HTTP `403` status code. #### InfluxDB OSS - Doesn't require `retentionRules`. #### Related Guides - [Update a bucket](https://docs.influxdata.com/influxdb/latest/organizations/buckets/update-bucket/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_buckets_id_with_http_info(bucket_id, patch_bucket_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The bucket ID. (required) - :param PatchBucketRequest patch_bucket_request: The bucket update to apply. (required) - :param str zap_trace_span: OpenTracing span context - :return: Bucket - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_buckets_id_prepare(bucket_id, patch_bucket_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Bucket', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_buckets_id_async(self, bucket_id, patch_bucket_request, **kwargs): # noqa: E501,D401,D403 - """Update a bucket. - - Updates a bucket. Use this endpoint to update properties (`name`, `description`, and `retentionRules`) of a bucket. #### InfluxDB Cloud - Requires the `retentionRules` property in the request body. If you don't provide `retentionRules`, InfluxDB responds with an HTTP `403` status code. #### InfluxDB OSS - Doesn't require `retentionRules`. #### Related Guides - [Update a bucket](https://docs.influxdata.com/influxdb/latest/organizations/buckets/update-bucket/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: The bucket ID. (required) - :param PatchBucketRequest patch_bucket_request: The bucket update to apply. (required) - :param str zap_trace_span: OpenTracing span context - :return: Bucket - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_buckets_id_prepare(bucket_id, patch_bucket_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Bucket', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_buckets_id_prepare(self, bucket_id, patch_bucket_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'patch_bucket_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_buckets_id', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `patch_buckets_id`") # noqa: E501 - # verify the required parameter 'patch_bucket_request' is set - if ('patch_bucket_request' not in local_var_params or - local_var_params['patch_bucket_request'] is None): - raise ValueError("Missing the required parameter `patch_bucket_request` when calling `patch_buckets_id`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'patch_bucket_request' in local_var_params: - body_params = local_var_params['patch_bucket_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_buckets(self, post_bucket_request, **kwargs): # noqa: E501,D401,D403 - """Create a bucket. - - Creates a [bucket](https://docs.influxdata.com/influxdb/latest/reference/glossary/#bucket) and returns the bucket resource. The default data [retention period](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-period) is 30 days. #### InfluxDB OSS - A single InfluxDB OSS instance supports active writes or queries for approximately 20 buckets across all organizations at a given time. Reading or writing to more than 20 buckets at a time can adversely affect performance. #### Limitations - InfluxDB Cloud Free Plan allows users to create up to two buckets. Exceeding the bucket quota will result in an HTTP `403` status code. For additional information regarding InfluxDB Cloud offerings, see [InfluxDB Cloud Pricing](https://www.influxdata.com/influxdb-cloud-pricing/). #### Related Guides - [Create a bucket](https://docs.influxdata.com/influxdb/latest/organizations/buckets/create-bucket/) - [Create bucket CLI reference](https://docs.influxdata.com/influxdb/latest/reference/cli/influx/bucket/create) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_buckets(post_bucket_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PostBucketRequest post_bucket_request: The bucket to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: Bucket - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_buckets_with_http_info(post_bucket_request, **kwargs) # noqa: E501 - else: - (data) = self.post_buckets_with_http_info(post_bucket_request, **kwargs) # noqa: E501 - return data - - def post_buckets_with_http_info(self, post_bucket_request, **kwargs): # noqa: E501,D401,D403 - """Create a bucket. - - Creates a [bucket](https://docs.influxdata.com/influxdb/latest/reference/glossary/#bucket) and returns the bucket resource. The default data [retention period](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-period) is 30 days. #### InfluxDB OSS - A single InfluxDB OSS instance supports active writes or queries for approximately 20 buckets across all organizations at a given time. Reading or writing to more than 20 buckets at a time can adversely affect performance. #### Limitations - InfluxDB Cloud Free Plan allows users to create up to two buckets. Exceeding the bucket quota will result in an HTTP `403` status code. For additional information regarding InfluxDB Cloud offerings, see [InfluxDB Cloud Pricing](https://www.influxdata.com/influxdb-cloud-pricing/). #### Related Guides - [Create a bucket](https://docs.influxdata.com/influxdb/latest/organizations/buckets/create-bucket/) - [Create bucket CLI reference](https://docs.influxdata.com/influxdb/latest/reference/cli/influx/bucket/create) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_buckets_with_http_info(post_bucket_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PostBucketRequest post_bucket_request: The bucket to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: Bucket - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_buckets_prepare(post_bucket_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Bucket', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_buckets_async(self, post_bucket_request, **kwargs): # noqa: E501,D401,D403 - """Create a bucket. - - Creates a [bucket](https://docs.influxdata.com/influxdb/latest/reference/glossary/#bucket) and returns the bucket resource. The default data [retention period](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-period) is 30 days. #### InfluxDB OSS - A single InfluxDB OSS instance supports active writes or queries for approximately 20 buckets across all organizations at a given time. Reading or writing to more than 20 buckets at a time can adversely affect performance. #### Limitations - InfluxDB Cloud Free Plan allows users to create up to two buckets. Exceeding the bucket quota will result in an HTTP `403` status code. For additional information regarding InfluxDB Cloud offerings, see [InfluxDB Cloud Pricing](https://www.influxdata.com/influxdb-cloud-pricing/). #### Related Guides - [Create a bucket](https://docs.influxdata.com/influxdb/latest/organizations/buckets/create-bucket/) - [Create bucket CLI reference](https://docs.influxdata.com/influxdb/latest/reference/cli/influx/bucket/create) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param PostBucketRequest post_bucket_request: The bucket to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: Bucket - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_buckets_prepare(post_bucket_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Bucket', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_buckets_prepare(self, post_bucket_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['post_bucket_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_buckets', all_params, local_var_params) - # verify the required parameter 'post_bucket_request' is set - if ('post_bucket_request' not in local_var_params or - local_var_params['post_bucket_request'] is None): - raise ValueError("Missing the required parameter `post_bucket_request` when calling `post_buckets`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'post_bucket_request' in local_var_params: - body_params = local_var_params['post_bucket_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_buckets_id_labels(self, bucket_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a bucket. - - Adds a label to a bucket and returns the new label information. Labels are objects that contain `labelID`, `name`, `description`, and `color` key-value pairs. They may be used for grouping and filtering across one or more kinds of **resources**--for example, you can apply a label named `air_sensor` to a bucket and a task to quickly organize resources. #### Limitations - Before adding a label to a bucket, you must create the label if you haven't already. To create a label with the InfluxDB API, send a `POST` request to the [`/api/v2/labels` endpoint](#operation/PostLabels)). #### Related guides - Use the [`/api/v2/labels` InfluxDB API endpoint](#tag/Labels) to retrieve and manage labels. - [Manage labels in the InfluxDB UI](https://docs.influxdata.com/influxdb/latest/visualize-data/labels/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_buckets_id_labels(bucket_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: Bucket ID. The ID of the bucket to label. (required) - :param LabelMapping label_mapping: An object that contains a _`labelID`_ to add to the bucket. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_buckets_id_labels_with_http_info(bucket_id, label_mapping, **kwargs) # noqa: E501 - else: - (data) = self.post_buckets_id_labels_with_http_info(bucket_id, label_mapping, **kwargs) # noqa: E501 - return data - - def post_buckets_id_labels_with_http_info(self, bucket_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a bucket. - - Adds a label to a bucket and returns the new label information. Labels are objects that contain `labelID`, `name`, `description`, and `color` key-value pairs. They may be used for grouping and filtering across one or more kinds of **resources**--for example, you can apply a label named `air_sensor` to a bucket and a task to quickly organize resources. #### Limitations - Before adding a label to a bucket, you must create the label if you haven't already. To create a label with the InfluxDB API, send a `POST` request to the [`/api/v2/labels` endpoint](#operation/PostLabels)). #### Related guides - Use the [`/api/v2/labels` InfluxDB API endpoint](#tag/Labels) to retrieve and manage labels. - [Manage labels in the InfluxDB UI](https://docs.influxdata.com/influxdb/latest/visualize-data/labels/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_buckets_id_labels_with_http_info(bucket_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: Bucket ID. The ID of the bucket to label. (required) - :param LabelMapping label_mapping: An object that contains a _`labelID`_ to add to the bucket. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_buckets_id_labels_prepare(bucket_id, label_mapping, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_buckets_id_labels_async(self, bucket_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a bucket. - - Adds a label to a bucket and returns the new label information. Labels are objects that contain `labelID`, `name`, `description`, and `color` key-value pairs. They may be used for grouping and filtering across one or more kinds of **resources**--for example, you can apply a label named `air_sensor` to a bucket and a task to quickly organize resources. #### Limitations - Before adding a label to a bucket, you must create the label if you haven't already. To create a label with the InfluxDB API, send a `POST` request to the [`/api/v2/labels` endpoint](#operation/PostLabels)). #### Related guides - Use the [`/api/v2/labels` InfluxDB API endpoint](#tag/Labels) to retrieve and manage labels. - [Manage labels in the InfluxDB UI](https://docs.influxdata.com/influxdb/latest/visualize-data/labels/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: Bucket ID. The ID of the bucket to label. (required) - :param LabelMapping label_mapping: An object that contains a _`labelID`_ to add to the bucket. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_buckets_id_labels_prepare(bucket_id, label_mapping, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_buckets_id_labels_prepare(self, bucket_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'label_mapping', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_buckets_id_labels', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `post_buckets_id_labels`") # noqa: E501 - # verify the required parameter 'label_mapping' is set - if ('label_mapping' not in local_var_params or - local_var_params['label_mapping'] is None): - raise ValueError("Missing the required parameter `label_mapping` when calling `post_buckets_id_labels`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'label_mapping' in local_var_params: - body_params = local_var_params['label_mapping'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_buckets_id_members(self, bucket_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a bucket. - - Add a user to a bucket and return the new user information. InfluxDB [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) have permission to access InfluxDB. [Members](https://docs.influxdata.com/influxdb/latest/reference/glossary/#member) are users in an organization. Use this endpoint to give a user member privileges to a bucket. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_buckets_id_members(bucket_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve users for. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: A user to add as a member to the bucket. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_buckets_id_members_with_http_info(bucket_id, add_resource_member_request_body, **kwargs) # noqa: E501 - else: - (data) = self.post_buckets_id_members_with_http_info(bucket_id, add_resource_member_request_body, **kwargs) # noqa: E501 - return data - - def post_buckets_id_members_with_http_info(self, bucket_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a bucket. - - Add a user to a bucket and return the new user information. InfluxDB [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) have permission to access InfluxDB. [Members](https://docs.influxdata.com/influxdb/latest/reference/glossary/#member) are users in an organization. Use this endpoint to give a user member privileges to a bucket. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_buckets_id_members_with_http_info(bucket_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve users for. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: A user to add as a member to the bucket. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_buckets_id_members_prepare(bucket_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}/members', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMember', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_buckets_id_members_async(self, bucket_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a bucket. - - Add a user to a bucket and return the new user information. InfluxDB [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) have permission to access InfluxDB. [Members](https://docs.influxdata.com/influxdb/latest/reference/glossary/#member) are users in an organization. Use this endpoint to give a user member privileges to a bucket. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: The ID of the bucket to retrieve users for. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: A user to add as a member to the bucket. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_buckets_id_members_prepare(bucket_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}/members', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMember', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_buckets_id_members_prepare(self, bucket_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'add_resource_member_request_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_buckets_id_members', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `post_buckets_id_members`") # noqa: E501 - # verify the required parameter 'add_resource_member_request_body' is set - if ('add_resource_member_request_body' not in local_var_params or - local_var_params['add_resource_member_request_body'] is None): - raise ValueError("Missing the required parameter `add_resource_member_request_body` when calling `post_buckets_id_members`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'add_resource_member_request_body' in local_var_params: - body_params = local_var_params['add_resource_member_request_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_buckets_id_owners(self, bucket_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to a bucket. - - Adds an owner to a bucket and returns the [owners](https://docs.influxdata.com/influxdb/latest/reference/glossary/#owner) with role and user detail. Use this endpoint to create a _resource owner_ for the bucket. Bucket owners have permission to delete buckets and remove user and member permissions from the bucket. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Owner permissions are separate from API token permissions. - Owner permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to add an owner for. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_buckets_id_owners(bucket_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The ID of the bucket to add an owner for. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: A user to add as an owner for the bucket. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_buckets_id_owners_with_http_info(bucket_id, add_resource_member_request_body, **kwargs) # noqa: E501 - else: - (data) = self.post_buckets_id_owners_with_http_info(bucket_id, add_resource_member_request_body, **kwargs) # noqa: E501 - return data - - def post_buckets_id_owners_with_http_info(self, bucket_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to a bucket. - - Adds an owner to a bucket and returns the [owners](https://docs.influxdata.com/influxdb/latest/reference/glossary/#owner) with role and user detail. Use this endpoint to create a _resource owner_ for the bucket. Bucket owners have permission to delete buckets and remove user and member permissions from the bucket. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Owner permissions are separate from API token permissions. - Owner permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to add an owner for. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_buckets_id_owners_with_http_info(bucket_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The ID of the bucket to add an owner for. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: A user to add as an owner for the bucket. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_buckets_id_owners_prepare(bucket_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/buckets/{bucketID}/owners', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwner', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_buckets_id_owners_async(self, bucket_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to a bucket. - - Adds an owner to a bucket and returns the [owners](https://docs.influxdata.com/influxdb/latest/reference/glossary/#owner) with role and user detail. Use this endpoint to create a _resource owner_ for the bucket. Bucket owners have permission to delete buckets and remove user and member permissions from the bucket. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Owner permissions are separate from API token permissions. - Owner permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to add an owner for. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: The ID of the bucket to add an owner for. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: A user to add as an owner for the bucket. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_buckets_id_owners_prepare(bucket_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/buckets/{bucketID}/owners', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwner', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_buckets_id_owners_prepare(self, bucket_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'add_resource_member_request_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_buckets_id_owners', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `post_buckets_id_owners`") # noqa: E501 - # verify the required parameter 'add_resource_member_request_body' is set - if ('add_resource_member_request_body' not in local_var_params or - local_var_params['add_resource_member_request_body'] is None): - raise ValueError("Missing the required parameter `add_resource_member_request_body` when calling `post_buckets_id_owners`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'add_resource_member_request_body' in local_var_params: - body_params = local_var_params['add_resource_member_request_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/cells_service.py b/frogpilot/third_party/influxdb_client/service/cells_service.py deleted file mode 100644 index 13c811b5d..000000000 --- a/frogpilot/third_party/influxdb_client/service/cells_service.py +++ /dev/null @@ -1,820 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class CellsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """CellsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_dashboards_id_cells_id(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Delete a dashboard cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dashboards_id_cells_id(dashboard_id, cell_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to delete. (required) - :param str cell_id: The ID of the cell to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_dashboards_id_cells_id_with_http_info(dashboard_id, cell_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_dashboards_id_cells_id_with_http_info(dashboard_id, cell_id, **kwargs) # noqa: E501 - return data - - def delete_dashboards_id_cells_id_with_http_info(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Delete a dashboard cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dashboards_id_cells_id_with_http_info(dashboard_id, cell_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to delete. (required) - :param str cell_id: The ID of the cell to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dashboards_id_cells_id_prepare(dashboard_id, cell_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_dashboards_id_cells_id_async(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Delete a dashboard cell. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to delete. (required) - :param str cell_id: The ID of the cell to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dashboards_id_cells_id_prepare(dashboard_id, cell_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_dashboards_id_cells_id_prepare(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'cell_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_dashboards_id_cells_id', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `delete_dashboards_id_cells_id`") # noqa: E501 - # verify the required parameter 'cell_id' is set - if ('cell_id' not in local_var_params or - local_var_params['cell_id'] is None): - raise ValueError("Missing the required parameter `cell_id` when calling `delete_dashboards_id_cells_id`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - if 'cell_id' in local_var_params: - path_params['cellID'] = local_var_params['cell_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_dashboards_id_cells_id_view(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve the view for a cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id_cells_id_view(dashboard_id, cell_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str cell_id: The cell ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, **kwargs) # noqa: E501 - else: - (data) = self.get_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, **kwargs) # noqa: E501 - return data - - def get_dashboards_id_cells_id_view_with_http_info(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve the view for a cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str cell_id: The cell ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_cells_id_view_prepare(dashboard_id, cell_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}/view', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='View', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_dashboards_id_cells_id_view_async(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve the view for a cell. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str cell_id: The cell ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_cells_id_view_prepare(dashboard_id, cell_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}/view', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='View', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_dashboards_id_cells_id_view_prepare(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'cell_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_dashboards_id_cells_id_view', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `get_dashboards_id_cells_id_view`") # noqa: E501 - # verify the required parameter 'cell_id' is set - if ('cell_id' not in local_var_params or - local_var_params['cell_id'] is None): - raise ValueError("Missing the required parameter `cell_id` when calling `get_dashboards_id_cells_id_view`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - if 'cell_id' in local_var_params: - path_params['cellID'] = local_var_params['cell_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_dashboards_id_cells_id(self, dashboard_id, cell_id, cell_update, **kwargs): # noqa: E501,D401,D403 - """Update the non-positional information related to a cell. - - Updates the non positional information related to a cell. Updates to a single cell's positional data could cause grid conflicts. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dashboards_id_cells_id(dashboard_id, cell_id, cell_update, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param CellUpdate cell_update: (required) - :param str zap_trace_span: OpenTracing span context - :return: Cell - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_dashboards_id_cells_id_with_http_info(dashboard_id, cell_id, cell_update, **kwargs) # noqa: E501 - else: - (data) = self.patch_dashboards_id_cells_id_with_http_info(dashboard_id, cell_id, cell_update, **kwargs) # noqa: E501 - return data - - def patch_dashboards_id_cells_id_with_http_info(self, dashboard_id, cell_id, cell_update, **kwargs): # noqa: E501,D401,D403 - """Update the non-positional information related to a cell. - - Updates the non positional information related to a cell. Updates to a single cell's positional data could cause grid conflicts. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dashboards_id_cells_id_with_http_info(dashboard_id, cell_id, cell_update, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param CellUpdate cell_update: (required) - :param str zap_trace_span: OpenTracing span context - :return: Cell - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dashboards_id_cells_id_prepare(dashboard_id, cell_id, cell_update, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Cell', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_dashboards_id_cells_id_async(self, dashboard_id, cell_id, cell_update, **kwargs): # noqa: E501,D401,D403 - """Update the non-positional information related to a cell. - - Updates the non positional information related to a cell. Updates to a single cell's positional data could cause grid conflicts. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param CellUpdate cell_update: (required) - :param str zap_trace_span: OpenTracing span context - :return: Cell - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dashboards_id_cells_id_prepare(dashboard_id, cell_id, cell_update, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Cell', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_dashboards_id_cells_id_prepare(self, dashboard_id, cell_id, cell_update, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'cell_id', 'cell_update', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_dashboards_id_cells_id', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `patch_dashboards_id_cells_id`") # noqa: E501 - # verify the required parameter 'cell_id' is set - if ('cell_id' not in local_var_params or - local_var_params['cell_id'] is None): - raise ValueError("Missing the required parameter `cell_id` when calling `patch_dashboards_id_cells_id`") # noqa: E501 - # verify the required parameter 'cell_update' is set - if ('cell_update' not in local_var_params or - local_var_params['cell_update'] is None): - raise ValueError("Missing the required parameter `cell_update` when calling `patch_dashboards_id_cells_id`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - if 'cell_id' in local_var_params: - path_params['cellID'] = local_var_params['cell_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'cell_update' in local_var_params: - body_params = local_var_params['cell_update'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_dashboards_id_cells_id_view(self, dashboard_id, cell_id, view, **kwargs): # noqa: E501,D401,D403 - """Update the view for a cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dashboards_id_cells_id_view(dashboard_id, cell_id, view, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param View view: (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, view, **kwargs) # noqa: E501 - else: - (data) = self.patch_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, view, **kwargs) # noqa: E501 - return data - - def patch_dashboards_id_cells_id_view_with_http_info(self, dashboard_id, cell_id, view, **kwargs): # noqa: E501,D401,D403 - """Update the view for a cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, view, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param View view: (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dashboards_id_cells_id_view_prepare(dashboard_id, cell_id, view, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}/view', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='View', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_dashboards_id_cells_id_view_async(self, dashboard_id, cell_id, view, **kwargs): # noqa: E501,D401,D403 - """Update the view for a cell. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param View view: (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dashboards_id_cells_id_view_prepare(dashboard_id, cell_id, view, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}/view', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='View', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_dashboards_id_cells_id_view_prepare(self, dashboard_id, cell_id, view, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'cell_id', 'view', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_dashboards_id_cells_id_view', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `patch_dashboards_id_cells_id_view`") # noqa: E501 - # verify the required parameter 'cell_id' is set - if ('cell_id' not in local_var_params or - local_var_params['cell_id'] is None): - raise ValueError("Missing the required parameter `cell_id` when calling `patch_dashboards_id_cells_id_view`") # noqa: E501 - # verify the required parameter 'view' is set - if ('view' not in local_var_params or - local_var_params['view'] is None): - raise ValueError("Missing the required parameter `view` when calling `patch_dashboards_id_cells_id_view`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - if 'cell_id' in local_var_params: - path_params['cellID'] = local_var_params['cell_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'view' in local_var_params: - body_params = local_var_params['view'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_dashboards_id_cells(self, dashboard_id, create_cell, **kwargs): # noqa: E501,D401,D403 - """Create a dashboard cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dashboards_id_cells(dashboard_id, create_cell, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param CreateCell create_cell: Cell that will be added (required) - :param str zap_trace_span: OpenTracing span context - :return: Cell - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_dashboards_id_cells_with_http_info(dashboard_id, create_cell, **kwargs) # noqa: E501 - else: - (data) = self.post_dashboards_id_cells_with_http_info(dashboard_id, create_cell, **kwargs) # noqa: E501 - return data - - def post_dashboards_id_cells_with_http_info(self, dashboard_id, create_cell, **kwargs): # noqa: E501,D401,D403 - """Create a dashboard cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dashboards_id_cells_with_http_info(dashboard_id, create_cell, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param CreateCell create_cell: Cell that will be added (required) - :param str zap_trace_span: OpenTracing span context - :return: Cell - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dashboards_id_cells_prepare(dashboard_id, create_cell, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Cell', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_dashboards_id_cells_async(self, dashboard_id, create_cell, **kwargs): # noqa: E501,D401,D403 - """Create a dashboard cell. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param CreateCell create_cell: Cell that will be added (required) - :param str zap_trace_span: OpenTracing span context - :return: Cell - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dashboards_id_cells_prepare(dashboard_id, create_cell, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Cell', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_dashboards_id_cells_prepare(self, dashboard_id, create_cell, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'create_cell', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_dashboards_id_cells', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `post_dashboards_id_cells`") # noqa: E501 - # verify the required parameter 'create_cell' is set - if ('create_cell' not in local_var_params or - local_var_params['create_cell'] is None): - raise ValueError("Missing the required parameter `create_cell` when calling `post_dashboards_id_cells`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'create_cell' in local_var_params: - body_params = local_var_params['create_cell'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def put_dashboards_id_cells(self, dashboard_id, cell, **kwargs): # noqa: E501,D401,D403 - """Replace cells in a dashboard. - - Replaces all cells in a dashboard. This is used primarily to update the positional information of all cells. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_dashboards_id_cells(dashboard_id, cell, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param list[Cell] cell: (required) - :param str zap_trace_span: OpenTracing span context - :return: Dashboard - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.put_dashboards_id_cells_with_http_info(dashboard_id, cell, **kwargs) # noqa: E501 - else: - (data) = self.put_dashboards_id_cells_with_http_info(dashboard_id, cell, **kwargs) # noqa: E501 - return data - - def put_dashboards_id_cells_with_http_info(self, dashboard_id, cell, **kwargs): # noqa: E501,D401,D403 - """Replace cells in a dashboard. - - Replaces all cells in a dashboard. This is used primarily to update the positional information of all cells. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_dashboards_id_cells_with_http_info(dashboard_id, cell, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param list[Cell] cell: (required) - :param str zap_trace_span: OpenTracing span context - :return: Dashboard - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_dashboards_id_cells_prepare(dashboard_id, cell, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Dashboard', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def put_dashboards_id_cells_async(self, dashboard_id, cell, **kwargs): # noqa: E501,D401,D403 - """Replace cells in a dashboard. - - Replaces all cells in a dashboard. This is used primarily to update the positional information of all cells. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param list[Cell] cell: (required) - :param str zap_trace_span: OpenTracing span context - :return: Dashboard - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_dashboards_id_cells_prepare(dashboard_id, cell, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Dashboard', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _put_dashboards_id_cells_prepare(self, dashboard_id, cell, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'cell', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('put_dashboards_id_cells', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `put_dashboards_id_cells`") # noqa: E501 - # verify the required parameter 'cell' is set - if ('cell' not in local_var_params or - local_var_params['cell'] is None): - raise ValueError("Missing the required parameter `cell` when calling `put_dashboards_id_cells`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'cell' in local_var_params: - body_params = local_var_params['cell'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/checks_service.py b/frogpilot/third_party/influxdb_client/service/checks_service.py deleted file mode 100644 index 2c780f351..000000000 --- a/frogpilot/third_party/influxdb_client/service/checks_service.py +++ /dev/null @@ -1,1253 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class ChecksService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """ChecksService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def create_check(self, post_check, **kwargs): # noqa: E501,D401,D403 - """Add new check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.create_check(post_check, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PostCheck post_check: Check to create (required) - :return: Check - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.create_check_with_http_info(post_check, **kwargs) # noqa: E501 - else: - (data) = self.create_check_with_http_info(post_check, **kwargs) # noqa: E501 - return data - - def create_check_with_http_info(self, post_check, **kwargs): # noqa: E501,D401,D403 - """Add new check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.create_check_with_http_info(post_check, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PostCheck post_check: Check to create (required) - :return: Check - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._create_check_prepare(post_check, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/checks', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Check', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def create_check_async(self, post_check, **kwargs): # noqa: E501,D401,D403 - """Add new check. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param PostCheck post_check: Check to create (required) - :return: Check - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._create_check_prepare(post_check, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/checks', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Check', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _create_check_prepare(self, post_check, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['post_check'] # noqa: E501 - self._check_operation_params('create_check', all_params, local_var_params) - # verify the required parameter 'post_check' is set - if ('post_check' not in local_var_params or - local_var_params['post_check'] is None): - raise ValueError("Missing the required parameter `post_check` when calling `create_check`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - - body_params = None - if 'post_check' in local_var_params: - body_params = local_var_params['post_check'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_checks_id(self, check_id, **kwargs): # noqa: E501,D401,D403 - """Delete a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_checks_id(check_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_checks_id_with_http_info(check_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_checks_id_with_http_info(check_id, **kwargs) # noqa: E501 - return data - - def delete_checks_id_with_http_info(self, check_id, **kwargs): # noqa: E501,D401,D403 - """Delete a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_checks_id_with_http_info(check_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_checks_id_prepare(check_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/checks/{checkID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_checks_id_async(self, check_id, **kwargs): # noqa: E501,D401,D403 - """Delete a check. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str check_id: The check ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_checks_id_prepare(check_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/checks/{checkID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_checks_id_prepare(self, check_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['check_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_checks_id', all_params, local_var_params) - # verify the required parameter 'check_id' is set - if ('check_id' not in local_var_params or - local_var_params['check_id'] is None): - raise ValueError("Missing the required parameter `check_id` when calling `delete_checks_id`") # noqa: E501 - - path_params = {} - if 'check_id' in local_var_params: - path_params['checkID'] = local_var_params['check_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_checks_id_labels_id(self, check_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete label from a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_checks_id_labels_id(check_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_checks_id_labels_id_with_http_info(check_id, label_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_checks_id_labels_id_with_http_info(check_id, label_id, **kwargs) # noqa: E501 - return data - - def delete_checks_id_labels_id_with_http_info(self, check_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete label from a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_checks_id_labels_id_with_http_info(check_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_checks_id_labels_id_prepare(check_id, label_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/checks/{checkID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_checks_id_labels_id_async(self, check_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete label from a check. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str check_id: The check ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_checks_id_labels_id_prepare(check_id, label_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/checks/{checkID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_checks_id_labels_id_prepare(self, check_id, label_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['check_id', 'label_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_checks_id_labels_id', all_params, local_var_params) - # verify the required parameter 'check_id' is set - if ('check_id' not in local_var_params or - local_var_params['check_id'] is None): - raise ValueError("Missing the required parameter `check_id` when calling `delete_checks_id_labels_id`") # noqa: E501 - # verify the required parameter 'label_id' is set - if ('label_id' not in local_var_params or - local_var_params['label_id'] is None): - raise ValueError("Missing the required parameter `label_id` when calling `delete_checks_id_labels_id`") # noqa: E501 - - path_params = {} - if 'check_id' in local_var_params: - path_params['checkID'] = local_var_params['check_id'] # noqa: E501 - if 'label_id' in local_var_params: - path_params['labelID'] = local_var_params['label_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_checks(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all checks. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_checks(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: Only show checks that belong to a specific organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :return: Checks - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_checks_with_http_info(org_id, **kwargs) # noqa: E501 - else: - (data) = self.get_checks_with_http_info(org_id, **kwargs) # noqa: E501 - return data - - def get_checks_with_http_info(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all checks. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_checks_with_http_info(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: Only show checks that belong to a specific organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :return: Checks - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_checks_prepare(org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/checks', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Checks', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_checks_async(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all checks. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: Only show checks that belong to a specific organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :return: Checks - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_checks_prepare(org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/checks', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Checks', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_checks_prepare(self, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'zap_trace_span', 'offset', 'limit'] # noqa: E501 - self._check_operation_params('get_checks', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `get_checks`") # noqa: E501 - - if 'offset' in local_var_params and local_var_params['offset'] < 0: # noqa: E501 - raise ValueError("Invalid value for parameter `offset` when calling `get_checks`, must be a value greater than or equal to `0`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] > 100: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_checks`, must be a value less than or equal to `100`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] < 1: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_checks`, must be a value greater than or equal to `1`") # noqa: E501 - path_params = {} - - query_params = [] - if 'offset' in local_var_params: - query_params.append(('offset', local_var_params['offset'])) # noqa: E501 - if 'limit' in local_var_params: - query_params.append(('limit', local_var_params['limit'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_checks_id(self, check_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_checks_id(check_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: Check - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_checks_id_with_http_info(check_id, **kwargs) # noqa: E501 - else: - (data) = self.get_checks_id_with_http_info(check_id, **kwargs) # noqa: E501 - return data - - def get_checks_id_with_http_info(self, check_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_checks_id_with_http_info(check_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: Check - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_checks_id_prepare(check_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/checks/{checkID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Check', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_checks_id_async(self, check_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a check. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str check_id: The check ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: Check - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_checks_id_prepare(check_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/checks/{checkID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Check', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_checks_id_prepare(self, check_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['check_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_checks_id', all_params, local_var_params) - # verify the required parameter 'check_id' is set - if ('check_id' not in local_var_params or - local_var_params['check_id'] is None): - raise ValueError("Missing the required parameter `check_id` when calling `get_checks_id`") # noqa: E501 - - path_params = {} - if 'check_id' in local_var_params: - path_params['checkID'] = local_var_params['check_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_checks_id_labels(self, check_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_checks_id_labels(check_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_checks_id_labels_with_http_info(check_id, **kwargs) # noqa: E501 - else: - (data) = self.get_checks_id_labels_with_http_info(check_id, **kwargs) # noqa: E501 - return data - - def get_checks_id_labels_with_http_info(self, check_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_checks_id_labels_with_http_info(check_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_checks_id_labels_prepare(check_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/checks/{checkID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_checks_id_labels_async(self, check_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a check. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str check_id: The check ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_checks_id_labels_prepare(check_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/checks/{checkID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_checks_id_labels_prepare(self, check_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['check_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_checks_id_labels', all_params, local_var_params) - # verify the required parameter 'check_id' is set - if ('check_id' not in local_var_params or - local_var_params['check_id'] is None): - raise ValueError("Missing the required parameter `check_id` when calling `get_checks_id_labels`") # noqa: E501 - - path_params = {} - if 'check_id' in local_var_params: - path_params['checkID'] = local_var_params['check_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_checks_id_query(self, check_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a check query. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_checks_id_query(check_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: FluxResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_checks_id_query_with_http_info(check_id, **kwargs) # noqa: E501 - else: - (data) = self.get_checks_id_query_with_http_info(check_id, **kwargs) # noqa: E501 - return data - - def get_checks_id_query_with_http_info(self, check_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a check query. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_checks_id_query_with_http_info(check_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: FluxResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_checks_id_query_prepare(check_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/checks/{checkID}/query', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='FluxResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_checks_id_query_async(self, check_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a check query. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str check_id: The check ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: FluxResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_checks_id_query_prepare(check_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/checks/{checkID}/query', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='FluxResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_checks_id_query_prepare(self, check_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['check_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_checks_id_query', all_params, local_var_params) - # verify the required parameter 'check_id' is set - if ('check_id' not in local_var_params or - local_var_params['check_id'] is None): - raise ValueError("Missing the required parameter `check_id` when calling `get_checks_id_query`") # noqa: E501 - - path_params = {} - if 'check_id' in local_var_params: - path_params['checkID'] = local_var_params['check_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_checks_id(self, check_id, check_patch, **kwargs): # noqa: E501,D401,D403 - """Update a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_checks_id(check_id, check_patch, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param CheckPatch check_patch: Check update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: Check - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_checks_id_with_http_info(check_id, check_patch, **kwargs) # noqa: E501 - else: - (data) = self.patch_checks_id_with_http_info(check_id, check_patch, **kwargs) # noqa: E501 - return data - - def patch_checks_id_with_http_info(self, check_id, check_patch, **kwargs): # noqa: E501,D401,D403 - """Update a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_checks_id_with_http_info(check_id, check_patch, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param CheckPatch check_patch: Check update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: Check - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_checks_id_prepare(check_id, check_patch, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/checks/{checkID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Check', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_checks_id_async(self, check_id, check_patch, **kwargs): # noqa: E501,D401,D403 - """Update a check. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str check_id: The check ID. (required) - :param CheckPatch check_patch: Check update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: Check - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_checks_id_prepare(check_id, check_patch, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/checks/{checkID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Check', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_checks_id_prepare(self, check_id, check_patch, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['check_id', 'check_patch', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_checks_id', all_params, local_var_params) - # verify the required parameter 'check_id' is set - if ('check_id' not in local_var_params or - local_var_params['check_id'] is None): - raise ValueError("Missing the required parameter `check_id` when calling `patch_checks_id`") # noqa: E501 - # verify the required parameter 'check_patch' is set - if ('check_patch' not in local_var_params or - local_var_params['check_patch'] is None): - raise ValueError("Missing the required parameter `check_patch` when calling `patch_checks_id`") # noqa: E501 - - path_params = {} - if 'check_id' in local_var_params: - path_params['checkID'] = local_var_params['check_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'check_patch' in local_var_params: - body_params = local_var_params['check_patch'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_checks_id_labels(self, check_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_checks_id_labels(check_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_checks_id_labels_with_http_info(check_id, label_mapping, **kwargs) # noqa: E501 - else: - (data) = self.post_checks_id_labels_with_http_info(check_id, label_mapping, **kwargs) # noqa: E501 - return data - - def post_checks_id_labels_with_http_info(self, check_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_checks_id_labels_with_http_info(check_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_checks_id_labels_prepare(check_id, label_mapping, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/checks/{checkID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_checks_id_labels_async(self, check_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a check. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str check_id: The check ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_checks_id_labels_prepare(check_id, label_mapping, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/checks/{checkID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_checks_id_labels_prepare(self, check_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['check_id', 'label_mapping', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_checks_id_labels', all_params, local_var_params) - # verify the required parameter 'check_id' is set - if ('check_id' not in local_var_params or - local_var_params['check_id'] is None): - raise ValueError("Missing the required parameter `check_id` when calling `post_checks_id_labels`") # noqa: E501 - # verify the required parameter 'label_mapping' is set - if ('label_mapping' not in local_var_params or - local_var_params['label_mapping'] is None): - raise ValueError("Missing the required parameter `label_mapping` when calling `post_checks_id_labels`") # noqa: E501 - - path_params = {} - if 'check_id' in local_var_params: - path_params['checkID'] = local_var_params['check_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'label_mapping' in local_var_params: - body_params = local_var_params['label_mapping'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def put_checks_id(self, check_id, check, **kwargs): # noqa: E501,D401,D403 - """Update a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_checks_id(check_id, check, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param Check check: Check update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: Check - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.put_checks_id_with_http_info(check_id, check, **kwargs) # noqa: E501 - else: - (data) = self.put_checks_id_with_http_info(check_id, check, **kwargs) # noqa: E501 - return data - - def put_checks_id_with_http_info(self, check_id, check, **kwargs): # noqa: E501,D401,D403 - """Update a check. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_checks_id_with_http_info(check_id, check, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str check_id: The check ID. (required) - :param Check check: Check update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: Check - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_checks_id_prepare(check_id, check, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/checks/{checkID}', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Check', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def put_checks_id_async(self, check_id, check, **kwargs): # noqa: E501,D401,D403 - """Update a check. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str check_id: The check ID. (required) - :param Check check: Check update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: Check - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_checks_id_prepare(check_id, check, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/checks/{checkID}', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Check', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _put_checks_id_prepare(self, check_id, check, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['check_id', 'check', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('put_checks_id', all_params, local_var_params) - # verify the required parameter 'check_id' is set - if ('check_id' not in local_var_params or - local_var_params['check_id'] is None): - raise ValueError("Missing the required parameter `check_id` when calling `put_checks_id`") # noqa: E501 - # verify the required parameter 'check' is set - if ('check' not in local_var_params or - local_var_params['check'] is None): - raise ValueError("Missing the required parameter `check` when calling `put_checks_id`") # noqa: E501 - - path_params = {} - if 'check_id' in local_var_params: - path_params['checkID'] = local_var_params['check_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'check' in local_var_params: - body_params = local_var_params['check'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/config_service.py b/frogpilot/third_party/influxdb_client/service/config_service.py deleted file mode 100644 index 2dd85d670..000000000 --- a/frogpilot/third_party/influxdb_client/service/config_service.py +++ /dev/null @@ -1,250 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class ConfigService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """ConfigService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def get_config(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve runtime configuration. - - Returns the active runtime configuration of the InfluxDB instance. In InfluxDB v2.2+, use this endpoint to view your active runtime configuration, including flags and environment variables. #### Related guides - [View your runtime server configuration](https://docs.influxdata.com/influxdb/latest/reference/config-options/#view-your-runtime-server-configuration) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_config(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: Config - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_config_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_config_with_http_info(**kwargs) # noqa: E501 - return data - - def get_config_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve runtime configuration. - - Returns the active runtime configuration of the InfluxDB instance. In InfluxDB v2.2+, use this endpoint to view your active runtime configuration, including flags and environment variables. #### Related guides - [View your runtime server configuration](https://docs.influxdata.com/influxdb/latest/reference/config-options/#view-your-runtime-server-configuration) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_config_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: Config - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_config_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/config', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Config', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_config_async(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve runtime configuration. - - Returns the active runtime configuration of the InfluxDB instance. In InfluxDB v2.2+, use this endpoint to view your active runtime configuration, including flags and environment variables. #### Related guides - [View your runtime server configuration](https://docs.influxdata.com/influxdb/latest/reference/config-options/#view-your-runtime-server-configuration) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: Config - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_config_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/config', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Config', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_config_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span'] # noqa: E501 - self._check_operation_params('get_config', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_flags(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve feature flags. - - Retrieves the feature flag key-value pairs configured for the InfluxDB instance. _Feature flags_ are configuration options used to develop and test experimental InfluxDB features and are intended for internal use only. This endpoint represents the first step in the following three-step process to configure feature flags: 1. Use [token authentication](#section/Authentication/TokenAuthentication) or a [user session](#tag/Signin) with this endpoint to retrieve feature flags and their values. 2. Follow the instructions to [enable, disable, or override values for feature flags](https://docs.influxdata.com/influxdb/latest/reference/config-options/#feature-flags). 3. **Optional**: To confirm that your change is applied, do one of the following: - Send a request to this endpoint to retrieve the current feature flag values. - Send a request to the [`GET /api/v2/config` endpoint](#operation/GetConfig) to retrieve the current runtime server configuration. #### Related guides - [InfluxDB configuration options](https://docs.influxdata.com/influxdb/latest/reference/config-options/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_flags(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: dict(str, object) - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_flags_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_flags_with_http_info(**kwargs) # noqa: E501 - return data - - def get_flags_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve feature flags. - - Retrieves the feature flag key-value pairs configured for the InfluxDB instance. _Feature flags_ are configuration options used to develop and test experimental InfluxDB features and are intended for internal use only. This endpoint represents the first step in the following three-step process to configure feature flags: 1. Use [token authentication](#section/Authentication/TokenAuthentication) or a [user session](#tag/Signin) with this endpoint to retrieve feature flags and their values. 2. Follow the instructions to [enable, disable, or override values for feature flags](https://docs.influxdata.com/influxdb/latest/reference/config-options/#feature-flags). 3. **Optional**: To confirm that your change is applied, do one of the following: - Send a request to this endpoint to retrieve the current feature flag values. - Send a request to the [`GET /api/v2/config` endpoint](#operation/GetConfig) to retrieve the current runtime server configuration. #### Related guides - [InfluxDB configuration options](https://docs.influxdata.com/influxdb/latest/reference/config-options/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_flags_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: dict(str, object) - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_flags_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/flags', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='dict(str, object)', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_flags_async(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve feature flags. - - Retrieves the feature flag key-value pairs configured for the InfluxDB instance. _Feature flags_ are configuration options used to develop and test experimental InfluxDB features and are intended for internal use only. This endpoint represents the first step in the following three-step process to configure feature flags: 1. Use [token authentication](#section/Authentication/TokenAuthentication) or a [user session](#tag/Signin) with this endpoint to retrieve feature flags and their values. 2. Follow the instructions to [enable, disable, or override values for feature flags](https://docs.influxdata.com/influxdb/latest/reference/config-options/#feature-flags). 3. **Optional**: To confirm that your change is applied, do one of the following: - Send a request to this endpoint to retrieve the current feature flag values. - Send a request to the [`GET /api/v2/config` endpoint](#operation/GetConfig) to retrieve the current runtime server configuration. #### Related guides - [InfluxDB configuration options](https://docs.influxdata.com/influxdb/latest/reference/config-options/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: dict(str, object) - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_flags_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/flags', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='dict(str, object)', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_flags_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span'] # noqa: E501 - self._check_operation_params('get_flags', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/dashboards_service.py b/frogpilot/third_party/influxdb_client/service/dashboards_service.py deleted file mode 100644 index 801c6c76f..000000000 --- a/frogpilot/third_party/influxdb_client/service/dashboards_service.py +++ /dev/null @@ -1,2568 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class DashboardsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """DashboardsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_dashboards_id(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Delete a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dashboards_id(dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_dashboards_id_with_http_info(dashboard_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_dashboards_id_with_http_info(dashboard_id, **kwargs) # noqa: E501 - return data - - def delete_dashboards_id_with_http_info(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Delete a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dashboards_id_with_http_info(dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dashboards_id_prepare(dashboard_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_dashboards_id_async(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Delete a dashboard. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dashboards_id_prepare(dashboard_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_dashboards_id_prepare(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_dashboards_id', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `delete_dashboards_id`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_dashboards_id_cells_id(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Delete a dashboard cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dashboards_id_cells_id(dashboard_id, cell_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to delete. (required) - :param str cell_id: The ID of the cell to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_dashboards_id_cells_id_with_http_info(dashboard_id, cell_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_dashboards_id_cells_id_with_http_info(dashboard_id, cell_id, **kwargs) # noqa: E501 - return data - - def delete_dashboards_id_cells_id_with_http_info(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Delete a dashboard cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dashboards_id_cells_id_with_http_info(dashboard_id, cell_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to delete. (required) - :param str cell_id: The ID of the cell to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dashboards_id_cells_id_prepare(dashboard_id, cell_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_dashboards_id_cells_id_async(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Delete a dashboard cell. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to delete. (required) - :param str cell_id: The ID of the cell to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dashboards_id_cells_id_prepare(dashboard_id, cell_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_dashboards_id_cells_id_prepare(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'cell_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_dashboards_id_cells_id', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `delete_dashboards_id_cells_id`") # noqa: E501 - # verify the required parameter 'cell_id' is set - if ('cell_id' not in local_var_params or - local_var_params['cell_id'] is None): - raise ValueError("Missing the required parameter `cell_id` when calling `delete_dashboards_id_cells_id`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - if 'cell_id' in local_var_params: - path_params['cellID'] = local_var_params['cell_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_dashboards_id_labels_id(self, dashboard_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dashboards_id_labels_id(dashboard_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_dashboards_id_labels_id_with_http_info(dashboard_id, label_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_dashboards_id_labels_id_with_http_info(dashboard_id, label_id, **kwargs) # noqa: E501 - return data - - def delete_dashboards_id_labels_id_with_http_info(self, dashboard_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dashboards_id_labels_id_with_http_info(dashboard_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dashboards_id_labels_id_prepare(dashboard_id, label_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_dashboards_id_labels_id_async(self, dashboard_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a dashboard. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dashboards_id_labels_id_prepare(dashboard_id, label_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_dashboards_id_labels_id_prepare(self, dashboard_id, label_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'label_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_dashboards_id_labels_id', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `delete_dashboards_id_labels_id`") # noqa: E501 - # verify the required parameter 'label_id' is set - if ('label_id' not in local_var_params or - local_var_params['label_id'] is None): - raise ValueError("Missing the required parameter `label_id` when calling `delete_dashboards_id_labels_id`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - if 'label_id' in local_var_params: - path_params['labelID'] = local_var_params['label_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_dashboards_id_members_id(self, user_id, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dashboards_id_members_id(user_id, dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the member to remove. (required) - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_dashboards_id_members_id_with_http_info(user_id, dashboard_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_dashboards_id_members_id_with_http_info(user_id, dashboard_id, **kwargs) # noqa: E501 - return data - - def delete_dashboards_id_members_id_with_http_info(self, user_id, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dashboards_id_members_id_with_http_info(user_id, dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the member to remove. (required) - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dashboards_id_members_id_prepare(user_id, dashboard_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/members/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_dashboards_id_members_id_async(self, user_id, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a dashboard. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of the member to remove. (required) - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dashboards_id_members_id_prepare(user_id, dashboard_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/members/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_dashboards_id_members_id_prepare(self, user_id, dashboard_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'dashboard_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_dashboards_id_members_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `delete_dashboards_id_members_id`") # noqa: E501 - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `delete_dashboards_id_members_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_dashboards_id_owners_id(self, user_id, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dashboards_id_owners_id(user_id, dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the owner to remove. (required) - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_dashboards_id_owners_id_with_http_info(user_id, dashboard_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_dashboards_id_owners_id_with_http_info(user_id, dashboard_id, **kwargs) # noqa: E501 - return data - - def delete_dashboards_id_owners_id_with_http_info(self, user_id, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dashboards_id_owners_id_with_http_info(user_id, dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the owner to remove. (required) - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dashboards_id_owners_id_prepare(user_id, dashboard_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/owners/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_dashboards_id_owners_id_async(self, user_id, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a dashboard. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of the owner to remove. (required) - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dashboards_id_owners_id_prepare(user_id, dashboard_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/owners/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_dashboards_id_owners_id_prepare(self, user_id, dashboard_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'dashboard_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_dashboards_id_owners_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `delete_dashboards_id_owners_id`") # noqa: E501 - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `delete_dashboards_id_owners_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_dashboards(self, **kwargs): # noqa: E501,D401,D403 - """List dashboards. - - Lists [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard). #### Related guides - [Manage dashboards](https://docs.influxdata.com/influxdb/latest/visualize-data/dashboards/). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param bool descending: - :param str owner: A user ID. Only returns [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard) where the specified user has the `owner` role. - :param str sort_by: The column to sort by. - :param list[str] id: A list of dashboard IDs. Returns only the specified [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard). If you specify `id` and `owner`, only `id` is used. - :param str org_id: An organization ID. Only returns [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard) that belong to the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). - :param str org: An organization name. Only returns [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard) that belong to the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). - :return: Dashboards - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_dashboards_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_dashboards_with_http_info(**kwargs) # noqa: E501 - return data - - def get_dashboards_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List dashboards. - - Lists [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard). #### Related guides - [Manage dashboards](https://docs.influxdata.com/influxdb/latest/visualize-data/dashboards/). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param bool descending: - :param str owner: A user ID. Only returns [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard) where the specified user has the `owner` role. - :param str sort_by: The column to sort by. - :param list[str] id: A list of dashboard IDs. Returns only the specified [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard). If you specify `id` and `owner`, only `id` is used. - :param str org_id: An organization ID. Only returns [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard) that belong to the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). - :param str org: An organization name. Only returns [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard) that belong to the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). - :return: Dashboards - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Dashboards', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_dashboards_async(self, **kwargs): # noqa: E501,D401,D403 - """List dashboards. - - Lists [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard). #### Related guides - [Manage dashboards](https://docs.influxdata.com/influxdb/latest/visualize-data/dashboards/). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param bool descending: - :param str owner: A user ID. Only returns [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard) where the specified user has the `owner` role. - :param str sort_by: The column to sort by. - :param list[str] id: A list of dashboard IDs. Returns only the specified [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard). If you specify `id` and `owner`, only `id` is used. - :param str org_id: An organization ID. Only returns [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard) that belong to the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). - :param str org: An organization name. Only returns [dashboards](https://docs.influxdata.com/influxdb/latest/reference/glossary/#dashboard) that belong to the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). - :return: Dashboards - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Dashboards', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_dashboards_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'offset', 'limit', 'descending', 'owner', 'sort_by', 'id', 'org_id', 'org'] # noqa: E501 - self._check_operation_params('get_dashboards', all_params, local_var_params) - - if 'offset' in local_var_params and local_var_params['offset'] < 0: # noqa: E501 - raise ValueError("Invalid value for parameter `offset` when calling `get_dashboards`, must be a value greater than or equal to `0`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] > 100: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_dashboards`, must be a value less than or equal to `100`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] < 1: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_dashboards`, must be a value greater than or equal to `1`") # noqa: E501 - path_params = {} - - query_params = [] - if 'offset' in local_var_params: - query_params.append(('offset', local_var_params['offset'])) # noqa: E501 - if 'limit' in local_var_params: - query_params.append(('limit', local_var_params['limit'])) # noqa: E501 - if 'descending' in local_var_params: - query_params.append(('descending', local_var_params['descending'])) # noqa: E501 - if 'owner' in local_var_params: - query_params.append(('owner', local_var_params['owner'])) # noqa: E501 - if 'sort_by' in local_var_params: - query_params.append(('sortBy', local_var_params['sort_by'])) # noqa: E501 - if 'id' in local_var_params: - query_params.append(('id', local_var_params['id'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_dashboards_id(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id(dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str zap_trace_span: OpenTracing span context - :param str include: If `properties`, includes the cell view properties in the response. - :return: DashboardWithViewProperties - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_dashboards_id_with_http_info(dashboard_id, **kwargs) # noqa: E501 - else: - (data) = self.get_dashboards_id_with_http_info(dashboard_id, **kwargs) # noqa: E501 - return data - - def get_dashboards_id_with_http_info(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id_with_http_info(dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str zap_trace_span: OpenTracing span context - :param str include: If `properties`, includes the cell view properties in the response. - :return: DashboardWithViewProperties - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_prepare(dashboard_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='DashboardWithViewProperties', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_dashboards_id_async(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a dashboard. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str zap_trace_span: OpenTracing span context - :param str include: If `properties`, includes the cell view properties in the response. - :return: DashboardWithViewProperties - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_prepare(dashboard_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='DashboardWithViewProperties', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_dashboards_id_prepare(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'zap_trace_span', 'include'] # noqa: E501 - self._check_operation_params('get_dashboards_id', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `get_dashboards_id`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - if 'include' in local_var_params: - query_params.append(('include', local_var_params['include'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_dashboards_id_cells_id_view(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve the view for a cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id_cells_id_view(dashboard_id, cell_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str cell_id: The cell ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, **kwargs) # noqa: E501 - else: - (data) = self.get_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, **kwargs) # noqa: E501 - return data - - def get_dashboards_id_cells_id_view_with_http_info(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve the view for a cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str cell_id: The cell ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_cells_id_view_prepare(dashboard_id, cell_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}/view', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='View', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_dashboards_id_cells_id_view_async(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve the view for a cell. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str cell_id: The cell ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_cells_id_view_prepare(dashboard_id, cell_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}/view', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='View', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_dashboards_id_cells_id_view_prepare(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'cell_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_dashboards_id_cells_id_view', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `get_dashboards_id_cells_id_view`") # noqa: E501 - # verify the required parameter 'cell_id' is set - if ('cell_id' not in local_var_params or - local_var_params['cell_id'] is None): - raise ValueError("Missing the required parameter `cell_id` when calling `get_dashboards_id_cells_id_view`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - if 'cell_id' in local_var_params: - path_params['cellID'] = local_var_params['cell_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_dashboards_id_labels(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id_labels(dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_dashboards_id_labels_with_http_info(dashboard_id, **kwargs) # noqa: E501 - else: - (data) = self.get_dashboards_id_labels_with_http_info(dashboard_id, **kwargs) # noqa: E501 - return data - - def get_dashboards_id_labels_with_http_info(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id_labels_with_http_info(dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_labels_prepare(dashboard_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_dashboards_id_labels_async(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a dashboard. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_labels_prepare(dashboard_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_dashboards_id_labels_prepare(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_dashboards_id_labels', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `get_dashboards_id_labels`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_dashboards_id_members(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """List all dashboard members. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id_members(dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_dashboards_id_members_with_http_info(dashboard_id, **kwargs) # noqa: E501 - else: - (data) = self.get_dashboards_id_members_with_http_info(dashboard_id, **kwargs) # noqa: E501 - return data - - def get_dashboards_id_members_with_http_info(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """List all dashboard members. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id_members_with_http_info(dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_members_prepare(dashboard_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/members', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMembers', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_dashboards_id_members_async(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """List all dashboard members. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_members_prepare(dashboard_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/members', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMembers', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_dashboards_id_members_prepare(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_dashboards_id_members', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `get_dashboards_id_members`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_dashboards_id_owners(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """List all dashboard owners. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id_owners(dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_dashboards_id_owners_with_http_info(dashboard_id, **kwargs) # noqa: E501 - else: - (data) = self.get_dashboards_id_owners_with_http_info(dashboard_id, **kwargs) # noqa: E501 - return data - - def get_dashboards_id_owners_with_http_info(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """List all dashboard owners. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id_owners_with_http_info(dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_owners_prepare(dashboard_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/owners', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwners', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_dashboards_id_owners_async(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """List all dashboard owners. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_owners_prepare(dashboard_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/owners', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwners', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_dashboards_id_owners_prepare(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_dashboards_id_owners', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `get_dashboards_id_owners`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_dashboards_id(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Update a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dashboards_id(dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str zap_trace_span: OpenTracing span context - :param PatchDashboardRequest patch_dashboard_request: - :return: Dashboard - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_dashboards_id_with_http_info(dashboard_id, **kwargs) # noqa: E501 - else: - (data) = self.patch_dashboards_id_with_http_info(dashboard_id, **kwargs) # noqa: E501 - return data - - def patch_dashboards_id_with_http_info(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Update a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dashboards_id_with_http_info(dashboard_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str zap_trace_span: OpenTracing span context - :param PatchDashboardRequest patch_dashboard_request: - :return: Dashboard - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dashboards_id_prepare(dashboard_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Dashboard', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_dashboards_id_async(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - """Update a dashboard. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str zap_trace_span: OpenTracing span context - :param PatchDashboardRequest patch_dashboard_request: - :return: Dashboard - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dashboards_id_prepare(dashboard_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Dashboard', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_dashboards_id_prepare(self, dashboard_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'zap_trace_span', 'patch_dashboard_request'] # noqa: E501 - self._check_operation_params('patch_dashboards_id', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `patch_dashboards_id`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'patch_dashboard_request' in local_var_params: - body_params = local_var_params['patch_dashboard_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_dashboards_id_cells_id(self, dashboard_id, cell_id, cell_update, **kwargs): # noqa: E501,D401,D403 - """Update the non-positional information related to a cell. - - Updates the non positional information related to a cell. Updates to a single cell's positional data could cause grid conflicts. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dashboards_id_cells_id(dashboard_id, cell_id, cell_update, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param CellUpdate cell_update: (required) - :param str zap_trace_span: OpenTracing span context - :return: Cell - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_dashboards_id_cells_id_with_http_info(dashboard_id, cell_id, cell_update, **kwargs) # noqa: E501 - else: - (data) = self.patch_dashboards_id_cells_id_with_http_info(dashboard_id, cell_id, cell_update, **kwargs) # noqa: E501 - return data - - def patch_dashboards_id_cells_id_with_http_info(self, dashboard_id, cell_id, cell_update, **kwargs): # noqa: E501,D401,D403 - """Update the non-positional information related to a cell. - - Updates the non positional information related to a cell. Updates to a single cell's positional data could cause grid conflicts. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dashboards_id_cells_id_with_http_info(dashboard_id, cell_id, cell_update, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param CellUpdate cell_update: (required) - :param str zap_trace_span: OpenTracing span context - :return: Cell - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dashboards_id_cells_id_prepare(dashboard_id, cell_id, cell_update, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Cell', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_dashboards_id_cells_id_async(self, dashboard_id, cell_id, cell_update, **kwargs): # noqa: E501,D401,D403 - """Update the non-positional information related to a cell. - - Updates the non positional information related to a cell. Updates to a single cell's positional data could cause grid conflicts. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param CellUpdate cell_update: (required) - :param str zap_trace_span: OpenTracing span context - :return: Cell - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dashboards_id_cells_id_prepare(dashboard_id, cell_id, cell_update, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Cell', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_dashboards_id_cells_id_prepare(self, dashboard_id, cell_id, cell_update, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'cell_id', 'cell_update', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_dashboards_id_cells_id', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `patch_dashboards_id_cells_id`") # noqa: E501 - # verify the required parameter 'cell_id' is set - if ('cell_id' not in local_var_params or - local_var_params['cell_id'] is None): - raise ValueError("Missing the required parameter `cell_id` when calling `patch_dashboards_id_cells_id`") # noqa: E501 - # verify the required parameter 'cell_update' is set - if ('cell_update' not in local_var_params or - local_var_params['cell_update'] is None): - raise ValueError("Missing the required parameter `cell_update` when calling `patch_dashboards_id_cells_id`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - if 'cell_id' in local_var_params: - path_params['cellID'] = local_var_params['cell_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'cell_update' in local_var_params: - body_params = local_var_params['cell_update'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_dashboards_id_cells_id_view(self, dashboard_id, cell_id, view, **kwargs): # noqa: E501,D401,D403 - """Update the view for a cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dashboards_id_cells_id_view(dashboard_id, cell_id, view, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param View view: (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, view, **kwargs) # noqa: E501 - else: - (data) = self.patch_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, view, **kwargs) # noqa: E501 - return data - - def patch_dashboards_id_cells_id_view_with_http_info(self, dashboard_id, cell_id, view, **kwargs): # noqa: E501,D401,D403 - """Update the view for a cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, view, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param View view: (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dashboards_id_cells_id_view_prepare(dashboard_id, cell_id, view, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}/view', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='View', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_dashboards_id_cells_id_view_async(self, dashboard_id, cell_id, view, **kwargs): # noqa: E501,D401,D403 - """Update the view for a cell. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param View view: (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dashboards_id_cells_id_view_prepare(dashboard_id, cell_id, view, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}/view', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='View', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_dashboards_id_cells_id_view_prepare(self, dashboard_id, cell_id, view, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'cell_id', 'view', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_dashboards_id_cells_id_view', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `patch_dashboards_id_cells_id_view`") # noqa: E501 - # verify the required parameter 'cell_id' is set - if ('cell_id' not in local_var_params or - local_var_params['cell_id'] is None): - raise ValueError("Missing the required parameter `cell_id` when calling `patch_dashboards_id_cells_id_view`") # noqa: E501 - # verify the required parameter 'view' is set - if ('view' not in local_var_params or - local_var_params['view'] is None): - raise ValueError("Missing the required parameter `view` when calling `patch_dashboards_id_cells_id_view`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - if 'cell_id' in local_var_params: - path_params['cellID'] = local_var_params['cell_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'view' in local_var_params: - body_params = local_var_params['view'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_dashboards(self, create_dashboard_request, **kwargs): # noqa: E501,D401,D403 - """Create a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dashboards(create_dashboard_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param CreateDashboardRequest create_dashboard_request: Dashboard to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Dashboard - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_dashboards_with_http_info(create_dashboard_request, **kwargs) # noqa: E501 - else: - (data) = self.post_dashboards_with_http_info(create_dashboard_request, **kwargs) # noqa: E501 - return data - - def post_dashboards_with_http_info(self, create_dashboard_request, **kwargs): # noqa: E501,D401,D403 - """Create a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dashboards_with_http_info(create_dashboard_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param CreateDashboardRequest create_dashboard_request: Dashboard to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Dashboard - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dashboards_prepare(create_dashboard_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Dashboard', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_dashboards_async(self, create_dashboard_request, **kwargs): # noqa: E501,D401,D403 - """Create a dashboard. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param CreateDashboardRequest create_dashboard_request: Dashboard to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Dashboard - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dashboards_prepare(create_dashboard_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Dashboard', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_dashboards_prepare(self, create_dashboard_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['create_dashboard_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_dashboards', all_params, local_var_params) - # verify the required parameter 'create_dashboard_request' is set - if ('create_dashboard_request' not in local_var_params or - local_var_params['create_dashboard_request'] is None): - raise ValueError("Missing the required parameter `create_dashboard_request` when calling `post_dashboards`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'create_dashboard_request' in local_var_params: - body_params = local_var_params['create_dashboard_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_dashboards_id_cells(self, dashboard_id, create_cell, **kwargs): # noqa: E501,D401,D403 - """Create a dashboard cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dashboards_id_cells(dashboard_id, create_cell, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param CreateCell create_cell: Cell that will be added (required) - :param str zap_trace_span: OpenTracing span context - :return: Cell - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_dashboards_id_cells_with_http_info(dashboard_id, create_cell, **kwargs) # noqa: E501 - else: - (data) = self.post_dashboards_id_cells_with_http_info(dashboard_id, create_cell, **kwargs) # noqa: E501 - return data - - def post_dashboards_id_cells_with_http_info(self, dashboard_id, create_cell, **kwargs): # noqa: E501,D401,D403 - """Create a dashboard cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dashboards_id_cells_with_http_info(dashboard_id, create_cell, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param CreateCell create_cell: Cell that will be added (required) - :param str zap_trace_span: OpenTracing span context - :return: Cell - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dashboards_id_cells_prepare(dashboard_id, create_cell, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Cell', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_dashboards_id_cells_async(self, dashboard_id, create_cell, **kwargs): # noqa: E501,D401,D403 - """Create a dashboard cell. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param CreateCell create_cell: Cell that will be added (required) - :param str zap_trace_span: OpenTracing span context - :return: Cell - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dashboards_id_cells_prepare(dashboard_id, create_cell, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Cell', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_dashboards_id_cells_prepare(self, dashboard_id, create_cell, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'create_cell', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_dashboards_id_cells', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `post_dashboards_id_cells`") # noqa: E501 - # verify the required parameter 'create_cell' is set - if ('create_cell' not in local_var_params or - local_var_params['create_cell'] is None): - raise ValueError("Missing the required parameter `create_cell` when calling `post_dashboards_id_cells`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'create_cell' in local_var_params: - body_params = local_var_params['create_cell'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_dashboards_id_labels(self, dashboard_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dashboards_id_labels(dashboard_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_dashboards_id_labels_with_http_info(dashboard_id, label_mapping, **kwargs) # noqa: E501 - else: - (data) = self.post_dashboards_id_labels_with_http_info(dashboard_id, label_mapping, **kwargs) # noqa: E501 - return data - - def post_dashboards_id_labels_with_http_info(self, dashboard_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dashboards_id_labels_with_http_info(dashboard_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dashboards_id_labels_prepare(dashboard_id, label_mapping, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_dashboards_id_labels_async(self, dashboard_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a dashboard. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dashboards_id_labels_prepare(dashboard_id, label_mapping, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_dashboards_id_labels_prepare(self, dashboard_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'label_mapping', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_dashboards_id_labels', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `post_dashboards_id_labels`") # noqa: E501 - # verify the required parameter 'label_mapping' is set - if ('label_mapping' not in local_var_params or - local_var_params['label_mapping'] is None): - raise ValueError("Missing the required parameter `label_mapping` when calling `post_dashboards_id_labels`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'label_mapping' in local_var_params: - body_params = local_var_params['label_mapping'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_dashboards_id_members(self, dashboard_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dashboards_id_members(dashboard_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as member (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_dashboards_id_members_with_http_info(dashboard_id, add_resource_member_request_body, **kwargs) # noqa: E501 - else: - (data) = self.post_dashboards_id_members_with_http_info(dashboard_id, add_resource_member_request_body, **kwargs) # noqa: E501 - return data - - def post_dashboards_id_members_with_http_info(self, dashboard_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dashboards_id_members_with_http_info(dashboard_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as member (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dashboards_id_members_prepare(dashboard_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/members', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMember', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_dashboards_id_members_async(self, dashboard_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a dashboard. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as member (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dashboards_id_members_prepare(dashboard_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/members', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMember', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_dashboards_id_members_prepare(self, dashboard_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'add_resource_member_request_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_dashboards_id_members', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `post_dashboards_id_members`") # noqa: E501 - # verify the required parameter 'add_resource_member_request_body' is set - if ('add_resource_member_request_body' not in local_var_params or - local_var_params['add_resource_member_request_body'] is None): - raise ValueError("Missing the required parameter `add_resource_member_request_body` when calling `post_dashboards_id_members`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'add_resource_member_request_body' in local_var_params: - body_params = local_var_params['add_resource_member_request_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_dashboards_id_owners(self, dashboard_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dashboards_id_owners(dashboard_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as owner (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_dashboards_id_owners_with_http_info(dashboard_id, add_resource_member_request_body, **kwargs) # noqa: E501 - else: - (data) = self.post_dashboards_id_owners_with_http_info(dashboard_id, add_resource_member_request_body, **kwargs) # noqa: E501 - return data - - def post_dashboards_id_owners_with_http_info(self, dashboard_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to a dashboard. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dashboards_id_owners_with_http_info(dashboard_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as owner (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dashboards_id_owners_prepare(dashboard_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/owners', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwner', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_dashboards_id_owners_async(self, dashboard_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to a dashboard. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as owner (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dashboards_id_owners_prepare(dashboard_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/owners', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwner', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_dashboards_id_owners_prepare(self, dashboard_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'add_resource_member_request_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_dashboards_id_owners', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `post_dashboards_id_owners`") # noqa: E501 - # verify the required parameter 'add_resource_member_request_body' is set - if ('add_resource_member_request_body' not in local_var_params or - local_var_params['add_resource_member_request_body'] is None): - raise ValueError("Missing the required parameter `add_resource_member_request_body` when calling `post_dashboards_id_owners`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'add_resource_member_request_body' in local_var_params: - body_params = local_var_params['add_resource_member_request_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def put_dashboards_id_cells(self, dashboard_id, cell, **kwargs): # noqa: E501,D401,D403 - """Replace cells in a dashboard. - - Replaces all cells in a dashboard. This is used primarily to update the positional information of all cells. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_dashboards_id_cells(dashboard_id, cell, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param list[Cell] cell: (required) - :param str zap_trace_span: OpenTracing span context - :return: Dashboard - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.put_dashboards_id_cells_with_http_info(dashboard_id, cell, **kwargs) # noqa: E501 - else: - (data) = self.put_dashboards_id_cells_with_http_info(dashboard_id, cell, **kwargs) # noqa: E501 - return data - - def put_dashboards_id_cells_with_http_info(self, dashboard_id, cell, **kwargs): # noqa: E501,D401,D403 - """Replace cells in a dashboard. - - Replaces all cells in a dashboard. This is used primarily to update the positional information of all cells. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_dashboards_id_cells_with_http_info(dashboard_id, cell, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param list[Cell] cell: (required) - :param str zap_trace_span: OpenTracing span context - :return: Dashboard - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_dashboards_id_cells_prepare(dashboard_id, cell, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Dashboard', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def put_dashboards_id_cells_async(self, dashboard_id, cell, **kwargs): # noqa: E501,D401,D403 - """Replace cells in a dashboard. - - Replaces all cells in a dashboard. This is used primarily to update the positional information of all cells. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param list[Cell] cell: (required) - :param str zap_trace_span: OpenTracing span context - :return: Dashboard - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_dashboards_id_cells_prepare(dashboard_id, cell, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Dashboard', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _put_dashboards_id_cells_prepare(self, dashboard_id, cell, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'cell', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('put_dashboards_id_cells', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `put_dashboards_id_cells`") # noqa: E501 - # verify the required parameter 'cell' is set - if ('cell' not in local_var_params or - local_var_params['cell'] is None): - raise ValueError("Missing the required parameter `cell` when calling `put_dashboards_id_cells`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'cell' in local_var_params: - body_params = local_var_params['cell'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/dbr_ps_service.py b/frogpilot/third_party/influxdb_client/service/dbr_ps_service.py deleted file mode 100644 index 4fb20aef3..000000000 --- a/frogpilot/third_party/influxdb_client/service/dbr_ps_service.py +++ /dev/null @@ -1,695 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class DBRPsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """DBRPsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_dbrpid(self, dbrp_id, **kwargs): # noqa: E501,D401,D403 - """Delete a database retention policy. - - Deletes the specified database retention policy (DBRP) mapping. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dbrpid(dbrp_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dbrp_id: A DBRP mapping ID. Only returns the specified DBRP mapping. (required) - :param str zap_trace_span: OpenTracing span context - :param str org_id: An organization ID. Specifies the organization that owns the DBRP mapping. - :param str org: An organization name. Specifies the organization that owns the DBRP mapping. - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_dbrpid_with_http_info(dbrp_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_dbrpid_with_http_info(dbrp_id, **kwargs) # noqa: E501 - return data - - def delete_dbrpid_with_http_info(self, dbrp_id, **kwargs): # noqa: E501,D401,D403 - """Delete a database retention policy. - - Deletes the specified database retention policy (DBRP) mapping. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_dbrpid_with_http_info(dbrp_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dbrp_id: A DBRP mapping ID. Only returns the specified DBRP mapping. (required) - :param str zap_trace_span: OpenTracing span context - :param str org_id: An organization ID. Specifies the organization that owns the DBRP mapping. - :param str org: An organization name. Specifies the organization that owns the DBRP mapping. - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dbrpid_prepare(dbrp_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dbrps/{dbrpID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_dbrpid_async(self, dbrp_id, **kwargs): # noqa: E501,D401,D403 - """Delete a database retention policy. - - Deletes the specified database retention policy (DBRP) mapping. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dbrp_id: A DBRP mapping ID. Only returns the specified DBRP mapping. (required) - :param str zap_trace_span: OpenTracing span context - :param str org_id: An organization ID. Specifies the organization that owns the DBRP mapping. - :param str org: An organization name. Specifies the organization that owns the DBRP mapping. - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_dbrpid_prepare(dbrp_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dbrps/{dbrpID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_dbrpid_prepare(self, dbrp_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dbrp_id', 'zap_trace_span', 'org_id', 'org'] # noqa: E501 - self._check_operation_params('delete_dbrpid', all_params, local_var_params) - # verify the required parameter 'dbrp_id' is set - if ('dbrp_id' not in local_var_params or - local_var_params['dbrp_id'] is None): - raise ValueError("Missing the required parameter `dbrp_id` when calling `delete_dbrpid`") # noqa: E501 - - path_params = {} - if 'dbrp_id' in local_var_params: - path_params['dbrpID'] = local_var_params['dbrp_id'] # noqa: E501 - - query_params = [] - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_dbr_ps(self, **kwargs): # noqa: E501,D401,D403 - """List database retention policy mappings. - - Lists database retention policy (DBRP) mappings. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dbr_ps(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org_id: An organization ID. Only returns DBRP mappings for the specified organization. - :param str org: An organization name. Only returns DBRP mappings for the specified organization. - :param str id: A DBPR mapping ID. Only returns the specified DBRP mapping. - :param str bucket_id: A bucket ID. Only returns DBRP mappings that belong to the specified bucket. - :param bool default: Specifies filtering on default - :param str db: A database. Only returns DBRP mappings that belong to the 1.x database. - :param str rp: A [retention policy](https://docs.influxdata.com/influxdb/v1.8/concepts/glossary/#retention-policy-rp). Specifies the 1.x retention policy to filter on. - :return: DBRPs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_dbr_ps_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_dbr_ps_with_http_info(**kwargs) # noqa: E501 - return data - - def get_dbr_ps_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List database retention policy mappings. - - Lists database retention policy (DBRP) mappings. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dbr_ps_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org_id: An organization ID. Only returns DBRP mappings for the specified organization. - :param str org: An organization name. Only returns DBRP mappings for the specified organization. - :param str id: A DBPR mapping ID. Only returns the specified DBRP mapping. - :param str bucket_id: A bucket ID. Only returns DBRP mappings that belong to the specified bucket. - :param bool default: Specifies filtering on default - :param str db: A database. Only returns DBRP mappings that belong to the 1.x database. - :param str rp: A [retention policy](https://docs.influxdata.com/influxdb/v1.8/concepts/glossary/#retention-policy-rp). Specifies the 1.x retention policy to filter on. - :return: DBRPs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dbr_ps_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dbrps', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='DBRPs', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_dbr_ps_async(self, **kwargs): # noqa: E501,D401,D403 - """List database retention policy mappings. - - Lists database retention policy (DBRP) mappings. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org_id: An organization ID. Only returns DBRP mappings for the specified organization. - :param str org: An organization name. Only returns DBRP mappings for the specified organization. - :param str id: A DBPR mapping ID. Only returns the specified DBRP mapping. - :param str bucket_id: A bucket ID. Only returns DBRP mappings that belong to the specified bucket. - :param bool default: Specifies filtering on default - :param str db: A database. Only returns DBRP mappings that belong to the 1.x database. - :param str rp: A [retention policy](https://docs.influxdata.com/influxdb/v1.8/concepts/glossary/#retention-policy-rp). Specifies the 1.x retention policy to filter on. - :return: DBRPs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dbr_ps_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dbrps', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='DBRPs', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_dbr_ps_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'org_id', 'org', 'id', 'bucket_id', 'default', 'db', 'rp'] # noqa: E501 - self._check_operation_params('get_dbr_ps', all_params, local_var_params) - - path_params = {} - - query_params = [] - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'id' in local_var_params: - query_params.append(('id', local_var_params['id'])) # noqa: E501 - if 'bucket_id' in local_var_params: - query_params.append(('bucketID', local_var_params['bucket_id'])) # noqa: E501 - if 'default' in local_var_params: - query_params.append(('default', local_var_params['default'])) # noqa: E501 - if 'db' in local_var_params: - query_params.append(('db', local_var_params['db'])) # noqa: E501 - if 'rp' in local_var_params: - query_params.append(('rp', local_var_params['rp'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_dbr_ps_id(self, dbrp_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a database retention policy mapping. - - Retrieves the specified retention policy (DBRP) mapping. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dbr_ps_id(dbrp_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dbrp_id: A DBRP mapping ID. Specifies the DBRP mapping. (required) - :param str zap_trace_span: OpenTracing span context - :param str org_id: An organization ID. Specifies the organization that owns the DBRP mapping. - :param str org: An organization name. Specifies the organization that owns the DBRP mapping. - :return: DBRPGet - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_dbr_ps_id_with_http_info(dbrp_id, **kwargs) # noqa: E501 - else: - (data) = self.get_dbr_ps_id_with_http_info(dbrp_id, **kwargs) # noqa: E501 - return data - - def get_dbr_ps_id_with_http_info(self, dbrp_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a database retention policy mapping. - - Retrieves the specified retention policy (DBRP) mapping. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dbr_ps_id_with_http_info(dbrp_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dbrp_id: A DBRP mapping ID. Specifies the DBRP mapping. (required) - :param str zap_trace_span: OpenTracing span context - :param str org_id: An organization ID. Specifies the organization that owns the DBRP mapping. - :param str org: An organization name. Specifies the organization that owns the DBRP mapping. - :return: DBRPGet - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dbr_ps_id_prepare(dbrp_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dbrps/{dbrpID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='DBRPGet', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_dbr_ps_id_async(self, dbrp_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a database retention policy mapping. - - Retrieves the specified retention policy (DBRP) mapping. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dbrp_id: A DBRP mapping ID. Specifies the DBRP mapping. (required) - :param str zap_trace_span: OpenTracing span context - :param str org_id: An organization ID. Specifies the organization that owns the DBRP mapping. - :param str org: An organization name. Specifies the organization that owns the DBRP mapping. - :return: DBRPGet - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dbr_ps_id_prepare(dbrp_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dbrps/{dbrpID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='DBRPGet', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_dbr_ps_id_prepare(self, dbrp_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dbrp_id', 'zap_trace_span', 'org_id', 'org'] # noqa: E501 - self._check_operation_params('get_dbr_ps_id', all_params, local_var_params) - # verify the required parameter 'dbrp_id' is set - if ('dbrp_id' not in local_var_params or - local_var_params['dbrp_id'] is None): - raise ValueError("Missing the required parameter `dbrp_id` when calling `get_dbr_ps_id`") # noqa: E501 - - path_params = {} - if 'dbrp_id' in local_var_params: - path_params['dbrpID'] = local_var_params['dbrp_id'] # noqa: E501 - - query_params = [] - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_dbrpid(self, dbrp_id, dbrp_update, **kwargs): # noqa: E501,D401,D403 - """Update a database retention policy mapping. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dbrpid(dbrp_id, dbrp_update, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dbrp_id: A DBRP mapping ID. Specifies the DBRP mapping. (required) - :param DBRPUpdate dbrp_update: Updates the database retention policy (DBRP) mapping and returns the mapping. Use this endpoint to modify the _retention policy_ (`retention_policy` property) of a DBRP mapping. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) (required) - :param str zap_trace_span: OpenTracing span context - :param str org_id: An organization ID. Specifies the organization that owns the DBRP mapping. - :param str org: An organization name. Specifies the organization that owns the DBRP mapping. - :return: DBRPGet - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_dbrpid_with_http_info(dbrp_id, dbrp_update, **kwargs) # noqa: E501 - else: - (data) = self.patch_dbrpid_with_http_info(dbrp_id, dbrp_update, **kwargs) # noqa: E501 - return data - - def patch_dbrpid_with_http_info(self, dbrp_id, dbrp_update, **kwargs): # noqa: E501,D401,D403 - """Update a database retention policy mapping. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dbrpid_with_http_info(dbrp_id, dbrp_update, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dbrp_id: A DBRP mapping ID. Specifies the DBRP mapping. (required) - :param DBRPUpdate dbrp_update: Updates the database retention policy (DBRP) mapping and returns the mapping. Use this endpoint to modify the _retention policy_ (`retention_policy` property) of a DBRP mapping. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) (required) - :param str zap_trace_span: OpenTracing span context - :param str org_id: An organization ID. Specifies the organization that owns the DBRP mapping. - :param str org: An organization name. Specifies the organization that owns the DBRP mapping. - :return: DBRPGet - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dbrpid_prepare(dbrp_id, dbrp_update, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dbrps/{dbrpID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='DBRPGet', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_dbrpid_async(self, dbrp_id, dbrp_update, **kwargs): # noqa: E501,D401,D403 - """Update a database retention policy mapping. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dbrp_id: A DBRP mapping ID. Specifies the DBRP mapping. (required) - :param DBRPUpdate dbrp_update: Updates the database retention policy (DBRP) mapping and returns the mapping. Use this endpoint to modify the _retention policy_ (`retention_policy` property) of a DBRP mapping. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) (required) - :param str zap_trace_span: OpenTracing span context - :param str org_id: An organization ID. Specifies the organization that owns the DBRP mapping. - :param str org: An organization name. Specifies the organization that owns the DBRP mapping. - :return: DBRPGet - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dbrpid_prepare(dbrp_id, dbrp_update, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dbrps/{dbrpID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='DBRPGet', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_dbrpid_prepare(self, dbrp_id, dbrp_update, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dbrp_id', 'dbrp_update', 'zap_trace_span', 'org_id', 'org'] # noqa: E501 - self._check_operation_params('patch_dbrpid', all_params, local_var_params) - # verify the required parameter 'dbrp_id' is set - if ('dbrp_id' not in local_var_params or - local_var_params['dbrp_id'] is None): - raise ValueError("Missing the required parameter `dbrp_id` when calling `patch_dbrpid`") # noqa: E501 - # verify the required parameter 'dbrp_update' is set - if ('dbrp_update' not in local_var_params or - local_var_params['dbrp_update'] is None): - raise ValueError("Missing the required parameter `dbrp_update` when calling `patch_dbrpid`") # noqa: E501 - - path_params = {} - if 'dbrp_id' in local_var_params: - path_params['dbrpID'] = local_var_params['dbrp_id'] # noqa: E501 - - query_params = [] - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'dbrp_update' in local_var_params: - body_params = local_var_params['dbrp_update'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_dbrp(self, dbrp_create, **kwargs): # noqa: E501,D401,D403 - """Add a database retention policy mapping. - - Creates a database retention policy (DBRP) mapping and returns the mapping. Use this endpoint to add InfluxDB 1.x API compatibility to your InfluxDB Cloud or InfluxDB OSS 2.x buckets. Your buckets must contain a DBRP mapping in order to query and write using the InfluxDB 1.x API. object. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dbrp(dbrp_create, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param DBRPCreate dbrp_create: The database retention policy mapping to add. Note that _`retention_policy`_ is a required parameter in the request body. The value of _`retention_policy`_ can be any arbitrary `string` name or value, with the default value commonly set as `autogen`. The value of _`retention_policy`_ isn't a [retention_policy](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-policy-rp) (required) - :param str zap_trace_span: OpenTracing span context - :return: DBRP - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_dbrp_with_http_info(dbrp_create, **kwargs) # noqa: E501 - else: - (data) = self.post_dbrp_with_http_info(dbrp_create, **kwargs) # noqa: E501 - return data - - def post_dbrp_with_http_info(self, dbrp_create, **kwargs): # noqa: E501,D401,D403 - """Add a database retention policy mapping. - - Creates a database retention policy (DBRP) mapping and returns the mapping. Use this endpoint to add InfluxDB 1.x API compatibility to your InfluxDB Cloud or InfluxDB OSS 2.x buckets. Your buckets must contain a DBRP mapping in order to query and write using the InfluxDB 1.x API. object. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_dbrp_with_http_info(dbrp_create, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param DBRPCreate dbrp_create: The database retention policy mapping to add. Note that _`retention_policy`_ is a required parameter in the request body. The value of _`retention_policy`_ can be any arbitrary `string` name or value, with the default value commonly set as `autogen`. The value of _`retention_policy`_ isn't a [retention_policy](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-policy-rp) (required) - :param str zap_trace_span: OpenTracing span context - :return: DBRP - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dbrp_prepare(dbrp_create, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dbrps', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='DBRP', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_dbrp_async(self, dbrp_create, **kwargs): # noqa: E501,D401,D403 - """Add a database retention policy mapping. - - Creates a database retention policy (DBRP) mapping and returns the mapping. Use this endpoint to add InfluxDB 1.x API compatibility to your InfluxDB Cloud or InfluxDB OSS 2.x buckets. Your buckets must contain a DBRP mapping in order to query and write using the InfluxDB 1.x API. object. #### Related guide - [Database and retention policy mapping](https://docs.influxdata.com/influxdb/latest/reference/api/influxdb-1x/dbrp/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param DBRPCreate dbrp_create: The database retention policy mapping to add. Note that _`retention_policy`_ is a required parameter in the request body. The value of _`retention_policy`_ can be any arbitrary `string` name or value, with the default value commonly set as `autogen`. The value of _`retention_policy`_ isn't a [retention_policy](https://docs.influxdata.com/influxdb/latest/reference/glossary/#retention-policy-rp) (required) - :param str zap_trace_span: OpenTracing span context - :return: DBRP - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_dbrp_prepare(dbrp_create, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dbrps', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='DBRP', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_dbrp_prepare(self, dbrp_create, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dbrp_create', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_dbrp', all_params, local_var_params) - # verify the required parameter 'dbrp_create' is set - if ('dbrp_create' not in local_var_params or - local_var_params['dbrp_create'] is None): - raise ValueError("Missing the required parameter `dbrp_create` when calling `post_dbrp`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'dbrp_create' in local_var_params: - body_params = local_var_params['dbrp_create'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/delete_service.py b/frogpilot/third_party/influxdb_client/service/delete_service.py deleted file mode 100644 index 7fef4ea94..000000000 --- a/frogpilot/third_party/influxdb_client/service/delete_service.py +++ /dev/null @@ -1,173 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class DeleteService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """DeleteService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def post_delete(self, delete_predicate_request, **kwargs): # noqa: E501,D401,D403 - """Delete data. - - Deletes data from a bucket. Use this endpoint to delete points from a bucket in a specified time range. #### InfluxDB Cloud - Does the following when you send a delete request: 1. Validates the request and queues the delete. 2. If queued, responds with _success_ (HTTP `2xx` status code); _error_ otherwise. 3. Handles the delete asynchronously and reaches eventual consistency. To ensure that InfluxDB Cloud handles writes and deletes in the order you request them, wait for a success response (HTTP `2xx` status code) before you send the next request. Because writes and deletes are asynchronous, your change might not yet be readable when you receive the response. #### InfluxDB OSS - Validates the request, handles the delete synchronously, and then responds with success or failure. #### Required permissions - `write-buckets` or `write-bucket BUCKET_ID`. *`BUCKET_ID`* is the ID of the destination bucket. #### Rate limits (with InfluxDB Cloud) `write` rate limits apply. For more information, see [limits and adjustable quotas](https://docs.influxdata.com/influxdb/cloud/account-management/limits/). #### Related guides - [Delete data](https://docs.influxdata.com/influxdb/latest/write-data/delete-data/) - Learn how to use [delete predicate syntax](https://docs.influxdata.com/influxdb/latest/reference/syntax/delete-predicate/). - Learn how InfluxDB handles [deleted tags](https://docs.influxdata.com/flux/v0.x/stdlib/influxdata/influxdb/schema/measurementtagkeys/) and [deleted fields](https://docs.influxdata.com/flux/v0.x/stdlib/influxdata/influxdb/schema/measurementfieldkeys/). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_delete(delete_predicate_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param DeletePredicateRequest delete_predicate_request: Time range parameters and an optional **delete predicate expression**. To select points to delete within the specified time range, pass a **delete predicate expression** in the `predicate` property of the request body. If you don't pass a `predicate`, InfluxDB deletes all data with timestamps in the specified time range. #### Related guides - [Delete data](https://docs.influxdata.com/influxdb/latest/write-data/delete-data/) - Learn how to use [delete predicate syntax](https://docs.influxdata.com/influxdb/latest/reference/syntax/delete-predicate/). (required) - :param str zap_trace_span: OpenTracing span context - :param str org: An organization name or ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Deletes data from the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or the `orgID` parameter. - Deletes data from the bucket in the specified organization. - If you pass both `orgID` and `org`, they must both be valid. - :param str bucket: A bucket name or ID. Specifies the bucket to delete data from. If you pass both `bucket` and `bucketID`, `bucketID` takes precedence. - :param str org_id: An organization ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Deletes data from the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or the `orgID` parameter. - Deletes data from the bucket in the specified organization. - If you pass both `orgID` and `org`, they must both be valid. - :param str bucket_id: A bucket ID. Specifies the bucket to delete data from. If you pass both `bucket` and `bucketID`, `bucketID` takes precedence. - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_delete_with_http_info(delete_predicate_request, **kwargs) # noqa: E501 - else: - (data) = self.post_delete_with_http_info(delete_predicate_request, **kwargs) # noqa: E501 - return data - - def post_delete_with_http_info(self, delete_predicate_request, **kwargs): # noqa: E501,D401,D403 - """Delete data. - - Deletes data from a bucket. Use this endpoint to delete points from a bucket in a specified time range. #### InfluxDB Cloud - Does the following when you send a delete request: 1. Validates the request and queues the delete. 2. If queued, responds with _success_ (HTTP `2xx` status code); _error_ otherwise. 3. Handles the delete asynchronously and reaches eventual consistency. To ensure that InfluxDB Cloud handles writes and deletes in the order you request them, wait for a success response (HTTP `2xx` status code) before you send the next request. Because writes and deletes are asynchronous, your change might not yet be readable when you receive the response. #### InfluxDB OSS - Validates the request, handles the delete synchronously, and then responds with success or failure. #### Required permissions - `write-buckets` or `write-bucket BUCKET_ID`. *`BUCKET_ID`* is the ID of the destination bucket. #### Rate limits (with InfluxDB Cloud) `write` rate limits apply. For more information, see [limits and adjustable quotas](https://docs.influxdata.com/influxdb/cloud/account-management/limits/). #### Related guides - [Delete data](https://docs.influxdata.com/influxdb/latest/write-data/delete-data/) - Learn how to use [delete predicate syntax](https://docs.influxdata.com/influxdb/latest/reference/syntax/delete-predicate/). - Learn how InfluxDB handles [deleted tags](https://docs.influxdata.com/flux/v0.x/stdlib/influxdata/influxdb/schema/measurementtagkeys/) and [deleted fields](https://docs.influxdata.com/flux/v0.x/stdlib/influxdata/influxdb/schema/measurementfieldkeys/). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_delete_with_http_info(delete_predicate_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param DeletePredicateRequest delete_predicate_request: Time range parameters and an optional **delete predicate expression**. To select points to delete within the specified time range, pass a **delete predicate expression** in the `predicate` property of the request body. If you don't pass a `predicate`, InfluxDB deletes all data with timestamps in the specified time range. #### Related guides - [Delete data](https://docs.influxdata.com/influxdb/latest/write-data/delete-data/) - Learn how to use [delete predicate syntax](https://docs.influxdata.com/influxdb/latest/reference/syntax/delete-predicate/). (required) - :param str zap_trace_span: OpenTracing span context - :param str org: An organization name or ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Deletes data from the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or the `orgID` parameter. - Deletes data from the bucket in the specified organization. - If you pass both `orgID` and `org`, they must both be valid. - :param str bucket: A bucket name or ID. Specifies the bucket to delete data from. If you pass both `bucket` and `bucketID`, `bucketID` takes precedence. - :param str org_id: An organization ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Deletes data from the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or the `orgID` parameter. - Deletes data from the bucket in the specified organization. - If you pass both `orgID` and `org`, they must both be valid. - :param str bucket_id: A bucket ID. Specifies the bucket to delete data from. If you pass both `bucket` and `bucketID`, `bucketID` takes precedence. - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_delete_prepare(delete_predicate_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/delete', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_delete_async(self, delete_predicate_request, **kwargs): # noqa: E501,D401,D403 - """Delete data. - - Deletes data from a bucket. Use this endpoint to delete points from a bucket in a specified time range. #### InfluxDB Cloud - Does the following when you send a delete request: 1. Validates the request and queues the delete. 2. If queued, responds with _success_ (HTTP `2xx` status code); _error_ otherwise. 3. Handles the delete asynchronously and reaches eventual consistency. To ensure that InfluxDB Cloud handles writes and deletes in the order you request them, wait for a success response (HTTP `2xx` status code) before you send the next request. Because writes and deletes are asynchronous, your change might not yet be readable when you receive the response. #### InfluxDB OSS - Validates the request, handles the delete synchronously, and then responds with success or failure. #### Required permissions - `write-buckets` or `write-bucket BUCKET_ID`. *`BUCKET_ID`* is the ID of the destination bucket. #### Rate limits (with InfluxDB Cloud) `write` rate limits apply. For more information, see [limits and adjustable quotas](https://docs.influxdata.com/influxdb/cloud/account-management/limits/). #### Related guides - [Delete data](https://docs.influxdata.com/influxdb/latest/write-data/delete-data/) - Learn how to use [delete predicate syntax](https://docs.influxdata.com/influxdb/latest/reference/syntax/delete-predicate/). - Learn how InfluxDB handles [deleted tags](https://docs.influxdata.com/flux/v0.x/stdlib/influxdata/influxdb/schema/measurementtagkeys/) and [deleted fields](https://docs.influxdata.com/flux/v0.x/stdlib/influxdata/influxdb/schema/measurementfieldkeys/). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param DeletePredicateRequest delete_predicate_request: Time range parameters and an optional **delete predicate expression**. To select points to delete within the specified time range, pass a **delete predicate expression** in the `predicate` property of the request body. If you don't pass a `predicate`, InfluxDB deletes all data with timestamps in the specified time range. #### Related guides - [Delete data](https://docs.influxdata.com/influxdb/latest/write-data/delete-data/) - Learn how to use [delete predicate syntax](https://docs.influxdata.com/influxdb/latest/reference/syntax/delete-predicate/). (required) - :param str zap_trace_span: OpenTracing span context - :param str org: An organization name or ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Deletes data from the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or the `orgID` parameter. - Deletes data from the bucket in the specified organization. - If you pass both `orgID` and `org`, they must both be valid. - :param str bucket: A bucket name or ID. Specifies the bucket to delete data from. If you pass both `bucket` and `bucketID`, `bucketID` takes precedence. - :param str org_id: An organization ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Deletes data from the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or the `orgID` parameter. - Deletes data from the bucket in the specified organization. - If you pass both `orgID` and `org`, they must both be valid. - :param str bucket_id: A bucket ID. Specifies the bucket to delete data from. If you pass both `bucket` and `bucketID`, `bucketID` takes precedence. - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_delete_prepare(delete_predicate_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/delete', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_delete_prepare(self, delete_predicate_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['delete_predicate_request', 'zap_trace_span', 'org', 'bucket', 'org_id', 'bucket_id'] # noqa: E501 - self._check_operation_params('post_delete', all_params, local_var_params) - # verify the required parameter 'delete_predicate_request' is set - if ('delete_predicate_request' not in local_var_params or - local_var_params['delete_predicate_request'] is None): - raise ValueError("Missing the required parameter `delete_predicate_request` when calling `post_delete`") # noqa: E501 - - path_params = {} - - query_params = [] - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'bucket' in local_var_params: - query_params.append(('bucket', local_var_params['bucket'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'bucket_id' in local_var_params: - query_params.append(('bucketID', local_var_params['bucket_id'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'delete_predicate_request' in local_var_params: - body_params = local_var_params['delete_predicate_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/health_service.py b/frogpilot/third_party/influxdb_client/service/health_service.py deleted file mode 100644 index 6a87da7a4..000000000 --- a/frogpilot/third_party/influxdb_client/service/health_service.py +++ /dev/null @@ -1,140 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class HealthService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """HealthService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def get_health(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve the health of the instance. - - Returns the health of the instance. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_health(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: HealthCheck - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_health_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_health_with_http_info(**kwargs) # noqa: E501 - return data - - def get_health_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve the health of the instance. - - Returns the health of the instance. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_health_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: HealthCheck - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_health_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/health', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='HealthCheck', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_health_async(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve the health of the instance. - - Returns the health of the instance. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: HealthCheck - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_health_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/health', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='HealthCheck', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_health_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span'] # noqa: E501 - self._check_operation_params('get_health', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/invokable_scripts_service.py b/frogpilot/third_party/influxdb_client/service/invokable_scripts_service.py deleted file mode 100644 index 9c84503d7..000000000 --- a/frogpilot/third_party/influxdb_client/service/invokable_scripts_service.py +++ /dev/null @@ -1,922 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class InvokableScriptsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """InvokableScriptsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_scripts_id(self, script_id, **kwargs): # noqa: E501,D401,D403 - """Delete a script. - - Deletes a [script](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) and all associated records. #### Limitations - You can delete only one script per request. - If the script ID you provide doesn't exist for the organization, InfluxDB responds with an HTTP `204` status code. #### Related Guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_scripts_id(script_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str script_id: A script ID. Deletes the specified script. (required) - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_scripts_id_with_http_info(script_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_scripts_id_with_http_info(script_id, **kwargs) # noqa: E501 - return data - - def delete_scripts_id_with_http_info(self, script_id, **kwargs): # noqa: E501,D401,D403 - """Delete a script. - - Deletes a [script](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) and all associated records. #### Limitations - You can delete only one script per request. - If the script ID you provide doesn't exist for the organization, InfluxDB responds with an HTTP `204` status code. #### Related Guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_scripts_id_with_http_info(script_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str script_id: A script ID. Deletes the specified script. (required) - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not self._is_cloud_instance(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_scripts_id_prepare(script_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scripts/{scriptID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_scripts_id_async(self, script_id, **kwargs): # noqa: E501,D401,D403 - """Delete a script. - - Deletes a [script](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) and all associated records. #### Limitations - You can delete only one script per request. - If the script ID you provide doesn't exist for the organization, InfluxDB responds with an HTTP `204` status code. #### Related Guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str script_id: A script ID. Deletes the specified script. (required) - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not await self._is_cloud_instance_async(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_scripts_id_prepare(script_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scripts/{scriptID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_scripts_id_prepare(self, script_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['script_id'] # noqa: E501 - self._check_operation_params('delete_scripts_id', all_params, local_var_params) - # verify the required parameter 'script_id' is set - if ('script_id' not in local_var_params or - local_var_params['script_id'] is None): - raise ValueError("Missing the required parameter `script_id` when calling `delete_scripts_id`") # noqa: E501 - - path_params = {} - if 'script_id' in local_var_params: - path_params['scriptID'] = local_var_params['script_id'] # noqa: E501 - - query_params = [] - - header_params = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_scripts(self, **kwargs): # noqa: E501,D401,D403 - """List scripts. - - Lists [scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/). #### Related guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scripts(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination]({{% INFLUXDB_DOCS_URL %}}/api/#tag/Pagination). - :param int limit: The maximum number of scripts to return. Default is `100`. - :param str name: The script name. Lists scripts with the specified name. - :return: Scripts - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_scripts_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_scripts_with_http_info(**kwargs) # noqa: E501 - return data - - def get_scripts_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List scripts. - - Lists [scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/). #### Related guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scripts_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination]({{% INFLUXDB_DOCS_URL %}}/api/#tag/Pagination). - :param int limit: The maximum number of scripts to return. Default is `100`. - :param str name: The script name. Lists scripts with the specified name. - :return: Scripts - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not self._is_cloud_instance(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scripts_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scripts', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Scripts', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_scripts_async(self, **kwargs): # noqa: E501,D401,D403 - """List scripts. - - Lists [scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/). #### Related guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination]({{% INFLUXDB_DOCS_URL %}}/api/#tag/Pagination). - :param int limit: The maximum number of scripts to return. Default is `100`. - :param str name: The script name. Lists scripts with the specified name. - :return: Scripts - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not await self._is_cloud_instance_async(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scripts_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scripts', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Scripts', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_scripts_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['offset', 'limit', 'name'] # noqa: E501 - self._check_operation_params('get_scripts', all_params, local_var_params) - - if 'offset' in local_var_params and local_var_params['offset'] < 0: # noqa: E501 - raise ValueError("Invalid value for parameter `offset` when calling `get_scripts`, must be a value greater than or equal to `0`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] > 500: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_scripts`, must be a value less than or equal to `500`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] < 0: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_scripts`, must be a value greater than or equal to `0`") # noqa: E501 - path_params = {} - - query_params = [] - if 'offset' in local_var_params: - query_params.append(('offset', local_var_params['offset'])) # noqa: E501 - if 'limit' in local_var_params: - query_params.append(('limit', local_var_params['limit'])) # noqa: E501 - if 'name' in local_var_params: - query_params.append(('name', local_var_params['name'])) # noqa: E501 - - header_params = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_scripts_id(self, script_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a script. - - Retrieves a [script](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/). #### Related Guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scripts_id(script_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str script_id: A script ID. Retrieves the specified script. (required) - :return: Script - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_scripts_id_with_http_info(script_id, **kwargs) # noqa: E501 - else: - (data) = self.get_scripts_id_with_http_info(script_id, **kwargs) # noqa: E501 - return data - - def get_scripts_id_with_http_info(self, script_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a script. - - Retrieves a [script](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/). #### Related Guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scripts_id_with_http_info(script_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str script_id: A script ID. Retrieves the specified script. (required) - :return: Script - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not self._is_cloud_instance(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scripts_id_prepare(script_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scripts/{scriptID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Script', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_scripts_id_async(self, script_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a script. - - Retrieves a [script](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/). #### Related Guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str script_id: A script ID. Retrieves the specified script. (required) - :return: Script - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not await self._is_cloud_instance_async(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scripts_id_prepare(script_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scripts/{scriptID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Script', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_scripts_id_prepare(self, script_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['script_id'] # noqa: E501 - self._check_operation_params('get_scripts_id', all_params, local_var_params) - # verify the required parameter 'script_id' is set - if ('script_id' not in local_var_params or - local_var_params['script_id'] is None): - raise ValueError("Missing the required parameter `script_id` when calling `get_scripts_id`") # noqa: E501 - - path_params = {} - if 'script_id' in local_var_params: - path_params['scriptID'] = local_var_params['script_id'] # noqa: E501 - - query_params = [] - - header_params = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_scripts_id_params(self, script_id, **kwargs): # noqa: E501,D401,D403 - """Find script parameters.. - - Analyzes a script and determines required parameters. Find all `params` keys referenced in a script and return a list of keys. If it is possible to determine the type of the value from the context then the type is also returned -- for example: The following sample script contains a _`mybucket`_ parameter : ```json "script": "from(bucket: params.mybucket) |> range(start: -7d) |> limit(n:1)" ``` Requesting the parameters using `GET /api/v2/scripts/SCRIPT_ID/params` returns the following: ```json { "params": { "mybucket": "string" } } ``` The type name returned for a parameter will be one of: - `any` - `bool` - `duration` - `float` - `int` - `string` - `time` - `uint` The type name `any` is used when the type of a parameter cannot be determined from the context, or the type is determined to be a structured type such as an array or record. #### Related guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scripts_id_params(script_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str script_id: A script ID. The script to analyze for params. (required) - :return: Params - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_scripts_id_params_with_http_info(script_id, **kwargs) # noqa: E501 - else: - (data) = self.get_scripts_id_params_with_http_info(script_id, **kwargs) # noqa: E501 - return data - - def get_scripts_id_params_with_http_info(self, script_id, **kwargs): # noqa: E501,D401,D403 - """Find script parameters.. - - Analyzes a script and determines required parameters. Find all `params` keys referenced in a script and return a list of keys. If it is possible to determine the type of the value from the context then the type is also returned -- for example: The following sample script contains a _`mybucket`_ parameter : ```json "script": "from(bucket: params.mybucket) |> range(start: -7d) |> limit(n:1)" ``` Requesting the parameters using `GET /api/v2/scripts/SCRIPT_ID/params` returns the following: ```json { "params": { "mybucket": "string" } } ``` The type name returned for a parameter will be one of: - `any` - `bool` - `duration` - `float` - `int` - `string` - `time` - `uint` The type name `any` is used when the type of a parameter cannot be determined from the context, or the type is determined to be a structured type such as an array or record. #### Related guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scripts_id_params_with_http_info(script_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str script_id: A script ID. The script to analyze for params. (required) - :return: Params - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not self._is_cloud_instance(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scripts_id_params_prepare(script_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scripts/{scriptID}/params', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Params', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_scripts_id_params_async(self, script_id, **kwargs): # noqa: E501,D401,D403 - """Find script parameters.. - - Analyzes a script and determines required parameters. Find all `params` keys referenced in a script and return a list of keys. If it is possible to determine the type of the value from the context then the type is also returned -- for example: The following sample script contains a _`mybucket`_ parameter : ```json "script": "from(bucket: params.mybucket) |> range(start: -7d) |> limit(n:1)" ``` Requesting the parameters using `GET /api/v2/scripts/SCRIPT_ID/params` returns the following: ```json { "params": { "mybucket": "string" } } ``` The type name returned for a parameter will be one of: - `any` - `bool` - `duration` - `float` - `int` - `string` - `time` - `uint` The type name `any` is used when the type of a parameter cannot be determined from the context, or the type is determined to be a structured type such as an array or record. #### Related guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str script_id: A script ID. The script to analyze for params. (required) - :return: Params - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not await self._is_cloud_instance_async(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scripts_id_params_prepare(script_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scripts/{scriptID}/params', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Params', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_scripts_id_params_prepare(self, script_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['script_id'] # noqa: E501 - self._check_operation_params('get_scripts_id_params', all_params, local_var_params) - # verify the required parameter 'script_id' is set - if ('script_id' not in local_var_params or - local_var_params['script_id'] is None): - raise ValueError("Missing the required parameter `script_id` when calling `get_scripts_id_params`") # noqa: E501 - - path_params = {} - if 'script_id' in local_var_params: - path_params['scriptID'] = local_var_params['script_id'] # noqa: E501 - - query_params = [] - - header_params = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_scripts_id(self, script_id, script_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a script. - - Updates an invokable script. Use this endpoint to modify values for script properties (`description` and `script`). To update a script, pass an object that contains the updated key-value pairs. #### Limitations - If you send an empty request body, the script will neither update nor store an empty script, but InfluxDB will respond with an HTTP `200` status code. #### Related Guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_scripts_id(script_id, script_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str script_id: A script ID. Updates the specified script. (required) - :param ScriptUpdateRequest script_update_request: An object that contains the updated script properties to apply. (required) - :return: Script - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_scripts_id_with_http_info(script_id, script_update_request, **kwargs) # noqa: E501 - else: - (data) = self.patch_scripts_id_with_http_info(script_id, script_update_request, **kwargs) # noqa: E501 - return data - - def patch_scripts_id_with_http_info(self, script_id, script_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a script. - - Updates an invokable script. Use this endpoint to modify values for script properties (`description` and `script`). To update a script, pass an object that contains the updated key-value pairs. #### Limitations - If you send an empty request body, the script will neither update nor store an empty script, but InfluxDB will respond with an HTTP `200` status code. #### Related Guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_scripts_id_with_http_info(script_id, script_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str script_id: A script ID. Updates the specified script. (required) - :param ScriptUpdateRequest script_update_request: An object that contains the updated script properties to apply. (required) - :return: Script - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not self._is_cloud_instance(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_scripts_id_prepare(script_id, script_update_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scripts/{scriptID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Script', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_scripts_id_async(self, script_id, script_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a script. - - Updates an invokable script. Use this endpoint to modify values for script properties (`description` and `script`). To update a script, pass an object that contains the updated key-value pairs. #### Limitations - If you send an empty request body, the script will neither update nor store an empty script, but InfluxDB will respond with an HTTP `200` status code. #### Related Guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str script_id: A script ID. Updates the specified script. (required) - :param ScriptUpdateRequest script_update_request: An object that contains the updated script properties to apply. (required) - :return: Script - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not await self._is_cloud_instance_async(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_scripts_id_prepare(script_id, script_update_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scripts/{scriptID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Script', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_scripts_id_prepare(self, script_id, script_update_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['script_id', 'script_update_request'] # noqa: E501 - self._check_operation_params('patch_scripts_id', all_params, local_var_params) - # verify the required parameter 'script_id' is set - if ('script_id' not in local_var_params or - local_var_params['script_id'] is None): - raise ValueError("Missing the required parameter `script_id` when calling `patch_scripts_id`") # noqa: E501 - # verify the required parameter 'script_update_request' is set - if ('script_update_request' not in local_var_params or - local_var_params['script_update_request'] is None): - raise ValueError("Missing the required parameter `script_update_request` when calling `patch_scripts_id`") # noqa: E501 - - path_params = {} - if 'script_id' in local_var_params: - path_params['scriptID'] = local_var_params['script_id'] # noqa: E501 - - query_params = [] - - header_params = {} - - body_params = None - if 'script_update_request' in local_var_params: - body_params = local_var_params['script_update_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_scripts(self, script_create_request, **kwargs): # noqa: E501,D401,D403 - """Create a script. - - Creates an [invokable script](https://docs.influxdata.com/resources/videos/api-invokable-scripts/) and returns the script. #### Related guides - [Invokable scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - [Creating custom InfluxDB endpoints](https://docs.influxdata.com/resources/videos/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_scripts(script_create_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param ScriptCreateRequest script_create_request: The script to create. (required) - :return: Script - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_scripts_with_http_info(script_create_request, **kwargs) # noqa: E501 - else: - (data) = self.post_scripts_with_http_info(script_create_request, **kwargs) # noqa: E501 - return data - - def post_scripts_with_http_info(self, script_create_request, **kwargs): # noqa: E501,D401,D403 - """Create a script. - - Creates an [invokable script](https://docs.influxdata.com/resources/videos/api-invokable-scripts/) and returns the script. #### Related guides - [Invokable scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - [Creating custom InfluxDB endpoints](https://docs.influxdata.com/resources/videos/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_scripts_with_http_info(script_create_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param ScriptCreateRequest script_create_request: The script to create. (required) - :return: Script - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not self._is_cloud_instance(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_scripts_prepare(script_create_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scripts', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Script', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_scripts_async(self, script_create_request, **kwargs): # noqa: E501,D401,D403 - """Create a script. - - Creates an [invokable script](https://docs.influxdata.com/resources/videos/api-invokable-scripts/) and returns the script. #### Related guides - [Invokable scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - [Creating custom InfluxDB endpoints](https://docs.influxdata.com/resources/videos/api-invokable-scripts/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param ScriptCreateRequest script_create_request: The script to create. (required) - :return: Script - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not await self._is_cloud_instance_async(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_scripts_prepare(script_create_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scripts', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Script', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_scripts_prepare(self, script_create_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['script_create_request'] # noqa: E501 - self._check_operation_params('post_scripts', all_params, local_var_params) - # verify the required parameter 'script_create_request' is set - if ('script_create_request' not in local_var_params or - local_var_params['script_create_request'] is None): - raise ValueError("Missing the required parameter `script_create_request` when calling `post_scripts`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - - body_params = None - if 'script_create_request' in local_var_params: - body_params = local_var_params['script_create_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_scripts_id_invoke(self, script_id, **kwargs): # noqa: E501,D401,D403 - """Invoke a script. - - Runs a script and returns the result. When the script runs, InfluxDB replaces `params` keys referenced in the script with `params` key-values passed in the request body--for example: The following sample script contains a _`mybucket`_ parameter : ```json "script": "from(bucket: params.mybucket) |> range(start: -7d) |> limit(n:1)" ``` The following example `POST /api/v2/scripts/SCRIPT_ID/invoke` request body passes a value for the _`mybucket`_ parameter: ```json { "params": { "mybucket": "air_sensor" } } ``` #### Related guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_scripts_id_invoke(script_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str script_id: A script ID. Runs the specified script. (required) - :param ScriptInvocationParams script_invocation_params: - :return: file - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_scripts_id_invoke_with_http_info(script_id, **kwargs) # noqa: E501 - else: - (data) = self.post_scripts_id_invoke_with_http_info(script_id, **kwargs) # noqa: E501 - return data - - def post_scripts_id_invoke_with_http_info(self, script_id, **kwargs): # noqa: E501,D401,D403 - """Invoke a script. - - Runs a script and returns the result. When the script runs, InfluxDB replaces `params` keys referenced in the script with `params` key-values passed in the request body--for example: The following sample script contains a _`mybucket`_ parameter : ```json "script": "from(bucket: params.mybucket) |> range(start: -7d) |> limit(n:1)" ``` The following example `POST /api/v2/scripts/SCRIPT_ID/invoke` request body passes a value for the _`mybucket`_ parameter: ```json { "params": { "mybucket": "air_sensor" } } ``` #### Related guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_scripts_id_invoke_with_http_info(script_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str script_id: A script ID. Runs the specified script. (required) - :param ScriptInvocationParams script_invocation_params: - :return: file - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not self._is_cloud_instance(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_scripts_id_invoke_prepare(script_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scripts/{scriptID}/invoke', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='file', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_scripts_id_invoke_async(self, script_id, **kwargs): # noqa: E501,D401,D403 - """Invoke a script. - - Runs a script and returns the result. When the script runs, InfluxDB replaces `params` keys referenced in the script with `params` key-values passed in the request body--for example: The following sample script contains a _`mybucket`_ parameter : ```json "script": "from(bucket: params.mybucket) |> range(start: -7d) |> limit(n:1)" ``` The following example `POST /api/v2/scripts/SCRIPT_ID/invoke` request body passes a value for the _`mybucket`_ parameter: ```json { "params": { "mybucket": "air_sensor" } } ``` #### Related guides - [Invoke custom scripts](https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str script_id: A script ID. Runs the specified script. (required) - :param ScriptInvocationParams script_invocation_params: - :return: file - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - if not await self._is_cloud_instance_async(): - from influxdb_client.client.warnings import CloudOnlyWarning - CloudOnlyWarning.print_warning('InvokableScriptsService', - 'https://docs.influxdata.com/influxdb/cloud/api-guide/api-invokable-scripts/') # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_scripts_id_invoke_prepare(script_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scripts/{scriptID}/invoke', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='file', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_scripts_id_invoke_prepare(self, script_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['script_id', 'script_invocation_params'] # noqa: E501 - self._check_operation_params('post_scripts_id_invoke', all_params, local_var_params) - # verify the required parameter 'script_id' is set - if ('script_id' not in local_var_params or - local_var_params['script_id'] is None): - raise ValueError("Missing the required parameter `script_id` when calling `post_scripts_id_invoke`") # noqa: E501 - - path_params = {} - if 'script_id' in local_var_params: - path_params['scriptID'] = local_var_params['script_id'] # noqa: E501 - - query_params = [] - - header_params = {} - - body_params = None - if 'script_invocation_params' in local_var_params: - body_params = local_var_params['script_invocation_params'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['text/csv', 'application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/labels_service.py b/frogpilot/third_party/influxdb_client/service/labels_service.py deleted file mode 100644 index aa88f41d3..000000000 --- a/frogpilot/third_party/influxdb_client/service/labels_service.py +++ /dev/null @@ -1,618 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class LabelsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """LabelsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_labels_id(self, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_labels_id(label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_labels_id_with_http_info(label_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_labels_id_with_http_info(label_id, **kwargs) # noqa: E501 - return data - - def delete_labels_id_with_http_info(self, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_labels_id_with_http_info(label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_labels_id_prepare(label_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_labels_id_async(self, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_labels_id_prepare(label_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_labels_id_prepare(self, label_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['label_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_labels_id', all_params, local_var_params) - # verify the required parameter 'label_id' is set - if ('label_id' not in local_var_params or - local_var_params['label_id'] is None): - raise ValueError("Missing the required parameter `label_id` when calling `delete_labels_id`") # noqa: E501 - - path_params = {} - if 'label_id' in local_var_params: - path_params['labelID'] = local_var_params['label_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_labels(self, **kwargs): # noqa: E501,D401,D403 - """List all labels. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_labels(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org_id: The organization ID. - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_labels_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_labels_with_http_info(**kwargs) # noqa: E501 - return data - - def get_labels_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List all labels. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_labels_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org_id: The organization ID. - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_labels_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_labels_async(self, **kwargs): # noqa: E501,D401,D403 - """List all labels. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org_id: The organization ID. - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_labels_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_labels_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'org_id'] # noqa: E501 - self._check_operation_params('get_labels', all_params, local_var_params) - - path_params = {} - - query_params = [] - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_labels_id(self, label_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a label. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_labels_id(label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str label_id: The ID of the label to update. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_labels_id_with_http_info(label_id, **kwargs) # noqa: E501 - else: - (data) = self.get_labels_id_with_http_info(label_id, **kwargs) # noqa: E501 - return data - - def get_labels_id_with_http_info(self, label_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a label. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_labels_id_with_http_info(label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str label_id: The ID of the label to update. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_labels_id_prepare(label_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/labels/{labelID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_labels_id_async(self, label_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a label. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str label_id: The ID of the label to update. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_labels_id_prepare(label_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/labels/{labelID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_labels_id_prepare(self, label_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['label_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_labels_id', all_params, local_var_params) - # verify the required parameter 'label_id' is set - if ('label_id' not in local_var_params or - local_var_params['label_id'] is None): - raise ValueError("Missing the required parameter `label_id` when calling `get_labels_id`") # noqa: E501 - - path_params = {} - if 'label_id' in local_var_params: - path_params['labelID'] = local_var_params['label_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_labels_id(self, label_id, label_update, **kwargs): # noqa: E501,D401,D403 - """Update a label. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_labels_id(label_id, label_update, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str label_id: The ID of the label to update. (required) - :param LabelUpdate label_update: A label update. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_labels_id_with_http_info(label_id, label_update, **kwargs) # noqa: E501 - else: - (data) = self.patch_labels_id_with_http_info(label_id, label_update, **kwargs) # noqa: E501 - return data - - def patch_labels_id_with_http_info(self, label_id, label_update, **kwargs): # noqa: E501,D401,D403 - """Update a label. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_labels_id_with_http_info(label_id, label_update, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str label_id: The ID of the label to update. (required) - :param LabelUpdate label_update: A label update. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_labels_id_prepare(label_id, label_update, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/labels/{labelID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_labels_id_async(self, label_id, label_update, **kwargs): # noqa: E501,D401,D403 - """Update a label. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str label_id: The ID of the label to update. (required) - :param LabelUpdate label_update: A label update. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_labels_id_prepare(label_id, label_update, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/labels/{labelID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_labels_id_prepare(self, label_id, label_update, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['label_id', 'label_update', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_labels_id', all_params, local_var_params) - # verify the required parameter 'label_id' is set - if ('label_id' not in local_var_params or - local_var_params['label_id'] is None): - raise ValueError("Missing the required parameter `label_id` when calling `patch_labels_id`") # noqa: E501 - # verify the required parameter 'label_update' is set - if ('label_update' not in local_var_params or - local_var_params['label_update'] is None): - raise ValueError("Missing the required parameter `label_update` when calling `patch_labels_id`") # noqa: E501 - - path_params = {} - if 'label_id' in local_var_params: - path_params['labelID'] = local_var_params['label_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'label_update' in local_var_params: - body_params = local_var_params['label_update'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_labels(self, label_create_request, **kwargs): # noqa: E501,D401,D403 - """Create a label. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_labels(label_create_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param LabelCreateRequest label_create_request: The label to create. (required) - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_labels_with_http_info(label_create_request, **kwargs) # noqa: E501 - else: - (data) = self.post_labels_with_http_info(label_create_request, **kwargs) # noqa: E501 - return data - - def post_labels_with_http_info(self, label_create_request, **kwargs): # noqa: E501,D401,D403 - """Create a label. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_labels_with_http_info(label_create_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param LabelCreateRequest label_create_request: The label to create. (required) - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_labels_prepare(label_create_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_labels_async(self, label_create_request, **kwargs): # noqa: E501,D401,D403 - """Create a label. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param LabelCreateRequest label_create_request: The label to create. (required) - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_labels_prepare(label_create_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_labels_prepare(self, label_create_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['label_create_request'] # noqa: E501 - self._check_operation_params('post_labels', all_params, local_var_params) - # verify the required parameter 'label_create_request' is set - if ('label_create_request' not in local_var_params or - local_var_params['label_create_request'] is None): - raise ValueError("Missing the required parameter `label_create_request` when calling `post_labels`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - - body_params = None - if 'label_create_request' in local_var_params: - body_params = local_var_params['label_create_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/legacy_authorizations_service.py b/frogpilot/third_party/influxdb_client/service/legacy_authorizations_service.py deleted file mode 100644 index 622ef49c6..000000000 --- a/frogpilot/third_party/influxdb_client/service/legacy_authorizations_service.py +++ /dev/null @@ -1,777 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class LegacyAuthorizationsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """LegacyAuthorizationsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_legacy_authorizations_id(self, auth_id, **kwargs): # noqa: E501,D401,D403 - """Delete a legacy authorization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_legacy_authorizations_id(auth_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: The ID of the legacy authorization to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_legacy_authorizations_id_with_http_info(auth_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_legacy_authorizations_id_with_http_info(auth_id, **kwargs) # noqa: E501 - return data - - def delete_legacy_authorizations_id_with_http_info(self, auth_id, **kwargs): # noqa: E501,D401,D403 - """Delete a legacy authorization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_legacy_authorizations_id_with_http_info(auth_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: The ID of the legacy authorization to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_legacy_authorizations_id_prepare(auth_id, **kwargs) - - return self.api_client.call_api( - '/private/legacy/authorizations/{authID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_legacy_authorizations_id_async(self, auth_id, **kwargs): # noqa: E501,D401,D403 - """Delete a legacy authorization. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str auth_id: The ID of the legacy authorization to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_legacy_authorizations_id_prepare(auth_id, **kwargs) - - return await self.api_client.call_api( - '/private/legacy/authorizations/{authID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_legacy_authorizations_id_prepare(self, auth_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['auth_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_legacy_authorizations_id', all_params, local_var_params) - # verify the required parameter 'auth_id' is set - if ('auth_id' not in local_var_params or - local_var_params['auth_id'] is None): - raise ValueError("Missing the required parameter `auth_id` when calling `delete_legacy_authorizations_id`") # noqa: E501 - - path_params = {} - if 'auth_id' in local_var_params: - path_params['authID'] = local_var_params['auth_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_legacy_authorizations(self, **kwargs): # noqa: E501,D401,D403 - """List all legacy authorizations. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_legacy_authorizations(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str user_id: Only show legacy authorizations that belong to a user ID. - :param str user: Only show legacy authorizations that belong to a user name. - :param str org_id: Only show legacy authorizations that belong to an organization ID. - :param str org: Only show legacy authorizations that belong to a organization name. - :param str token: Only show legacy authorizations with a specified token (auth name). - :param str auth_id: Only show legacy authorizations with a specified auth ID. - :return: Authorizations - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_legacy_authorizations_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_legacy_authorizations_with_http_info(**kwargs) # noqa: E501 - return data - - def get_legacy_authorizations_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List all legacy authorizations. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_legacy_authorizations_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str user_id: Only show legacy authorizations that belong to a user ID. - :param str user: Only show legacy authorizations that belong to a user name. - :param str org_id: Only show legacy authorizations that belong to an organization ID. - :param str org: Only show legacy authorizations that belong to a organization name. - :param str token: Only show legacy authorizations with a specified token (auth name). - :param str auth_id: Only show legacy authorizations with a specified auth ID. - :return: Authorizations - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_legacy_authorizations_prepare(**kwargs) - - return self.api_client.call_api( - '/private/legacy/authorizations', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorizations', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_legacy_authorizations_async(self, **kwargs): # noqa: E501,D401,D403 - """List all legacy authorizations. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str user_id: Only show legacy authorizations that belong to a user ID. - :param str user: Only show legacy authorizations that belong to a user name. - :param str org_id: Only show legacy authorizations that belong to an organization ID. - :param str org: Only show legacy authorizations that belong to a organization name. - :param str token: Only show legacy authorizations with a specified token (auth name). - :param str auth_id: Only show legacy authorizations with a specified auth ID. - :return: Authorizations - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_legacy_authorizations_prepare(**kwargs) - - return await self.api_client.call_api( - '/private/legacy/authorizations', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorizations', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_legacy_authorizations_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'user_id', 'user', 'org_id', 'org', 'token', 'auth_id'] # noqa: E501 - self._check_operation_params('get_legacy_authorizations', all_params, local_var_params) - - path_params = {} - - query_params = [] - if 'user_id' in local_var_params: - query_params.append(('userID', local_var_params['user_id'])) # noqa: E501 - if 'user' in local_var_params: - query_params.append(('user', local_var_params['user'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'token' in local_var_params: - query_params.append(('token', local_var_params['token'])) # noqa: E501 - if 'auth_id' in local_var_params: - query_params.append(('authID', local_var_params['auth_id'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_legacy_authorizations_id(self, auth_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a legacy authorization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_legacy_authorizations_id(auth_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: The ID of the legacy authorization to get. (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_legacy_authorizations_id_with_http_info(auth_id, **kwargs) # noqa: E501 - else: - (data) = self.get_legacy_authorizations_id_with_http_info(auth_id, **kwargs) # noqa: E501 - return data - - def get_legacy_authorizations_id_with_http_info(self, auth_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a legacy authorization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_legacy_authorizations_id_with_http_info(auth_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: The ID of the legacy authorization to get. (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_legacy_authorizations_id_prepare(auth_id, **kwargs) - - return self.api_client.call_api( - '/private/legacy/authorizations/{authID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_legacy_authorizations_id_async(self, auth_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a legacy authorization. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str auth_id: The ID of the legacy authorization to get. (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_legacy_authorizations_id_prepare(auth_id, **kwargs) - - return await self.api_client.call_api( - '/private/legacy/authorizations/{authID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_legacy_authorizations_id_prepare(self, auth_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['auth_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_legacy_authorizations_id', all_params, local_var_params) - # verify the required parameter 'auth_id' is set - if ('auth_id' not in local_var_params or - local_var_params['auth_id'] is None): - raise ValueError("Missing the required parameter `auth_id` when calling `get_legacy_authorizations_id`") # noqa: E501 - - path_params = {} - if 'auth_id' in local_var_params: - path_params['authID'] = local_var_params['auth_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_legacy_authorizations_id(self, auth_id, authorization_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a legacy authorization to be active or inactive. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_legacy_authorizations_id(auth_id, authorization_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: The ID of the legacy authorization to update. (required) - :param AuthorizationUpdateRequest authorization_update_request: Legacy authorization to update (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_legacy_authorizations_id_with_http_info(auth_id, authorization_update_request, **kwargs) # noqa: E501 - else: - (data) = self.patch_legacy_authorizations_id_with_http_info(auth_id, authorization_update_request, **kwargs) # noqa: E501 - return data - - def patch_legacy_authorizations_id_with_http_info(self, auth_id, authorization_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a legacy authorization to be active or inactive. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_legacy_authorizations_id_with_http_info(auth_id, authorization_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: The ID of the legacy authorization to update. (required) - :param AuthorizationUpdateRequest authorization_update_request: Legacy authorization to update (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_legacy_authorizations_id_prepare(auth_id, authorization_update_request, **kwargs) - - return self.api_client.call_api( - '/private/legacy/authorizations/{authID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_legacy_authorizations_id_async(self, auth_id, authorization_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a legacy authorization to be active or inactive. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str auth_id: The ID of the legacy authorization to update. (required) - :param AuthorizationUpdateRequest authorization_update_request: Legacy authorization to update (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_legacy_authorizations_id_prepare(auth_id, authorization_update_request, **kwargs) - - return await self.api_client.call_api( - '/private/legacy/authorizations/{authID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_legacy_authorizations_id_prepare(self, auth_id, authorization_update_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['auth_id', 'authorization_update_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_legacy_authorizations_id', all_params, local_var_params) - # verify the required parameter 'auth_id' is set - if ('auth_id' not in local_var_params or - local_var_params['auth_id'] is None): - raise ValueError("Missing the required parameter `auth_id` when calling `patch_legacy_authorizations_id`") # noqa: E501 - # verify the required parameter 'authorization_update_request' is set - if ('authorization_update_request' not in local_var_params or - local_var_params['authorization_update_request'] is None): - raise ValueError("Missing the required parameter `authorization_update_request` when calling `patch_legacy_authorizations_id`") # noqa: E501 - - path_params = {} - if 'auth_id' in local_var_params: - path_params['authID'] = local_var_params['auth_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'authorization_update_request' in local_var_params: - body_params = local_var_params['authorization_update_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_legacy_authorizations(self, legacy_authorization_post_request, **kwargs): # noqa: E501,D401,D403 - """Create a legacy authorization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_legacy_authorizations(legacy_authorization_post_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param LegacyAuthorizationPostRequest legacy_authorization_post_request: Legacy authorization to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_legacy_authorizations_with_http_info(legacy_authorization_post_request, **kwargs) # noqa: E501 - else: - (data) = self.post_legacy_authorizations_with_http_info(legacy_authorization_post_request, **kwargs) # noqa: E501 - return data - - def post_legacy_authorizations_with_http_info(self, legacy_authorization_post_request, **kwargs): # noqa: E501,D401,D403 - """Create a legacy authorization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_legacy_authorizations_with_http_info(legacy_authorization_post_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param LegacyAuthorizationPostRequest legacy_authorization_post_request: Legacy authorization to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_legacy_authorizations_prepare(legacy_authorization_post_request, **kwargs) - - return self.api_client.call_api( - '/private/legacy/authorizations', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_legacy_authorizations_async(self, legacy_authorization_post_request, **kwargs): # noqa: E501,D401,D403 - """Create a legacy authorization. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param LegacyAuthorizationPostRequest legacy_authorization_post_request: Legacy authorization to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Authorization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_legacy_authorizations_prepare(legacy_authorization_post_request, **kwargs) - - return await self.api_client.call_api( - '/private/legacy/authorizations', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Authorization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_legacy_authorizations_prepare(self, legacy_authorization_post_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['legacy_authorization_post_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_legacy_authorizations', all_params, local_var_params) - # verify the required parameter 'legacy_authorization_post_request' is set - if ('legacy_authorization_post_request' not in local_var_params or - local_var_params['legacy_authorization_post_request'] is None): - raise ValueError("Missing the required parameter `legacy_authorization_post_request` when calling `post_legacy_authorizations`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'legacy_authorization_post_request' in local_var_params: - body_params = local_var_params['legacy_authorization_post_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_legacy_authorizations_id_password(self, auth_id, password_reset_body, **kwargs): # noqa: E501,D401,D403 - """Set a legacy authorization password. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_legacy_authorizations_id_password(auth_id, password_reset_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: The ID of the legacy authorization to update. (required) - :param PasswordResetBody password_reset_body: New password (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_legacy_authorizations_id_password_with_http_info(auth_id, password_reset_body, **kwargs) # noqa: E501 - else: - (data) = self.post_legacy_authorizations_id_password_with_http_info(auth_id, password_reset_body, **kwargs) # noqa: E501 - return data - - def post_legacy_authorizations_id_password_with_http_info(self, auth_id, password_reset_body, **kwargs): # noqa: E501,D401,D403 - """Set a legacy authorization password. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_legacy_authorizations_id_password_with_http_info(auth_id, password_reset_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str auth_id: The ID of the legacy authorization to update. (required) - :param PasswordResetBody password_reset_body: New password (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_legacy_authorizations_id_password_prepare(auth_id, password_reset_body, **kwargs) - - return self.api_client.call_api( - '/private/legacy/authorizations/{authID}/password', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_legacy_authorizations_id_password_async(self, auth_id, password_reset_body, **kwargs): # noqa: E501,D401,D403 - """Set a legacy authorization password. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str auth_id: The ID of the legacy authorization to update. (required) - :param PasswordResetBody password_reset_body: New password (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_legacy_authorizations_id_password_prepare(auth_id, password_reset_body, **kwargs) - - return await self.api_client.call_api( - '/private/legacy/authorizations/{authID}/password', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_legacy_authorizations_id_password_prepare(self, auth_id, password_reset_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['auth_id', 'password_reset_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_legacy_authorizations_id_password', all_params, local_var_params) - # verify the required parameter 'auth_id' is set - if ('auth_id' not in local_var_params or - local_var_params['auth_id'] is None): - raise ValueError("Missing the required parameter `auth_id` when calling `post_legacy_authorizations_id_password`") # noqa: E501 - # verify the required parameter 'password_reset_body' is set - if ('password_reset_body' not in local_var_params or - local_var_params['password_reset_body'] is None): - raise ValueError("Missing the required parameter `password_reset_body` when calling `post_legacy_authorizations_id_password`") # noqa: E501 - - path_params = {} - if 'auth_id' in local_var_params: - path_params['authID'] = local_var_params['auth_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'password_reset_body' in local_var_params: - body_params = local_var_params['password_reset_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/metrics_service.py b/frogpilot/third_party/influxdb_client/service/metrics_service.py deleted file mode 100644 index 9e99de033..000000000 --- a/frogpilot/third_party/influxdb_client/service/metrics_service.py +++ /dev/null @@ -1,140 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class MetricsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """MetricsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def get_metrics(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve workload performance metrics. - - Returns metrics about the workload performance of an InfluxDB instance. Use this endpoint to get performance, resource, and usage metrics. #### Related guides - For the list of metrics categories, see [InfluxDB OSS metrics](https://docs.influxdata.com/influxdb/latest/reference/internals/metrics/). - Learn how to use InfluxDB to [scrape Prometheus metrics](https://docs.influxdata.com/influxdb/latest/write-data/developer-tools/scrape-prometheus-metrics/). - Learn how InfluxDB [parses the Prometheus exposition format](https://docs.influxdata.com/influxdb/latest/reference/prometheus-metrics/). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_metrics(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: str - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_metrics_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_metrics_with_http_info(**kwargs) # noqa: E501 - return data - - def get_metrics_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve workload performance metrics. - - Returns metrics about the workload performance of an InfluxDB instance. Use this endpoint to get performance, resource, and usage metrics. #### Related guides - For the list of metrics categories, see [InfluxDB OSS metrics](https://docs.influxdata.com/influxdb/latest/reference/internals/metrics/). - Learn how to use InfluxDB to [scrape Prometheus metrics](https://docs.influxdata.com/influxdb/latest/write-data/developer-tools/scrape-prometheus-metrics/). - Learn how InfluxDB [parses the Prometheus exposition format](https://docs.influxdata.com/influxdb/latest/reference/prometheus-metrics/). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_metrics_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: str - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_metrics_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/metrics', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='str', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_metrics_async(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve workload performance metrics. - - Returns metrics about the workload performance of an InfluxDB instance. Use this endpoint to get performance, resource, and usage metrics. #### Related guides - For the list of metrics categories, see [InfluxDB OSS metrics](https://docs.influxdata.com/influxdb/latest/reference/internals/metrics/). - Learn how to use InfluxDB to [scrape Prometheus metrics](https://docs.influxdata.com/influxdb/latest/write-data/developer-tools/scrape-prometheus-metrics/). - Learn how InfluxDB [parses the Prometheus exposition format](https://docs.influxdata.com/influxdb/latest/reference/prometheus-metrics/). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: str - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_metrics_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/metrics', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='str', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_metrics_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span'] # noqa: E501 - self._check_operation_params('get_metrics', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['text/plain', 'application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/notification_endpoints_service.py b/frogpilot/third_party/influxdb_client/service/notification_endpoints_service.py deleted file mode 100644 index 151b486a0..000000000 --- a/frogpilot/third_party/influxdb_client/service/notification_endpoints_service.py +++ /dev/null @@ -1,1137 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class NotificationEndpointsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """NotificationEndpointsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def create_notification_endpoint(self, post_notification_endpoint, **kwargs): # noqa: E501,D401,D403 - """Add a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.create_notification_endpoint(post_notification_endpoint, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PostNotificationEndpoint post_notification_endpoint: Notification endpoint to create (required) - :return: NotificationEndpoint - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.create_notification_endpoint_with_http_info(post_notification_endpoint, **kwargs) # noqa: E501 - else: - (data) = self.create_notification_endpoint_with_http_info(post_notification_endpoint, **kwargs) # noqa: E501 - return data - - def create_notification_endpoint_with_http_info(self, post_notification_endpoint, **kwargs): # noqa: E501,D401,D403 - """Add a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.create_notification_endpoint_with_http_info(post_notification_endpoint, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PostNotificationEndpoint post_notification_endpoint: Notification endpoint to create (required) - :return: NotificationEndpoint - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._create_notification_endpoint_prepare(post_notification_endpoint, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationEndpoints', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationEndpoint', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def create_notification_endpoint_async(self, post_notification_endpoint, **kwargs): # noqa: E501,D401,D403 - """Add a notification endpoint. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param PostNotificationEndpoint post_notification_endpoint: Notification endpoint to create (required) - :return: NotificationEndpoint - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._create_notification_endpoint_prepare(post_notification_endpoint, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationEndpoints', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationEndpoint', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _create_notification_endpoint_prepare(self, post_notification_endpoint, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['post_notification_endpoint'] # noqa: E501 - self._check_operation_params('create_notification_endpoint', all_params, local_var_params) - # verify the required parameter 'post_notification_endpoint' is set - if ('post_notification_endpoint' not in local_var_params or - local_var_params['post_notification_endpoint'] is None): - raise ValueError("Missing the required parameter `post_notification_endpoint` when calling `create_notification_endpoint`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - - body_params = None - if 'post_notification_endpoint' in local_var_params: - body_params = local_var_params['post_notification_endpoint'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_notification_endpoints_id(self, endpoint_id, **kwargs): # noqa: E501,D401,D403 - """Delete a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_notification_endpoints_id(endpoint_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_notification_endpoints_id_with_http_info(endpoint_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_notification_endpoints_id_with_http_info(endpoint_id, **kwargs) # noqa: E501 - return data - - def delete_notification_endpoints_id_with_http_info(self, endpoint_id, **kwargs): # noqa: E501,D401,D403 - """Delete a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_notification_endpoints_id_with_http_info(endpoint_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_notification_endpoints_id_prepare(endpoint_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_notification_endpoints_id_async(self, endpoint_id, **kwargs): # noqa: E501,D401,D403 - """Delete a notification endpoint. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_notification_endpoints_id_prepare(endpoint_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_notification_endpoints_id_prepare(self, endpoint_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['endpoint_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_notification_endpoints_id', all_params, local_var_params) - # verify the required parameter 'endpoint_id' is set - if ('endpoint_id' not in local_var_params or - local_var_params['endpoint_id'] is None): - raise ValueError("Missing the required parameter `endpoint_id` when calling `delete_notification_endpoints_id`") # noqa: E501 - - path_params = {} - if 'endpoint_id' in local_var_params: - path_params['endpointID'] = local_var_params['endpoint_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_notification_endpoints_id_labels_id(self, endpoint_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_notification_endpoints_id_labels_id(endpoint_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_notification_endpoints_id_labels_id_with_http_info(endpoint_id, label_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_notification_endpoints_id_labels_id_with_http_info(endpoint_id, label_id, **kwargs) # noqa: E501 - return data - - def delete_notification_endpoints_id_labels_id_with_http_info(self, endpoint_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_notification_endpoints_id_labels_id_with_http_info(endpoint_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_notification_endpoints_id_labels_id_prepare(endpoint_id, label_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_notification_endpoints_id_labels_id_async(self, endpoint_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a notification endpoint. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_notification_endpoints_id_labels_id_prepare(endpoint_id, label_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_notification_endpoints_id_labels_id_prepare(self, endpoint_id, label_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['endpoint_id', 'label_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_notification_endpoints_id_labels_id', all_params, local_var_params) - # verify the required parameter 'endpoint_id' is set - if ('endpoint_id' not in local_var_params or - local_var_params['endpoint_id'] is None): - raise ValueError("Missing the required parameter `endpoint_id` when calling `delete_notification_endpoints_id_labels_id`") # noqa: E501 - # verify the required parameter 'label_id' is set - if ('label_id' not in local_var_params or - local_var_params['label_id'] is None): - raise ValueError("Missing the required parameter `label_id` when calling `delete_notification_endpoints_id_labels_id`") # noqa: E501 - - path_params = {} - if 'endpoint_id' in local_var_params: - path_params['endpointID'] = local_var_params['endpoint_id'] # noqa: E501 - if 'label_id' in local_var_params: - path_params['labelID'] = local_var_params['label_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_notification_endpoints(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all notification endpoints. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_endpoints(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: Only show notification endpoints that belong to specific organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :return: NotificationEndpoints - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_notification_endpoints_with_http_info(org_id, **kwargs) # noqa: E501 - else: - (data) = self.get_notification_endpoints_with_http_info(org_id, **kwargs) # noqa: E501 - return data - - def get_notification_endpoints_with_http_info(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all notification endpoints. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_endpoints_with_http_info(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: Only show notification endpoints that belong to specific organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :return: NotificationEndpoints - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_endpoints_prepare(org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationEndpoints', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationEndpoints', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_notification_endpoints_async(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all notification endpoints. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: Only show notification endpoints that belong to specific organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :return: NotificationEndpoints - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_endpoints_prepare(org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationEndpoints', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationEndpoints', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_notification_endpoints_prepare(self, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'zap_trace_span', 'offset', 'limit'] # noqa: E501 - self._check_operation_params('get_notification_endpoints', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `get_notification_endpoints`") # noqa: E501 - - if 'offset' in local_var_params and local_var_params['offset'] < 0: # noqa: E501 - raise ValueError("Invalid value for parameter `offset` when calling `get_notification_endpoints`, must be a value greater than or equal to `0`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] > 100: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_notification_endpoints`, must be a value less than or equal to `100`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] < 1: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_notification_endpoints`, must be a value greater than or equal to `1`") # noqa: E501 - path_params = {} - - query_params = [] - if 'offset' in local_var_params: - query_params.append(('offset', local_var_params['offset'])) # noqa: E501 - if 'limit' in local_var_params: - query_params.append(('limit', local_var_params['limit'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_notification_endpoints_id(self, endpoint_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_endpoints_id(endpoint_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationEndpoint - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_notification_endpoints_id_with_http_info(endpoint_id, **kwargs) # noqa: E501 - else: - (data) = self.get_notification_endpoints_id_with_http_info(endpoint_id, **kwargs) # noqa: E501 - return data - - def get_notification_endpoints_id_with_http_info(self, endpoint_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_endpoints_id_with_http_info(endpoint_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationEndpoint - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_endpoints_id_prepare(endpoint_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationEndpoint', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_notification_endpoints_id_async(self, endpoint_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a notification endpoint. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationEndpoint - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_endpoints_id_prepare(endpoint_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationEndpoint', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_notification_endpoints_id_prepare(self, endpoint_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['endpoint_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_notification_endpoints_id', all_params, local_var_params) - # verify the required parameter 'endpoint_id' is set - if ('endpoint_id' not in local_var_params or - local_var_params['endpoint_id'] is None): - raise ValueError("Missing the required parameter `endpoint_id` when calling `get_notification_endpoints_id`") # noqa: E501 - - path_params = {} - if 'endpoint_id' in local_var_params: - path_params['endpointID'] = local_var_params['endpoint_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_notification_endpoints_id_labels(self, endpoint_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_endpoints_id_labels(endpoint_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_notification_endpoints_id_labels_with_http_info(endpoint_id, **kwargs) # noqa: E501 - else: - (data) = self.get_notification_endpoints_id_labels_with_http_info(endpoint_id, **kwargs) # noqa: E501 - return data - - def get_notification_endpoints_id_labels_with_http_info(self, endpoint_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_endpoints_id_labels_with_http_info(endpoint_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_endpoints_id_labels_prepare(endpoint_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_notification_endpoints_id_labels_async(self, endpoint_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a notification endpoint. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_endpoints_id_labels_prepare(endpoint_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_notification_endpoints_id_labels_prepare(self, endpoint_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['endpoint_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_notification_endpoints_id_labels', all_params, local_var_params) - # verify the required parameter 'endpoint_id' is set - if ('endpoint_id' not in local_var_params or - local_var_params['endpoint_id'] is None): - raise ValueError("Missing the required parameter `endpoint_id` when calling `get_notification_endpoints_id_labels`") # noqa: E501 - - path_params = {} - if 'endpoint_id' in local_var_params: - path_params['endpointID'] = local_var_params['endpoint_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_notification_endpoints_id(self, endpoint_id, notification_endpoint_update, **kwargs): # noqa: E501,D401,D403 - """Update a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_notification_endpoints_id(endpoint_id, notification_endpoint_update, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param NotificationEndpointUpdate notification_endpoint_update: Check update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationEndpoint - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_notification_endpoints_id_with_http_info(endpoint_id, notification_endpoint_update, **kwargs) # noqa: E501 - else: - (data) = self.patch_notification_endpoints_id_with_http_info(endpoint_id, notification_endpoint_update, **kwargs) # noqa: E501 - return data - - def patch_notification_endpoints_id_with_http_info(self, endpoint_id, notification_endpoint_update, **kwargs): # noqa: E501,D401,D403 - """Update a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_notification_endpoints_id_with_http_info(endpoint_id, notification_endpoint_update, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param NotificationEndpointUpdate notification_endpoint_update: Check update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationEndpoint - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_notification_endpoints_id_prepare(endpoint_id, notification_endpoint_update, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationEndpoint', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_notification_endpoints_id_async(self, endpoint_id, notification_endpoint_update, **kwargs): # noqa: E501,D401,D403 - """Update a notification endpoint. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param NotificationEndpointUpdate notification_endpoint_update: Check update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationEndpoint - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_notification_endpoints_id_prepare(endpoint_id, notification_endpoint_update, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationEndpoint', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_notification_endpoints_id_prepare(self, endpoint_id, notification_endpoint_update, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['endpoint_id', 'notification_endpoint_update', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_notification_endpoints_id', all_params, local_var_params) - # verify the required parameter 'endpoint_id' is set - if ('endpoint_id' not in local_var_params or - local_var_params['endpoint_id'] is None): - raise ValueError("Missing the required parameter `endpoint_id` when calling `patch_notification_endpoints_id`") # noqa: E501 - # verify the required parameter 'notification_endpoint_update' is set - if ('notification_endpoint_update' not in local_var_params or - local_var_params['notification_endpoint_update'] is None): - raise ValueError("Missing the required parameter `notification_endpoint_update` when calling `patch_notification_endpoints_id`") # noqa: E501 - - path_params = {} - if 'endpoint_id' in local_var_params: - path_params['endpointID'] = local_var_params['endpoint_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'notification_endpoint_update' in local_var_params: - body_params = local_var_params['notification_endpoint_update'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_notification_endpoint_id_labels(self, endpoint_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_notification_endpoint_id_labels(endpoint_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_notification_endpoint_id_labels_with_http_info(endpoint_id, label_mapping, **kwargs) # noqa: E501 - else: - (data) = self.post_notification_endpoint_id_labels_with_http_info(endpoint_id, label_mapping, **kwargs) # noqa: E501 - return data - - def post_notification_endpoint_id_labels_with_http_info(self, endpoint_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_notification_endpoint_id_labels_with_http_info(endpoint_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_notification_endpoint_id_labels_prepare(endpoint_id, label_mapping, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_notification_endpoint_id_labels_async(self, endpoint_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a notification endpoint. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_notification_endpoint_id_labels_prepare(endpoint_id, label_mapping, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_notification_endpoint_id_labels_prepare(self, endpoint_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['endpoint_id', 'label_mapping', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_notification_endpoint_id_labels', all_params, local_var_params) - # verify the required parameter 'endpoint_id' is set - if ('endpoint_id' not in local_var_params or - local_var_params['endpoint_id'] is None): - raise ValueError("Missing the required parameter `endpoint_id` when calling `post_notification_endpoint_id_labels`") # noqa: E501 - # verify the required parameter 'label_mapping' is set - if ('label_mapping' not in local_var_params or - local_var_params['label_mapping'] is None): - raise ValueError("Missing the required parameter `label_mapping` when calling `post_notification_endpoint_id_labels`") # noqa: E501 - - path_params = {} - if 'endpoint_id' in local_var_params: - path_params['endpointID'] = local_var_params['endpoint_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'label_mapping' in local_var_params: - body_params = local_var_params['label_mapping'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def put_notification_endpoints_id(self, endpoint_id, notification_endpoint, **kwargs): # noqa: E501,D401,D403 - """Update a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_notification_endpoints_id(endpoint_id, notification_endpoint, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param NotificationEndpoint notification_endpoint: A new notification endpoint to replace the existing endpoint with (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationEndpoint - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.put_notification_endpoints_id_with_http_info(endpoint_id, notification_endpoint, **kwargs) # noqa: E501 - else: - (data) = self.put_notification_endpoints_id_with_http_info(endpoint_id, notification_endpoint, **kwargs) # noqa: E501 - return data - - def put_notification_endpoints_id_with_http_info(self, endpoint_id, notification_endpoint, **kwargs): # noqa: E501,D401,D403 - """Update a notification endpoint. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_notification_endpoints_id_with_http_info(endpoint_id, notification_endpoint, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param NotificationEndpoint notification_endpoint: A new notification endpoint to replace the existing endpoint with (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationEndpoint - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_notification_endpoints_id_prepare(endpoint_id, notification_endpoint, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationEndpoint', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def put_notification_endpoints_id_async(self, endpoint_id, notification_endpoint, **kwargs): # noqa: E501,D401,D403 - """Update a notification endpoint. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str endpoint_id: The notification endpoint ID. (required) - :param NotificationEndpoint notification_endpoint: A new notification endpoint to replace the existing endpoint with (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationEndpoint - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_notification_endpoints_id_prepare(endpoint_id, notification_endpoint, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationEndpoints/{endpointID}', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationEndpoint', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _put_notification_endpoints_id_prepare(self, endpoint_id, notification_endpoint, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['endpoint_id', 'notification_endpoint', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('put_notification_endpoints_id', all_params, local_var_params) - # verify the required parameter 'endpoint_id' is set - if ('endpoint_id' not in local_var_params or - local_var_params['endpoint_id'] is None): - raise ValueError("Missing the required parameter `endpoint_id` when calling `put_notification_endpoints_id`") # noqa: E501 - # verify the required parameter 'notification_endpoint' is set - if ('notification_endpoint' not in local_var_params or - local_var_params['notification_endpoint'] is None): - raise ValueError("Missing the required parameter `notification_endpoint` when calling `put_notification_endpoints_id`") # noqa: E501 - - path_params = {} - if 'endpoint_id' in local_var_params: - path_params['endpointID'] = local_var_params['endpoint_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'notification_endpoint' in local_var_params: - body_params = local_var_params['notification_endpoint'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/notification_rules_service.py b/frogpilot/third_party/influxdb_client/service/notification_rules_service.py deleted file mode 100644 index 208feebbc..000000000 --- a/frogpilot/third_party/influxdb_client/service/notification_rules_service.py +++ /dev/null @@ -1,1149 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class NotificationRulesService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """NotificationRulesService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def create_notification_rule(self, post_notification_rule, **kwargs): # noqa: E501,D401,D403 - """Add a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.create_notification_rule(post_notification_rule, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PostNotificationRule post_notification_rule: Notification rule to create (required) - :return: NotificationRule - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.create_notification_rule_with_http_info(post_notification_rule, **kwargs) # noqa: E501 - else: - (data) = self.create_notification_rule_with_http_info(post_notification_rule, **kwargs) # noqa: E501 - return data - - def create_notification_rule_with_http_info(self, post_notification_rule, **kwargs): # noqa: E501,D401,D403 - """Add a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.create_notification_rule_with_http_info(post_notification_rule, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PostNotificationRule post_notification_rule: Notification rule to create (required) - :return: NotificationRule - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._create_notification_rule_prepare(post_notification_rule, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationRules', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationRule', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def create_notification_rule_async(self, post_notification_rule, **kwargs): # noqa: E501,D401,D403 - """Add a notification rule. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param PostNotificationRule post_notification_rule: Notification rule to create (required) - :return: NotificationRule - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._create_notification_rule_prepare(post_notification_rule, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationRules', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationRule', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _create_notification_rule_prepare(self, post_notification_rule, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['post_notification_rule'] # noqa: E501 - self._check_operation_params('create_notification_rule', all_params, local_var_params) - # verify the required parameter 'post_notification_rule' is set - if ('post_notification_rule' not in local_var_params or - local_var_params['post_notification_rule'] is None): - raise ValueError("Missing the required parameter `post_notification_rule` when calling `create_notification_rule`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - - body_params = None - if 'post_notification_rule' in local_var_params: - body_params = local_var_params['post_notification_rule'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_notification_rules_id(self, rule_id, **kwargs): # noqa: E501,D401,D403 - """Delete a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_notification_rules_id(rule_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_notification_rules_id_with_http_info(rule_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_notification_rules_id_with_http_info(rule_id, **kwargs) # noqa: E501 - return data - - def delete_notification_rules_id_with_http_info(self, rule_id, **kwargs): # noqa: E501,D401,D403 - """Delete a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_notification_rules_id_with_http_info(rule_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_notification_rules_id_prepare(rule_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_notification_rules_id_async(self, rule_id, **kwargs): # noqa: E501,D401,D403 - """Delete a notification rule. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_notification_rules_id_prepare(rule_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_notification_rules_id_prepare(self, rule_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['rule_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_notification_rules_id', all_params, local_var_params) - # verify the required parameter 'rule_id' is set - if ('rule_id' not in local_var_params or - local_var_params['rule_id'] is None): - raise ValueError("Missing the required parameter `rule_id` when calling `delete_notification_rules_id`") # noqa: E501 - - path_params = {} - if 'rule_id' in local_var_params: - path_params['ruleID'] = local_var_params['rule_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_notification_rules_id_labels_id(self, rule_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete label from a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_notification_rules_id_labels_id(rule_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_notification_rules_id_labels_id_with_http_info(rule_id, label_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_notification_rules_id_labels_id_with_http_info(rule_id, label_id, **kwargs) # noqa: E501 - return data - - def delete_notification_rules_id_labels_id_with_http_info(self, rule_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete label from a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_notification_rules_id_labels_id_with_http_info(rule_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_notification_rules_id_labels_id_prepare(rule_id, label_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_notification_rules_id_labels_id_async(self, rule_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete label from a notification rule. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_notification_rules_id_labels_id_prepare(rule_id, label_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_notification_rules_id_labels_id_prepare(self, rule_id, label_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['rule_id', 'label_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_notification_rules_id_labels_id', all_params, local_var_params) - # verify the required parameter 'rule_id' is set - if ('rule_id' not in local_var_params or - local_var_params['rule_id'] is None): - raise ValueError("Missing the required parameter `rule_id` when calling `delete_notification_rules_id_labels_id`") # noqa: E501 - # verify the required parameter 'label_id' is set - if ('label_id' not in local_var_params or - local_var_params['label_id'] is None): - raise ValueError("Missing the required parameter `label_id` when calling `delete_notification_rules_id_labels_id`") # noqa: E501 - - path_params = {} - if 'rule_id' in local_var_params: - path_params['ruleID'] = local_var_params['rule_id'] # noqa: E501 - if 'label_id' in local_var_params: - path_params['labelID'] = local_var_params['label_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_notification_rules(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all notification rules. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_rules(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: Only show notification rules that belong to a specific organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param str check_id: Only show notifications that belong to the specific check ID. - :param str tag: Only return notification rules that "would match" statuses which contain the tag key value pairs provided. - :return: NotificationRules - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_notification_rules_with_http_info(org_id, **kwargs) # noqa: E501 - else: - (data) = self.get_notification_rules_with_http_info(org_id, **kwargs) # noqa: E501 - return data - - def get_notification_rules_with_http_info(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all notification rules. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_rules_with_http_info(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: Only show notification rules that belong to a specific organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param str check_id: Only show notifications that belong to the specific check ID. - :param str tag: Only return notification rules that "would match" statuses which contain the tag key value pairs provided. - :return: NotificationRules - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_rules_prepare(org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationRules', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationRules', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_notification_rules_async(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all notification rules. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: Only show notification rules that belong to a specific organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param str check_id: Only show notifications that belong to the specific check ID. - :param str tag: Only return notification rules that "would match" statuses which contain the tag key value pairs provided. - :return: NotificationRules - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_rules_prepare(org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationRules', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationRules', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_notification_rules_prepare(self, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'zap_trace_span', 'offset', 'limit', 'check_id', 'tag'] # noqa: E501 - self._check_operation_params('get_notification_rules', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `get_notification_rules`") # noqa: E501 - - if 'offset' in local_var_params and local_var_params['offset'] < 0: # noqa: E501 - raise ValueError("Invalid value for parameter `offset` when calling `get_notification_rules`, must be a value greater than or equal to `0`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] > 100: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_notification_rules`, must be a value less than or equal to `100`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] < 1: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_notification_rules`, must be a value greater than or equal to `1`") # noqa: E501 - if 'tag' in local_var_params and not re.search(r'^[a-zA-Z0-9_]+:[a-zA-Z0-9_]+$', local_var_params['tag']): # noqa: E501 - raise ValueError("Invalid value for parameter `tag` when calling `get_notification_rules`, must conform to the pattern `/^[a-zA-Z0-9_]+:[a-zA-Z0-9_]+$/`") # noqa: E501 - path_params = {} - - query_params = [] - if 'offset' in local_var_params: - query_params.append(('offset', local_var_params['offset'])) # noqa: E501 - if 'limit' in local_var_params: - query_params.append(('limit', local_var_params['limit'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'check_id' in local_var_params: - query_params.append(('checkID', local_var_params['check_id'])) # noqa: E501 - if 'tag' in local_var_params: - query_params.append(('tag', local_var_params['tag'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_notification_rules_id(self, rule_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_rules_id(rule_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationRule - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_notification_rules_id_with_http_info(rule_id, **kwargs) # noqa: E501 - else: - (data) = self.get_notification_rules_id_with_http_info(rule_id, **kwargs) # noqa: E501 - return data - - def get_notification_rules_id_with_http_info(self, rule_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_rules_id_with_http_info(rule_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationRule - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_rules_id_prepare(rule_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationRule', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_notification_rules_id_async(self, rule_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a notification rule. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationRule - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_rules_id_prepare(rule_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationRule', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_notification_rules_id_prepare(self, rule_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['rule_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_notification_rules_id', all_params, local_var_params) - # verify the required parameter 'rule_id' is set - if ('rule_id' not in local_var_params or - local_var_params['rule_id'] is None): - raise ValueError("Missing the required parameter `rule_id` when calling `get_notification_rules_id`") # noqa: E501 - - path_params = {} - if 'rule_id' in local_var_params: - path_params['ruleID'] = local_var_params['rule_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_notification_rules_id_labels(self, rule_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_rules_id_labels(rule_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_notification_rules_id_labels_with_http_info(rule_id, **kwargs) # noqa: E501 - else: - (data) = self.get_notification_rules_id_labels_with_http_info(rule_id, **kwargs) # noqa: E501 - return data - - def get_notification_rules_id_labels_with_http_info(self, rule_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_rules_id_labels_with_http_info(rule_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_rules_id_labels_prepare(rule_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_notification_rules_id_labels_async(self, rule_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a notification rule. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_rules_id_labels_prepare(rule_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_notification_rules_id_labels_prepare(self, rule_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['rule_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_notification_rules_id_labels', all_params, local_var_params) - # verify the required parameter 'rule_id' is set - if ('rule_id' not in local_var_params or - local_var_params['rule_id'] is None): - raise ValueError("Missing the required parameter `rule_id` when calling `get_notification_rules_id_labels`") # noqa: E501 - - path_params = {} - if 'rule_id' in local_var_params: - path_params['ruleID'] = local_var_params['rule_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_notification_rules_id(self, rule_id, notification_rule_update, **kwargs): # noqa: E501,D401,D403 - """Update a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_notification_rules_id(rule_id, notification_rule_update, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param NotificationRuleUpdate notification_rule_update: Notification rule update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationRule - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_notification_rules_id_with_http_info(rule_id, notification_rule_update, **kwargs) # noqa: E501 - else: - (data) = self.patch_notification_rules_id_with_http_info(rule_id, notification_rule_update, **kwargs) # noqa: E501 - return data - - def patch_notification_rules_id_with_http_info(self, rule_id, notification_rule_update, **kwargs): # noqa: E501,D401,D403 - """Update a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_notification_rules_id_with_http_info(rule_id, notification_rule_update, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param NotificationRuleUpdate notification_rule_update: Notification rule update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationRule - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_notification_rules_id_prepare(rule_id, notification_rule_update, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationRule', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_notification_rules_id_async(self, rule_id, notification_rule_update, **kwargs): # noqa: E501,D401,D403 - """Update a notification rule. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param NotificationRuleUpdate notification_rule_update: Notification rule update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationRule - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_notification_rules_id_prepare(rule_id, notification_rule_update, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationRule', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_notification_rules_id_prepare(self, rule_id, notification_rule_update, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['rule_id', 'notification_rule_update', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_notification_rules_id', all_params, local_var_params) - # verify the required parameter 'rule_id' is set - if ('rule_id' not in local_var_params or - local_var_params['rule_id'] is None): - raise ValueError("Missing the required parameter `rule_id` when calling `patch_notification_rules_id`") # noqa: E501 - # verify the required parameter 'notification_rule_update' is set - if ('notification_rule_update' not in local_var_params or - local_var_params['notification_rule_update'] is None): - raise ValueError("Missing the required parameter `notification_rule_update` when calling `patch_notification_rules_id`") # noqa: E501 - - path_params = {} - if 'rule_id' in local_var_params: - path_params['ruleID'] = local_var_params['rule_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'notification_rule_update' in local_var_params: - body_params = local_var_params['notification_rule_update'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_notification_rule_id_labels(self, rule_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_notification_rule_id_labels(rule_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_notification_rule_id_labels_with_http_info(rule_id, label_mapping, **kwargs) # noqa: E501 - else: - (data) = self.post_notification_rule_id_labels_with_http_info(rule_id, label_mapping, **kwargs) # noqa: E501 - return data - - def post_notification_rule_id_labels_with_http_info(self, rule_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_notification_rule_id_labels_with_http_info(rule_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_notification_rule_id_labels_prepare(rule_id, label_mapping, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_notification_rule_id_labels_async(self, rule_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a notification rule. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_notification_rule_id_labels_prepare(rule_id, label_mapping, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_notification_rule_id_labels_prepare(self, rule_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['rule_id', 'label_mapping', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_notification_rule_id_labels', all_params, local_var_params) - # verify the required parameter 'rule_id' is set - if ('rule_id' not in local_var_params or - local_var_params['rule_id'] is None): - raise ValueError("Missing the required parameter `rule_id` when calling `post_notification_rule_id_labels`") # noqa: E501 - # verify the required parameter 'label_mapping' is set - if ('label_mapping' not in local_var_params or - local_var_params['label_mapping'] is None): - raise ValueError("Missing the required parameter `label_mapping` when calling `post_notification_rule_id_labels`") # noqa: E501 - - path_params = {} - if 'rule_id' in local_var_params: - path_params['ruleID'] = local_var_params['rule_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'label_mapping' in local_var_params: - body_params = local_var_params['label_mapping'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def put_notification_rules_id(self, rule_id, notification_rule, **kwargs): # noqa: E501,D401,D403 - """Update a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_notification_rules_id(rule_id, notification_rule, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param NotificationRule notification_rule: Notification rule update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationRule - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.put_notification_rules_id_with_http_info(rule_id, notification_rule, **kwargs) # noqa: E501 - else: - (data) = self.put_notification_rules_id_with_http_info(rule_id, notification_rule, **kwargs) # noqa: E501 - return data - - def put_notification_rules_id_with_http_info(self, rule_id, notification_rule, **kwargs): # noqa: E501,D401,D403 - """Update a notification rule. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_notification_rules_id_with_http_info(rule_id, notification_rule, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param NotificationRule notification_rule: Notification rule update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationRule - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_notification_rules_id_prepare(rule_id, notification_rule, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationRule', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def put_notification_rules_id_async(self, rule_id, notification_rule, **kwargs): # noqa: E501,D401,D403 - """Update a notification rule. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param NotificationRule notification_rule: Notification rule update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: NotificationRule - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_notification_rules_id_prepare(rule_id, notification_rule, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='NotificationRule', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _put_notification_rules_id_prepare(self, rule_id, notification_rule, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['rule_id', 'notification_rule', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('put_notification_rules_id', all_params, local_var_params) - # verify the required parameter 'rule_id' is set - if ('rule_id' not in local_var_params or - local_var_params['rule_id'] is None): - raise ValueError("Missing the required parameter `rule_id` when calling `put_notification_rules_id`") # noqa: E501 - # verify the required parameter 'notification_rule' is set - if ('notification_rule' not in local_var_params or - local_var_params['notification_rule'] is None): - raise ValueError("Missing the required parameter `notification_rule` when calling `put_notification_rules_id`") # noqa: E501 - - path_params = {} - if 'rule_id' in local_var_params: - path_params['ruleID'] = local_var_params['rule_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'notification_rule' in local_var_params: - body_params = local_var_params['notification_rule'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/organizations_service.py b/frogpilot/third_party/influxdb_client/service/organizations_service.py deleted file mode 100644 index 6d845a318..000000000 --- a/frogpilot/third_party/influxdb_client/service/organizations_service.py +++ /dev/null @@ -1,1427 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class OrganizationsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """OrganizationsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_orgs_id(self, org_id, **kwargs): # noqa: E501,D401,D403 - """Delete an organization. - - Deletes an organization. Deleting an organization from InfluxDB Cloud can't be undone. Once deleted, all data associated with the organization is removed. #### InfluxDB Cloud - Does the following when you send a delete request: 1. Validates the request and queues the delete. 2. Returns an HTTP `204` status code if queued; _error_ otherwise. 3. Handles the delete asynchronously. #### InfluxDB OSS - Validates the request, handles the delete synchronously, and then responds with success or failure. #### Limitations - Only one organization can be deleted per request. #### Related guides - [Delete organizations](https://docs.influxdata.com/influxdb/latest/organizations/delete-orgs/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_orgs_id(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_orgs_id_with_http_info(org_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_orgs_id_with_http_info(org_id, **kwargs) # noqa: E501 - return data - - def delete_orgs_id_with_http_info(self, org_id, **kwargs): # noqa: E501,D401,D403 - """Delete an organization. - - Deletes an organization. Deleting an organization from InfluxDB Cloud can't be undone. Once deleted, all data associated with the organization is removed. #### InfluxDB Cloud - Does the following when you send a delete request: 1. Validates the request and queues the delete. 2. Returns an HTTP `204` status code if queued; _error_ otherwise. 3. Handles the delete asynchronously. #### InfluxDB OSS - Validates the request, handles the delete synchronously, and then responds with success or failure. #### Limitations - Only one organization can be deleted per request. #### Related guides - [Delete organizations](https://docs.influxdata.com/influxdb/latest/organizations/delete-orgs/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_orgs_id_with_http_info(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_orgs_id_prepare(org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs/{orgID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_orgs_id_async(self, org_id, **kwargs): # noqa: E501,D401,D403 - """Delete an organization. - - Deletes an organization. Deleting an organization from InfluxDB Cloud can't be undone. Once deleted, all data associated with the organization is removed. #### InfluxDB Cloud - Does the following when you send a delete request: 1. Validates the request and queues the delete. 2. Returns an HTTP `204` status code if queued; _error_ otherwise. 3. Handles the delete asynchronously. #### InfluxDB OSS - Validates the request, handles the delete synchronously, and then responds with success or failure. #### Limitations - Only one organization can be deleted per request. #### Related guides - [Delete organizations](https://docs.influxdata.com/influxdb/latest/organizations/delete-orgs/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: The ID of the organization to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_orgs_id_prepare(org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs/{orgID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_orgs_id_prepare(self, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_orgs_id', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `delete_orgs_id`") # noqa: E501 - - path_params = {} - if 'org_id' in local_var_params: - path_params['orgID'] = local_var_params['org_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_orgs_id_members_id(self, user_id, org_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from an organization. - - Removes a member from an organization. Use this endpoint to remove a user's member privileges for an organization. Removing member privileges removes the user's `read` and `write` permissions from the organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Member permissions are separate from API token permissions. - Member permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to remove an owner from. #### Related guides - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_orgs_id_members_id(user_id, org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the user to remove. (required) - :param str org_id: The ID of the organization to remove a user from. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_orgs_id_members_id_with_http_info(user_id, org_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_orgs_id_members_id_with_http_info(user_id, org_id, **kwargs) # noqa: E501 - return data - - def delete_orgs_id_members_id_with_http_info(self, user_id, org_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from an organization. - - Removes a member from an organization. Use this endpoint to remove a user's member privileges for an organization. Removing member privileges removes the user's `read` and `write` permissions from the organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Member permissions are separate from API token permissions. - Member permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to remove an owner from. #### Related guides - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_orgs_id_members_id_with_http_info(user_id, org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the user to remove. (required) - :param str org_id: The ID of the organization to remove a user from. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_orgs_id_members_id_prepare(user_id, org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs/{orgID}/members/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_orgs_id_members_id_async(self, user_id, org_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from an organization. - - Removes a member from an organization. Use this endpoint to remove a user's member privileges for an organization. Removing member privileges removes the user's `read` and `write` permissions from the organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Member permissions are separate from API token permissions. - Member permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to remove an owner from. #### Related guides - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of the user to remove. (required) - :param str org_id: The ID of the organization to remove a user from. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_orgs_id_members_id_prepare(user_id, org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs/{orgID}/members/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_orgs_id_members_id_prepare(self, user_id, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'org_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_orgs_id_members_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `delete_orgs_id_members_id`") # noqa: E501 - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `delete_orgs_id_members_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - if 'org_id' in local_var_params: - path_params['orgID'] = local_var_params['org_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_orgs_id_owners_id(self, user_id, org_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from an organization. - - Removes an [owner](https://docs.influxdata.com/influxdb/latest/reference/glossary/#owner) from the organization. Organization owners have permission to delete organizations and remove user and member permissions from the organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Owner permissions are separate from API token permissions. - Owner permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to remove an owner from. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_orgs_id_owners_id(user_id, org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the user to remove. (required) - :param str org_id: The ID of the organization to remove an owner from. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_orgs_id_owners_id_with_http_info(user_id, org_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_orgs_id_owners_id_with_http_info(user_id, org_id, **kwargs) # noqa: E501 - return data - - def delete_orgs_id_owners_id_with_http_info(self, user_id, org_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from an organization. - - Removes an [owner](https://docs.influxdata.com/influxdb/latest/reference/glossary/#owner) from the organization. Organization owners have permission to delete organizations and remove user and member permissions from the organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Owner permissions are separate from API token permissions. - Owner permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to remove an owner from. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_orgs_id_owners_id_with_http_info(user_id, org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the user to remove. (required) - :param str org_id: The ID of the organization to remove an owner from. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_orgs_id_owners_id_prepare(user_id, org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs/{orgID}/owners/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_orgs_id_owners_id_async(self, user_id, org_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from an organization. - - Removes an [owner](https://docs.influxdata.com/influxdb/latest/reference/glossary/#owner) from the organization. Organization owners have permission to delete organizations and remove user and member permissions from the organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Owner permissions are separate from API token permissions. - Owner permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to remove an owner from. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of the user to remove. (required) - :param str org_id: The ID of the organization to remove an owner from. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_orgs_id_owners_id_prepare(user_id, org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs/{orgID}/owners/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_orgs_id_owners_id_prepare(self, user_id, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'org_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_orgs_id_owners_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `delete_orgs_id_owners_id`") # noqa: E501 - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `delete_orgs_id_owners_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - if 'org_id' in local_var_params: - path_params['orgID'] = local_var_params['org_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_orgs(self, **kwargs): # noqa: E501,D401,D403 - """List organizations. - - Lists [organizations](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization/). To limit which organizations are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all organizations up to the default `limit`. #### InfluxDB Cloud - Only returns the organization that owns the token passed in the request. #### Related guides - [View organizations](https://docs.influxdata.com/influxdb/latest/organizations/view-orgs/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_orgs(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param bool descending: - :param str org: An organization name. Only returns the specified organization. - :param str org_id: An organization ID. Only returns the specified organization. - :param str user_id: A user ID. Only returns organizations where the specified user is a member or owner. - :return: Organizations - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_orgs_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_orgs_with_http_info(**kwargs) # noqa: E501 - return data - - def get_orgs_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List organizations. - - Lists [organizations](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization/). To limit which organizations are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all organizations up to the default `limit`. #### InfluxDB Cloud - Only returns the organization that owns the token passed in the request. #### Related guides - [View organizations](https://docs.influxdata.com/influxdb/latest/organizations/view-orgs/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_orgs_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param bool descending: - :param str org: An organization name. Only returns the specified organization. - :param str org_id: An organization ID. Only returns the specified organization. - :param str user_id: A user ID. Only returns organizations where the specified user is a member or owner. - :return: Organizations - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_orgs_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Organizations', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_orgs_async(self, **kwargs): # noqa: E501,D401,D403 - """List organizations. - - Lists [organizations](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization/). To limit which organizations are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all organizations up to the default `limit`. #### InfluxDB Cloud - Only returns the organization that owns the token passed in the request. #### Related guides - [View organizations](https://docs.influxdata.com/influxdb/latest/organizations/view-orgs/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param bool descending: - :param str org: An organization name. Only returns the specified organization. - :param str org_id: An organization ID. Only returns the specified organization. - :param str user_id: A user ID. Only returns organizations where the specified user is a member or owner. - :return: Organizations - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_orgs_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Organizations', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_orgs_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'offset', 'limit', 'descending', 'org', 'org_id', 'user_id'] # noqa: E501 - self._check_operation_params('get_orgs', all_params, local_var_params) - - if 'offset' in local_var_params and local_var_params['offset'] < 0: # noqa: E501 - raise ValueError("Invalid value for parameter `offset` when calling `get_orgs`, must be a value greater than or equal to `0`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] > 100: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_orgs`, must be a value less than or equal to `100`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] < 1: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_orgs`, must be a value greater than or equal to `1`") # noqa: E501 - path_params = {} - - query_params = [] - if 'offset' in local_var_params: - query_params.append(('offset', local_var_params['offset'])) # noqa: E501 - if 'limit' in local_var_params: - query_params.append(('limit', local_var_params['limit'])) # noqa: E501 - if 'descending' in local_var_params: - query_params.append(('descending', local_var_params['descending'])) # noqa: E501 - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'user_id' in local_var_params: - query_params.append(('userID', local_var_params['user_id'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_orgs_id(self, org_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve an organization. - - Retrieves an organization. Use this endpoint to retrieve information for a specific organization. #### Related guides - [View organizations](https://docs.influxdata.com/influxdb/latest/organizations/view-orgs/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_orgs_id(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Organization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_orgs_id_with_http_info(org_id, **kwargs) # noqa: E501 - else: - (data) = self.get_orgs_id_with_http_info(org_id, **kwargs) # noqa: E501 - return data - - def get_orgs_id_with_http_info(self, org_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve an organization. - - Retrieves an organization. Use this endpoint to retrieve information for a specific organization. #### Related guides - [View organizations](https://docs.influxdata.com/influxdb/latest/organizations/view-orgs/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_orgs_id_with_http_info(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Organization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_orgs_id_prepare(org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs/{orgID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Organization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_orgs_id_async(self, org_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve an organization. - - Retrieves an organization. Use this endpoint to retrieve information for a specific organization. #### Related guides - [View organizations](https://docs.influxdata.com/influxdb/latest/organizations/view-orgs/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: The ID of the organization to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Organization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_orgs_id_prepare(org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs/{orgID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Organization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_orgs_id_prepare(self, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_orgs_id', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `get_orgs_id`") # noqa: E501 - - path_params = {} - if 'org_id' in local_var_params: - path_params['orgID'] = local_var_params['org_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_orgs_id_members(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all members of an organization. - - Lists all users that belong to an organization. InfluxDB [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) have permission to access InfluxDB. [Members](https://docs.influxdata.com/influxdb/latest/reference/glossary/#member) are users within the organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Member permissions are separate from API token permissions. - Member permissions are used in the context of the InfluxDB UI. #### Required permissions - `read-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to retrieve members for. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_orgs_id_members(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization to retrieve users for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_orgs_id_members_with_http_info(org_id, **kwargs) # noqa: E501 - else: - (data) = self.get_orgs_id_members_with_http_info(org_id, **kwargs) # noqa: E501 - return data - - def get_orgs_id_members_with_http_info(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all members of an organization. - - Lists all users that belong to an organization. InfluxDB [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) have permission to access InfluxDB. [Members](https://docs.influxdata.com/influxdb/latest/reference/glossary/#member) are users within the organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Member permissions are separate from API token permissions. - Member permissions are used in the context of the InfluxDB UI. #### Required permissions - `read-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to retrieve members for. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_orgs_id_members_with_http_info(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization to retrieve users for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_orgs_id_members_prepare(org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs/{orgID}/members', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMembers', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_orgs_id_members_async(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all members of an organization. - - Lists all users that belong to an organization. InfluxDB [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) have permission to access InfluxDB. [Members](https://docs.influxdata.com/influxdb/latest/reference/glossary/#member) are users within the organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Member permissions are separate from API token permissions. - Member permissions are used in the context of the InfluxDB UI. #### Required permissions - `read-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to retrieve members for. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: The ID of the organization to retrieve users for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_orgs_id_members_prepare(org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs/{orgID}/members', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMembers', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_orgs_id_members_prepare(self, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_orgs_id_members', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `get_orgs_id_members`") # noqa: E501 - - path_params = {} - if 'org_id' in local_var_params: - path_params['orgID'] = local_var_params['org_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_orgs_id_owners(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of an organization. - - Lists all owners of an organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Required permissions - `read-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to retrieve a list of owners from. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_orgs_id_owners(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization to list owners for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_orgs_id_owners_with_http_info(org_id, **kwargs) # noqa: E501 - else: - (data) = self.get_orgs_id_owners_with_http_info(org_id, **kwargs) # noqa: E501 - return data - - def get_orgs_id_owners_with_http_info(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of an organization. - - Lists all owners of an organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Required permissions - `read-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to retrieve a list of owners from. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_orgs_id_owners_with_http_info(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization to list owners for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_orgs_id_owners_prepare(org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs/{orgID}/owners', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwners', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_orgs_id_owners_async(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of an organization. - - Lists all owners of an organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Required permissions - `read-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to retrieve a list of owners from. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: The ID of the organization to list owners for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_orgs_id_owners_prepare(org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs/{orgID}/owners', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwners', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_orgs_id_owners_prepare(self, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_orgs_id_owners', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `get_orgs_id_owners`") # noqa: E501 - - path_params = {} - if 'org_id' in local_var_params: - path_params['orgID'] = local_var_params['org_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_orgs_id(self, org_id, patch_organization_request, **kwargs): # noqa: E501,D401,D403 - """Update an organization. - - Updates an organization. Use this endpoint to update properties (`name`, `description`) of an organization. Updating an organization’s name affects all resources that reference the organization by name, including the following: - Queries - Dashboards - Tasks - Telegraf configurations - Templates If you change an organization name, be sure to update the organization name in these resources as well. #### Related Guides - [Update an organization](https://docs.influxdata.com/influxdb/latest/organizations/update-org/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_orgs_id(org_id, patch_organization_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization to update. (required) - :param PatchOrganizationRequest patch_organization_request: The organization update to apply. (required) - :param str zap_trace_span: OpenTracing span context - :return: Organization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_orgs_id_with_http_info(org_id, patch_organization_request, **kwargs) # noqa: E501 - else: - (data) = self.patch_orgs_id_with_http_info(org_id, patch_organization_request, **kwargs) # noqa: E501 - return data - - def patch_orgs_id_with_http_info(self, org_id, patch_organization_request, **kwargs): # noqa: E501,D401,D403 - """Update an organization. - - Updates an organization. Use this endpoint to update properties (`name`, `description`) of an organization. Updating an organization’s name affects all resources that reference the organization by name, including the following: - Queries - Dashboards - Tasks - Telegraf configurations - Templates If you change an organization name, be sure to update the organization name in these resources as well. #### Related Guides - [Update an organization](https://docs.influxdata.com/influxdb/latest/organizations/update-org/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_orgs_id_with_http_info(org_id, patch_organization_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization to update. (required) - :param PatchOrganizationRequest patch_organization_request: The organization update to apply. (required) - :param str zap_trace_span: OpenTracing span context - :return: Organization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_orgs_id_prepare(org_id, patch_organization_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs/{orgID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Organization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_orgs_id_async(self, org_id, patch_organization_request, **kwargs): # noqa: E501,D401,D403 - """Update an organization. - - Updates an organization. Use this endpoint to update properties (`name`, `description`) of an organization. Updating an organization’s name affects all resources that reference the organization by name, including the following: - Queries - Dashboards - Tasks - Telegraf configurations - Templates If you change an organization name, be sure to update the organization name in these resources as well. #### Related Guides - [Update an organization](https://docs.influxdata.com/influxdb/latest/organizations/update-org/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: The ID of the organization to update. (required) - :param PatchOrganizationRequest patch_organization_request: The organization update to apply. (required) - :param str zap_trace_span: OpenTracing span context - :return: Organization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_orgs_id_prepare(org_id, patch_organization_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs/{orgID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Organization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_orgs_id_prepare(self, org_id, patch_organization_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'patch_organization_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_orgs_id', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `patch_orgs_id`") # noqa: E501 - # verify the required parameter 'patch_organization_request' is set - if ('patch_organization_request' not in local_var_params or - local_var_params['patch_organization_request'] is None): - raise ValueError("Missing the required parameter `patch_organization_request` when calling `patch_orgs_id`") # noqa: E501 - - path_params = {} - if 'org_id' in local_var_params: - path_params['orgID'] = local_var_params['org_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'patch_organization_request' in local_var_params: - body_params = local_var_params['patch_organization_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_orgs(self, post_organization_request, **kwargs): # noqa: E501,D401,D403 - """Create an organization. - - Creates an [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) and returns the newly created organization. #### InfluxDB Cloud - Doesn't allow you to use this endpoint to create organizations. #### Related guides - [Manage organizations](https://docs.influxdata.com/influxdb/latest/organizations) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_orgs(post_organization_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PostOrganizationRequest post_organization_request: The organization to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: Organization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_orgs_with_http_info(post_organization_request, **kwargs) # noqa: E501 - else: - (data) = self.post_orgs_with_http_info(post_organization_request, **kwargs) # noqa: E501 - return data - - def post_orgs_with_http_info(self, post_organization_request, **kwargs): # noqa: E501,D401,D403 - """Create an organization. - - Creates an [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) and returns the newly created organization. #### InfluxDB Cloud - Doesn't allow you to use this endpoint to create organizations. #### Related guides - [Manage organizations](https://docs.influxdata.com/influxdb/latest/organizations) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_orgs_with_http_info(post_organization_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PostOrganizationRequest post_organization_request: The organization to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: Organization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_orgs_prepare(post_organization_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Organization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_orgs_async(self, post_organization_request, **kwargs): # noqa: E501,D401,D403 - """Create an organization. - - Creates an [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) and returns the newly created organization. #### InfluxDB Cloud - Doesn't allow you to use this endpoint to create organizations. #### Related guides - [Manage organizations](https://docs.influxdata.com/influxdb/latest/organizations) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param PostOrganizationRequest post_organization_request: The organization to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: Organization - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_orgs_prepare(post_organization_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Organization', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_orgs_prepare(self, post_organization_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['post_organization_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_orgs', all_params, local_var_params) - # verify the required parameter 'post_organization_request' is set - if ('post_organization_request' not in local_var_params or - local_var_params['post_organization_request'] is None): - raise ValueError("Missing the required parameter `post_organization_request` when calling `post_orgs`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'post_organization_request' in local_var_params: - body_params = local_var_params['post_organization_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_orgs_id_members(self, org_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to an organization. - - Add a user to an organization. InfluxDB [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) have permission to access InfluxDB. [Members](https://docs.influxdata.com/influxdb/latest/reference/glossary/#member) are users within the organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Member permissions are separate from API token permissions. - Member permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to add a member to. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_orgs_id_members(org_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: The user to add to the organization. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_orgs_id_members_with_http_info(org_id, add_resource_member_request_body, **kwargs) # noqa: E501 - else: - (data) = self.post_orgs_id_members_with_http_info(org_id, add_resource_member_request_body, **kwargs) # noqa: E501 - return data - - def post_orgs_id_members_with_http_info(self, org_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to an organization. - - Add a user to an organization. InfluxDB [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) have permission to access InfluxDB. [Members](https://docs.influxdata.com/influxdb/latest/reference/glossary/#member) are users within the organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Member permissions are separate from API token permissions. - Member permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to add a member to. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_orgs_id_members_with_http_info(org_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: The user to add to the organization. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_orgs_id_members_prepare(org_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs/{orgID}/members', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMember', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_orgs_id_members_async(self, org_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to an organization. - - Add a user to an organization. InfluxDB [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) have permission to access InfluxDB. [Members](https://docs.influxdata.com/influxdb/latest/reference/glossary/#member) are users within the organization. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Limitations - Member permissions are separate from API token permissions. - Member permissions are used in the context of the InfluxDB UI. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to add a member to. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/users/) - [Manage members](https://docs.influxdata.com/influxdb/latest/organizations/members/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: The ID of the organization. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: The user to add to the organization. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_orgs_id_members_prepare(org_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs/{orgID}/members', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMember', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_orgs_id_members_prepare(self, org_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'add_resource_member_request_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_orgs_id_members', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `post_orgs_id_members`") # noqa: E501 - # verify the required parameter 'add_resource_member_request_body' is set - if ('add_resource_member_request_body' not in local_var_params or - local_var_params['add_resource_member_request_body'] is None): - raise ValueError("Missing the required parameter `add_resource_member_request_body` when calling `post_orgs_id_members`") # noqa: E501 - - path_params = {} - if 'org_id' in local_var_params: - path_params['orgID'] = local_var_params['org_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'add_resource_member_request_body' in local_var_params: - body_params = local_var_params['add_resource_member_request_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_orgs_id_owners(self, org_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to an organization. - - Adds an owner to an organization. Use this endpoint to assign the organization `owner` role to a user. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to add an owner for. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_orgs_id_owners(org_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization that you want to add an owner for. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: The user to add as an owner of the organization. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_orgs_id_owners_with_http_info(org_id, add_resource_member_request_body, **kwargs) # noqa: E501 - else: - (data) = self.post_orgs_id_owners_with_http_info(org_id, add_resource_member_request_body, **kwargs) # noqa: E501 - return data - - def post_orgs_id_owners_with_http_info(self, org_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to an organization. - - Adds an owner to an organization. Use this endpoint to assign the organization `owner` role to a user. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to add an owner for. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_orgs_id_owners_with_http_info(org_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The ID of the organization that you want to add an owner for. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: The user to add as an owner of the organization. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_orgs_id_owners_prepare(org_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs/{orgID}/owners', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwner', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_orgs_id_owners_async(self, org_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to an organization. - - Adds an owner to an organization. Use this endpoint to assign the organization `owner` role to a user. #### InfluxDB Cloud - Doesn't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. #### Required permissions - `write-orgs INFLUX_ORG_ID` *`INFLUX_ORG_ID`* is the ID of the organization that you want to add an owner for. #### Related endpoints - [Authorizations](#tag/Authorizations-(API-tokens)) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: The ID of the organization that you want to add an owner for. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: The user to add as an owner of the organization. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_orgs_id_owners_prepare(org_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs/{orgID}/owners', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwner', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_orgs_id_owners_prepare(self, org_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'add_resource_member_request_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_orgs_id_owners', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `post_orgs_id_owners`") # noqa: E501 - # verify the required parameter 'add_resource_member_request_body' is set - if ('add_resource_member_request_body' not in local_var_params or - local_var_params['add_resource_member_request_body'] is None): - raise ValueError("Missing the required parameter `add_resource_member_request_body` when calling `post_orgs_id_owners`") # noqa: E501 - - path_params = {} - if 'org_id' in local_var_params: - path_params['orgID'] = local_var_params['org_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'add_resource_member_request_body' in local_var_params: - body_params = local_var_params['add_resource_member_request_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/ping_service.py b/frogpilot/third_party/influxdb_client/service/ping_service.py deleted file mode 100644 index 2d89a745d..000000000 --- a/frogpilot/third_party/influxdb_client/service/ping_service.py +++ /dev/null @@ -1,232 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class PingService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """PingService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def get_ping(self, **kwargs): # noqa: E501,D401,D403 - """Get the status of the instance. - - Retrieves the status and InfluxDB version of the instance. Use this endpoint to monitor uptime for the InfluxDB instance. The response returns a HTTP `204` status code to inform you the instance is available. #### InfluxDB Cloud - Isn't versioned and doesn't return `X-Influxdb-Version` in the headers. #### Related guides - [Influx ping](https://docs.influxdata.com/influxdb/latest/reference/cli/influx/ping/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_ping(async_req=True) - >>> result = thread.get() - - :param async_req bool - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_ping_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_ping_with_http_info(**kwargs) # noqa: E501 - return data - - def get_ping_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Get the status of the instance. - - Retrieves the status and InfluxDB version of the instance. Use this endpoint to monitor uptime for the InfluxDB instance. The response returns a HTTP `204` status code to inform you the instance is available. #### InfluxDB Cloud - Isn't versioned and doesn't return `X-Influxdb-Version` in the headers. #### Related guides - [Influx ping](https://docs.influxdata.com/influxdb/latest/reference/cli/influx/ping/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_ping_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_ping_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/ping', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_ping_async(self, **kwargs): # noqa: E501,D401,D403 - """Get the status of the instance. - - Retrieves the status and InfluxDB version of the instance. Use this endpoint to monitor uptime for the InfluxDB instance. The response returns a HTTP `204` status code to inform you the instance is available. #### InfluxDB Cloud - Isn't versioned and doesn't return `X-Influxdb-Version` in the headers. #### Related guides - [Influx ping](https://docs.influxdata.com/influxdb/latest/reference/cli/influx/ping/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_ping_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/ping', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_ping_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = [] # noqa: E501 - self._check_operation_params('get_ping', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - - body_params = None - return local_var_params, path_params, query_params, header_params, body_params - - def head_ping(self, **kwargs): # noqa: E501,D401,D403 - """Get the status of the instance. - - Returns the status and InfluxDB version of the instance. Use this endpoint to monitor uptime for the InfluxDB instance. The response returns a HTTP `204` status code to inform you the instance is available. #### InfluxDB Cloud - Isn't versioned and doesn't return `X-Influxdb-Version` in the headers. #### Related guides - [Influx ping](https://docs.influxdata.com/influxdb/latest/reference/cli/influx/ping/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.head_ping(async_req=True) - >>> result = thread.get() - - :param async_req bool - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.head_ping_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.head_ping_with_http_info(**kwargs) # noqa: E501 - return data - - def head_ping_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Get the status of the instance. - - Returns the status and InfluxDB version of the instance. Use this endpoint to monitor uptime for the InfluxDB instance. The response returns a HTTP `204` status code to inform you the instance is available. #### InfluxDB Cloud - Isn't versioned and doesn't return `X-Influxdb-Version` in the headers. #### Related guides - [Influx ping](https://docs.influxdata.com/influxdb/latest/reference/cli/influx/ping/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.head_ping_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._head_ping_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/ping', 'HEAD', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def head_ping_async(self, **kwargs): # noqa: E501,D401,D403 - """Get the status of the instance. - - Returns the status and InfluxDB version of the instance. Use this endpoint to monitor uptime for the InfluxDB instance. The response returns a HTTP `204` status code to inform you the instance is available. #### InfluxDB Cloud - Isn't versioned and doesn't return `X-Influxdb-Version` in the headers. #### Related guides - [Influx ping](https://docs.influxdata.com/influxdb/latest/reference/cli/influx/ping/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._head_ping_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/ping', 'HEAD', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _head_ping_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = [] # noqa: E501 - self._check_operation_params('head_ping', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - - body_params = None - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/query_service.py b/frogpilot/third_party/influxdb_client/service/query_service.py deleted file mode 100644 index 0be81222a..000000000 --- a/frogpilot/third_party/influxdb_client/service/query_service.py +++ /dev/null @@ -1,646 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class QueryService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """QueryService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def get_query_suggestions(self, **kwargs): # noqa: E501,D401,D403 - """List Flux query suggestions. - - Lists Flux query suggestions. Each suggestion contains a [Flux function](https://docs.influxdata.com/flux/v0.x/stdlib/all-functions/) name and parameters. Use this endpoint to retrieve a list of Flux query suggestions used in the InfluxDB Flux Query Builder. #### Limitations - When writing a query, avoid using `_functionName()` helper functions exposed by this endpoint. Helper function names have an underscore (`_`) prefix and aren't meant to be used directly in queries--for example: - To sort on a column and keep the top n records, use the `top(n, columns=["_value"], tables=<-)` function instead of the `_sortLimit` helper function. `top` uses `_sortLimit`. #### Related Guides - [List of all Flux functions](https://docs.influxdata.com/flux/v0.x/stdlib/all-functions/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_query_suggestions(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: FluxSuggestions - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_query_suggestions_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_query_suggestions_with_http_info(**kwargs) # noqa: E501 - return data - - def get_query_suggestions_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List Flux query suggestions. - - Lists Flux query suggestions. Each suggestion contains a [Flux function](https://docs.influxdata.com/flux/v0.x/stdlib/all-functions/) name and parameters. Use this endpoint to retrieve a list of Flux query suggestions used in the InfluxDB Flux Query Builder. #### Limitations - When writing a query, avoid using `_functionName()` helper functions exposed by this endpoint. Helper function names have an underscore (`_`) prefix and aren't meant to be used directly in queries--for example: - To sort on a column and keep the top n records, use the `top(n, columns=["_value"], tables=<-)` function instead of the `_sortLimit` helper function. `top` uses `_sortLimit`. #### Related Guides - [List of all Flux functions](https://docs.influxdata.com/flux/v0.x/stdlib/all-functions/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_query_suggestions_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: FluxSuggestions - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_query_suggestions_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/query/suggestions', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='FluxSuggestions', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_query_suggestions_async(self, **kwargs): # noqa: E501,D401,D403 - """List Flux query suggestions. - - Lists Flux query suggestions. Each suggestion contains a [Flux function](https://docs.influxdata.com/flux/v0.x/stdlib/all-functions/) name and parameters. Use this endpoint to retrieve a list of Flux query suggestions used in the InfluxDB Flux Query Builder. #### Limitations - When writing a query, avoid using `_functionName()` helper functions exposed by this endpoint. Helper function names have an underscore (`_`) prefix and aren't meant to be used directly in queries--for example: - To sort on a column and keep the top n records, use the `top(n, columns=["_value"], tables=<-)` function instead of the `_sortLimit` helper function. `top` uses `_sortLimit`. #### Related Guides - [List of all Flux functions](https://docs.influxdata.com/flux/v0.x/stdlib/all-functions/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: FluxSuggestions - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_query_suggestions_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/query/suggestions', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='FluxSuggestions', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_query_suggestions_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span'] # noqa: E501 - self._check_operation_params('get_query_suggestions', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json', 'text/html']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_query_suggestions_name(self, name, **kwargs): # noqa: E501,D401,D403 - """Retrieve a query suggestion for a branching suggestion. - - Retrieves a query suggestion that contains the name and parameters of the requested function. Use this endpoint to pass a branching suggestion (a Flux function name) and retrieve the parameters of the requested function. #### Limitations - Use `/api/v2/query/suggestions/{name}` (without a trailing slash). `/api/v2/query/suggestions/{name}/` (note the trailing slash) results in a HTTP `301 Moved Permanently` status. - The function `name` must exist and must be spelled correctly. #### Related Guides - [List of all Flux functions](https://docs.influxdata.com/flux/v0.x/stdlib/all-functions/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_query_suggestions_name(name, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str name: A [Flux function](https://docs.influxdata.com/flux/v0.x/stdlib/all-functions/) name. (required) - :param str zap_trace_span: OpenTracing span context - :return: FluxSuggestion - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_query_suggestions_name_with_http_info(name, **kwargs) # noqa: E501 - else: - (data) = self.get_query_suggestions_name_with_http_info(name, **kwargs) # noqa: E501 - return data - - def get_query_suggestions_name_with_http_info(self, name, **kwargs): # noqa: E501,D401,D403 - """Retrieve a query suggestion for a branching suggestion. - - Retrieves a query suggestion that contains the name and parameters of the requested function. Use this endpoint to pass a branching suggestion (a Flux function name) and retrieve the parameters of the requested function. #### Limitations - Use `/api/v2/query/suggestions/{name}` (without a trailing slash). `/api/v2/query/suggestions/{name}/` (note the trailing slash) results in a HTTP `301 Moved Permanently` status. - The function `name` must exist and must be spelled correctly. #### Related Guides - [List of all Flux functions](https://docs.influxdata.com/flux/v0.x/stdlib/all-functions/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_query_suggestions_name_with_http_info(name, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str name: A [Flux function](https://docs.influxdata.com/flux/v0.x/stdlib/all-functions/) name. (required) - :param str zap_trace_span: OpenTracing span context - :return: FluxSuggestion - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_query_suggestions_name_prepare(name, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/query/suggestions/{name}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='FluxSuggestion', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_query_suggestions_name_async(self, name, **kwargs): # noqa: E501,D401,D403 - """Retrieve a query suggestion for a branching suggestion. - - Retrieves a query suggestion that contains the name and parameters of the requested function. Use this endpoint to pass a branching suggestion (a Flux function name) and retrieve the parameters of the requested function. #### Limitations - Use `/api/v2/query/suggestions/{name}` (without a trailing slash). `/api/v2/query/suggestions/{name}/` (note the trailing slash) results in a HTTP `301 Moved Permanently` status. - The function `name` must exist and must be spelled correctly. #### Related Guides - [List of all Flux functions](https://docs.influxdata.com/flux/v0.x/stdlib/all-functions/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str name: A [Flux function](https://docs.influxdata.com/flux/v0.x/stdlib/all-functions/) name. (required) - :param str zap_trace_span: OpenTracing span context - :return: FluxSuggestion - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_query_suggestions_name_prepare(name, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/query/suggestions/{name}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='FluxSuggestion', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_query_suggestions_name_prepare(self, name, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['name', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_query_suggestions_name', all_params, local_var_params) - # verify the required parameter 'name' is set - if ('name' not in local_var_params or - local_var_params['name'] is None): - raise ValueError("Missing the required parameter `name` when calling `get_query_suggestions_name`") # noqa: E501 - - path_params = {} - if 'name' in local_var_params: - path_params['name'] = local_var_params['name'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_query(self, **kwargs): # noqa: E501,D401,D403 - """Query data. - - Retrieves data from buckets. Use this endpoint to send a Flux query request and retrieve data from a bucket. #### Rate limits (with InfluxDB Cloud) `read` rate limits apply. For more information, see [limits and adjustable quotas](https://docs.influxdata.com/influxdb/cloud/account-management/limits/). #### Related guides - [Query with the InfluxDB API](https://docs.influxdata.com/influxdb/latest/query-data/execute-queries/influx-api/) - [Get started with Flux](https://docs.influxdata.com/flux/v0.x/get-started/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_query(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str accept_encoding: The content encoding (usually a compression algorithm) that the client can understand. - :param str content_type: - :param str org: An organization name or ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Queries the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or `orgID` parameter. - Queries the bucket in the specified organization. - :param str org_id: An organization ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Queries the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or `orgID` parameter. - Queries the bucket in the specified organization. - :param Query query: Flux query or specification to execute - :return: str - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_query_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.post_query_with_http_info(**kwargs) # noqa: E501 - return data - - def post_query_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Query data. - - Retrieves data from buckets. Use this endpoint to send a Flux query request and retrieve data from a bucket. #### Rate limits (with InfluxDB Cloud) `read` rate limits apply. For more information, see [limits and adjustable quotas](https://docs.influxdata.com/influxdb/cloud/account-management/limits/). #### Related guides - [Query with the InfluxDB API](https://docs.influxdata.com/influxdb/latest/query-data/execute-queries/influx-api/) - [Get started with Flux](https://docs.influxdata.com/flux/v0.x/get-started/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_query_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str accept_encoding: The content encoding (usually a compression algorithm) that the client can understand. - :param str content_type: - :param str org: An organization name or ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Queries the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or `orgID` parameter. - Queries the bucket in the specified organization. - :param str org_id: An organization ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Queries the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or `orgID` parameter. - Queries the bucket in the specified organization. - :param Query query: Flux query or specification to execute - :return: str - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_query_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/query', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='str', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_query_async(self, **kwargs): # noqa: E501,D401,D403 - """Query data. - - Retrieves data from buckets. Use this endpoint to send a Flux query request and retrieve data from a bucket. #### Rate limits (with InfluxDB Cloud) `read` rate limits apply. For more information, see [limits and adjustable quotas](https://docs.influxdata.com/influxdb/cloud/account-management/limits/). #### Related guides - [Query with the InfluxDB API](https://docs.influxdata.com/influxdb/latest/query-data/execute-queries/influx-api/) - [Get started with Flux](https://docs.influxdata.com/flux/v0.x/get-started/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str accept_encoding: The content encoding (usually a compression algorithm) that the client can understand. - :param str content_type: - :param str org: An organization name or ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Queries the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or `orgID` parameter. - Queries the bucket in the specified organization. - :param str org_id: An organization ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Queries the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or `orgID` parameter. - Queries the bucket in the specified organization. - :param Query query: Flux query or specification to execute - :return: str - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_query_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/query', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='str', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_query_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'accept_encoding', 'content_type', 'org', 'org_id', 'query'] # noqa: E501 - self._check_operation_params('post_query', all_params, local_var_params) - - path_params = {} - - query_params = [] - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'accept_encoding' in local_var_params: - header_params['Accept-Encoding'] = local_var_params['accept_encoding'] # noqa: E501 - if 'content_type' in local_var_params: - header_params['Content-Type'] = local_var_params['content_type'] # noqa: E501 - - body_params = None - if 'query' in local_var_params: - body_params = local_var_params['query'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/csv', 'application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json', 'application/vnd.flux']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_query_analyze(self, **kwargs): # noqa: E501,D401,D403 - r"""Analyze a Flux query. - - Analyzes a [Flux query](https://docs.influxdata.com/flux/v0.x/) for syntax errors and returns the list of errors. In the following sample query, `from()` is missing the property key. ```json { "query": "from(: \\"iot_center\\")\\ |> range(start: -90d)\\ |> filter(fn: (r) => r._measurement == \\"environment\\")", "type": "flux" } ``` If you pass this in a request to the `/api/v2/analyze` endpoint, InfluxDB returns an `errors` list that contains an error object for the missing key. #### Limitations - The endpoint doesn't validate values in the query--for example: - The following sample query has correct syntax, but contains an incorrect `from()` property key: ```json { "query": "from(foo: \\"iot_center\\")\\ |> range(start: -90d)\\ |> filter(fn: (r) => r._measurement == \\"environment\\")", "type": "flux" } ``` If you pass this in a request to the `/api/v2/analyze` endpoint, InfluxDB returns an empty `errors` list. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_query_analyze(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str content_type: - :param Query query: Flux query to analyze - :return: AnalyzeQueryResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_query_analyze_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.post_query_analyze_with_http_info(**kwargs) # noqa: E501 - return data - - def post_query_analyze_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - r"""Analyze a Flux query. - - Analyzes a [Flux query](https://docs.influxdata.com/flux/v0.x/) for syntax errors and returns the list of errors. In the following sample query, `from()` is missing the property key. ```json { "query": "from(: \\"iot_center\\")\\ |> range(start: -90d)\\ |> filter(fn: (r) => r._measurement == \\"environment\\")", "type": "flux" } ``` If you pass this in a request to the `/api/v2/analyze` endpoint, InfluxDB returns an `errors` list that contains an error object for the missing key. #### Limitations - The endpoint doesn't validate values in the query--for example: - The following sample query has correct syntax, but contains an incorrect `from()` property key: ```json { "query": "from(foo: \\"iot_center\\")\\ |> range(start: -90d)\\ |> filter(fn: (r) => r._measurement == \\"environment\\")", "type": "flux" } ``` If you pass this in a request to the `/api/v2/analyze` endpoint, InfluxDB returns an empty `errors` list. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_query_analyze_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str content_type: - :param Query query: Flux query to analyze - :return: AnalyzeQueryResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_query_analyze_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/query/analyze', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='AnalyzeQueryResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_query_analyze_async(self, **kwargs): # noqa: E501,D401,D403 - r"""Analyze a Flux query. - - Analyzes a [Flux query](https://docs.influxdata.com/flux/v0.x/) for syntax errors and returns the list of errors. In the following sample query, `from()` is missing the property key. ```json { "query": "from(: \\"iot_center\\")\\ |> range(start: -90d)\\ |> filter(fn: (r) => r._measurement == \\"environment\\")", "type": "flux" } ``` If you pass this in a request to the `/api/v2/analyze` endpoint, InfluxDB returns an `errors` list that contains an error object for the missing key. #### Limitations - The endpoint doesn't validate values in the query--for example: - The following sample query has correct syntax, but contains an incorrect `from()` property key: ```json { "query": "from(foo: \\"iot_center\\")\\ |> range(start: -90d)\\ |> filter(fn: (r) => r._measurement == \\"environment\\")", "type": "flux" } ``` If you pass this in a request to the `/api/v2/analyze` endpoint, InfluxDB returns an empty `errors` list. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str content_type: - :param Query query: Flux query to analyze - :return: AnalyzeQueryResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_query_analyze_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/query/analyze', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='AnalyzeQueryResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_query_analyze_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'content_type', 'query'] # noqa: E501 - self._check_operation_params('post_query_analyze', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'content_type' in local_var_params: - header_params['Content-Type'] = local_var_params['content_type'] # noqa: E501 - - body_params = None - if 'query' in local_var_params: - body_params = local_var_params['query'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_query_ast(self, **kwargs): # noqa: E501,D401,D403 - r"""Generate a query Abstract Syntax Tree (AST). - - Analyzes a Flux query and returns a complete package source [Abstract Syntax Tree (AST)](https://docs.influxdata.com/influxdb/latest/reference/glossary/#abstract-syntax-tree-ast) for the query. Use this endpoint for deep query analysis such as debugging unexpected query results. A Flux query AST provides a semantic, tree-like representation with contextual information about the query. The AST illustrates how the query is distributed into different components for execution. #### Limitations - The endpoint doesn't validate values in the query--for example: The following sample Flux query has correct syntax, but contains an incorrect `from()` property key: ```js from(foo: "iot_center") |> range(start: -90d) |> filter(fn: (r) => r._measurement == "environment") ``` The following sample JSON shows how to pass the query in the request body: ```js from(foo: "iot_center") |> range(start: -90d) |> filter(fn: (r) => r._measurement == "environment") ``` The following code sample shows how to pass the query as JSON in the request body: ```json { "query": "from(foo: \\"iot_center\\")\\ |> range(start: -90d)\\ |> filter(fn: (r) => r._measurement == \\"environment\\")" } ``` Passing this to `/api/v2/query/ast` will return a successful response with a generated AST. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_query_ast(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str content_type: - :param LanguageRequest language_request: The Flux query to analyze. - :return: ASTResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_query_ast_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.post_query_ast_with_http_info(**kwargs) # noqa: E501 - return data - - def post_query_ast_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - r"""Generate a query Abstract Syntax Tree (AST). - - Analyzes a Flux query and returns a complete package source [Abstract Syntax Tree (AST)](https://docs.influxdata.com/influxdb/latest/reference/glossary/#abstract-syntax-tree-ast) for the query. Use this endpoint for deep query analysis such as debugging unexpected query results. A Flux query AST provides a semantic, tree-like representation with contextual information about the query. The AST illustrates how the query is distributed into different components for execution. #### Limitations - The endpoint doesn't validate values in the query--for example: The following sample Flux query has correct syntax, but contains an incorrect `from()` property key: ```js from(foo: "iot_center") |> range(start: -90d) |> filter(fn: (r) => r._measurement == "environment") ``` The following sample JSON shows how to pass the query in the request body: ```js from(foo: "iot_center") |> range(start: -90d) |> filter(fn: (r) => r._measurement == "environment") ``` The following code sample shows how to pass the query as JSON in the request body: ```json { "query": "from(foo: \\"iot_center\\")\\ |> range(start: -90d)\\ |> filter(fn: (r) => r._measurement == \\"environment\\")" } ``` Passing this to `/api/v2/query/ast` will return a successful response with a generated AST. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_query_ast_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str content_type: - :param LanguageRequest language_request: The Flux query to analyze. - :return: ASTResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_query_ast_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/query/ast', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ASTResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_query_ast_async(self, **kwargs): # noqa: E501,D401,D403 - r"""Generate a query Abstract Syntax Tree (AST). - - Analyzes a Flux query and returns a complete package source [Abstract Syntax Tree (AST)](https://docs.influxdata.com/influxdb/latest/reference/glossary/#abstract-syntax-tree-ast) for the query. Use this endpoint for deep query analysis such as debugging unexpected query results. A Flux query AST provides a semantic, tree-like representation with contextual information about the query. The AST illustrates how the query is distributed into different components for execution. #### Limitations - The endpoint doesn't validate values in the query--for example: The following sample Flux query has correct syntax, but contains an incorrect `from()` property key: ```js from(foo: "iot_center") |> range(start: -90d) |> filter(fn: (r) => r._measurement == "environment") ``` The following sample JSON shows how to pass the query in the request body: ```js from(foo: "iot_center") |> range(start: -90d) |> filter(fn: (r) => r._measurement == "environment") ``` The following code sample shows how to pass the query as JSON in the request body: ```json { "query": "from(foo: \\"iot_center\\")\\ |> range(start: -90d)\\ |> filter(fn: (r) => r._measurement == \\"environment\\")" } ``` Passing this to `/api/v2/query/ast` will return a successful response with a generated AST. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str content_type: - :param LanguageRequest language_request: The Flux query to analyze. - :return: ASTResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_query_ast_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/query/ast', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ASTResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_query_ast_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'content_type', 'language_request'] # noqa: E501 - self._check_operation_params('post_query_ast', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'content_type' in local_var_params: - header_params['Content-Type'] = local_var_params['content_type'] # noqa: E501 - - body_params = None - if 'language_request' in local_var_params: - body_params = local_var_params['language_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/ready_service.py b/frogpilot/third_party/influxdb_client/service/ready_service.py deleted file mode 100644 index 407435ba7..000000000 --- a/frogpilot/third_party/influxdb_client/service/ready_service.py +++ /dev/null @@ -1,137 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class ReadyService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """ReadyService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def get_ready(self, **kwargs): # noqa: E501,D401,D403 - """Get the readiness of an instance at startup. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_ready(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: Ready - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_ready_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_ready_with_http_info(**kwargs) # noqa: E501 - return data - - def get_ready_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Get the readiness of an instance at startup. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_ready_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: Ready - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_ready_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/ready', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Ready', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_ready_async(self, **kwargs): # noqa: E501,D401,D403 - """Get the readiness of an instance at startup. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: Ready - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_ready_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/ready', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Ready', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_ready_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span'] # noqa: E501 - self._check_operation_params('get_ready', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/remote_connections_service.py b/frogpilot/third_party/influxdb_client/service/remote_connections_service.py deleted file mode 100644 index 7c591078a..000000000 --- a/frogpilot/third_party/influxdb_client/service/remote_connections_service.py +++ /dev/null @@ -1,632 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class RemoteConnectionsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """RemoteConnectionsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_remote_connection_by_id(self, remote_id, **kwargs): # noqa: E501,D401,D403 - """Delete a remote connection. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_remote_connection_by_id(remote_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str remote_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_remote_connection_by_id_with_http_info(remote_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_remote_connection_by_id_with_http_info(remote_id, **kwargs) # noqa: E501 - return data - - def delete_remote_connection_by_id_with_http_info(self, remote_id, **kwargs): # noqa: E501,D401,D403 - """Delete a remote connection. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_remote_connection_by_id_with_http_info(remote_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str remote_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_remote_connection_by_id_prepare(remote_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/remotes/{remoteID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_remote_connection_by_id_async(self, remote_id, **kwargs): # noqa: E501,D401,D403 - """Delete a remote connection. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str remote_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_remote_connection_by_id_prepare(remote_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/remotes/{remoteID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_remote_connection_by_id_prepare(self, remote_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['remote_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_remote_connection_by_id', all_params, local_var_params) - # verify the required parameter 'remote_id' is set - if ('remote_id' not in local_var_params or - local_var_params['remote_id'] is None): - raise ValueError("Missing the required parameter `remote_id` when calling `delete_remote_connection_by_id`") # noqa: E501 - - path_params = {} - if 'remote_id' in local_var_params: - path_params['remoteID'] = local_var_params['remote_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_remote_connection_by_id(self, remote_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a remote connection. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_remote_connection_by_id(remote_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str remote_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: RemoteConnection - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_remote_connection_by_id_with_http_info(remote_id, **kwargs) # noqa: E501 - else: - (data) = self.get_remote_connection_by_id_with_http_info(remote_id, **kwargs) # noqa: E501 - return data - - def get_remote_connection_by_id_with_http_info(self, remote_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a remote connection. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_remote_connection_by_id_with_http_info(remote_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str remote_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: RemoteConnection - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_remote_connection_by_id_prepare(remote_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/remotes/{remoteID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='RemoteConnection', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_remote_connection_by_id_async(self, remote_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a remote connection. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str remote_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: RemoteConnection - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_remote_connection_by_id_prepare(remote_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/remotes/{remoteID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='RemoteConnection', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_remote_connection_by_id_prepare(self, remote_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['remote_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_remote_connection_by_id', all_params, local_var_params) - # verify the required parameter 'remote_id' is set - if ('remote_id' not in local_var_params or - local_var_params['remote_id'] is None): - raise ValueError("Missing the required parameter `remote_id` when calling `get_remote_connection_by_id`") # noqa: E501 - - path_params = {} - if 'remote_id' in local_var_params: - path_params['remoteID'] = local_var_params['remote_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_remote_connections(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all remote connections. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_remote_connections(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str name: - :param str remote_url: - :return: RemoteConnections - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_remote_connections_with_http_info(org_id, **kwargs) # noqa: E501 - else: - (data) = self.get_remote_connections_with_http_info(org_id, **kwargs) # noqa: E501 - return data - - def get_remote_connections_with_http_info(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all remote connections. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_remote_connections_with_http_info(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str name: - :param str remote_url: - :return: RemoteConnections - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_remote_connections_prepare(org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/remotes', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='RemoteConnections', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_remote_connections_async(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all remote connections. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: The organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str name: - :param str remote_url: - :return: RemoteConnections - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_remote_connections_prepare(org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/remotes', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='RemoteConnections', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_remote_connections_prepare(self, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'zap_trace_span', 'name', 'remote_url'] # noqa: E501 - self._check_operation_params('get_remote_connections', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `get_remote_connections`") # noqa: E501 - - path_params = {} - - query_params = [] - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'name' in local_var_params: - query_params.append(('name', local_var_params['name'])) # noqa: E501 - if 'remote_url' in local_var_params: - query_params.append(('remoteURL', local_var_params['remote_url'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_remote_connection_by_id(self, remote_id, remote_connection_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a remote connection. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_remote_connection_by_id(remote_id, remote_connection_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str remote_id: (required) - :param RemoteConnectionUpdateRequest remote_connection_update_request: (required) - :param str zap_trace_span: OpenTracing span context - :return: RemoteConnection - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_remote_connection_by_id_with_http_info(remote_id, remote_connection_update_request, **kwargs) # noqa: E501 - else: - (data) = self.patch_remote_connection_by_id_with_http_info(remote_id, remote_connection_update_request, **kwargs) # noqa: E501 - return data - - def patch_remote_connection_by_id_with_http_info(self, remote_id, remote_connection_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a remote connection. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_remote_connection_by_id_with_http_info(remote_id, remote_connection_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str remote_id: (required) - :param RemoteConnectionUpdateRequest remote_connection_update_request: (required) - :param str zap_trace_span: OpenTracing span context - :return: RemoteConnection - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_remote_connection_by_id_prepare(remote_id, remote_connection_update_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/remotes/{remoteID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='RemoteConnection', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_remote_connection_by_id_async(self, remote_id, remote_connection_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a remote connection. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str remote_id: (required) - :param RemoteConnectionUpdateRequest remote_connection_update_request: (required) - :param str zap_trace_span: OpenTracing span context - :return: RemoteConnection - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_remote_connection_by_id_prepare(remote_id, remote_connection_update_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/remotes/{remoteID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='RemoteConnection', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_remote_connection_by_id_prepare(self, remote_id, remote_connection_update_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['remote_id', 'remote_connection_update_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_remote_connection_by_id', all_params, local_var_params) - # verify the required parameter 'remote_id' is set - if ('remote_id' not in local_var_params or - local_var_params['remote_id'] is None): - raise ValueError("Missing the required parameter `remote_id` when calling `patch_remote_connection_by_id`") # noqa: E501 - # verify the required parameter 'remote_connection_update_request' is set - if ('remote_connection_update_request' not in local_var_params or - local_var_params['remote_connection_update_request'] is None): - raise ValueError("Missing the required parameter `remote_connection_update_request` when calling `patch_remote_connection_by_id`") # noqa: E501 - - path_params = {} - if 'remote_id' in local_var_params: - path_params['remoteID'] = local_var_params['remote_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'remote_connection_update_request' in local_var_params: - body_params = local_var_params['remote_connection_update_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_remote_connection(self, remote_connection_creation_request, **kwargs): # noqa: E501,D401,D403 - """Register a new remote connection. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_remote_connection(remote_connection_creation_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param RemoteConnectionCreationRequest remote_connection_creation_request: (required) - :return: RemoteConnection - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_remote_connection_with_http_info(remote_connection_creation_request, **kwargs) # noqa: E501 - else: - (data) = self.post_remote_connection_with_http_info(remote_connection_creation_request, **kwargs) # noqa: E501 - return data - - def post_remote_connection_with_http_info(self, remote_connection_creation_request, **kwargs): # noqa: E501,D401,D403 - """Register a new remote connection. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_remote_connection_with_http_info(remote_connection_creation_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param RemoteConnectionCreationRequest remote_connection_creation_request: (required) - :return: RemoteConnection - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_remote_connection_prepare(remote_connection_creation_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/remotes', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='RemoteConnection', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_remote_connection_async(self, remote_connection_creation_request, **kwargs): # noqa: E501,D401,D403 - """Register a new remote connection. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param RemoteConnectionCreationRequest remote_connection_creation_request: (required) - :return: RemoteConnection - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_remote_connection_prepare(remote_connection_creation_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/remotes', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='RemoteConnection', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_remote_connection_prepare(self, remote_connection_creation_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['remote_connection_creation_request'] # noqa: E501 - self._check_operation_params('post_remote_connection', all_params, local_var_params) - # verify the required parameter 'remote_connection_creation_request' is set - if ('remote_connection_creation_request' not in local_var_params or - local_var_params['remote_connection_creation_request'] is None): - raise ValueError("Missing the required parameter `remote_connection_creation_request` when calling `post_remote_connection`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - - body_params = None - if 'remote_connection_creation_request' in local_var_params: - body_params = local_var_params['remote_connection_creation_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/replications_service.py b/frogpilot/third_party/influxdb_client/service/replications_service.py deleted file mode 100644 index 2130490ab..000000000 --- a/frogpilot/third_party/influxdb_client/service/replications_service.py +++ /dev/null @@ -1,768 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class ReplicationsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """ReplicationsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_replication_by_id(self, replication_id, **kwargs): # noqa: E501,D401,D403 - """Delete a replication. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_replication_by_id(replication_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str replication_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_replication_by_id_with_http_info(replication_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_replication_by_id_with_http_info(replication_id, **kwargs) # noqa: E501 - return data - - def delete_replication_by_id_with_http_info(self, replication_id, **kwargs): # noqa: E501,D401,D403 - """Delete a replication. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_replication_by_id_with_http_info(replication_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str replication_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_replication_by_id_prepare(replication_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/replications/{replicationID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_replication_by_id_async(self, replication_id, **kwargs): # noqa: E501,D401,D403 - """Delete a replication. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str replication_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_replication_by_id_prepare(replication_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/replications/{replicationID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_replication_by_id_prepare(self, replication_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['replication_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_replication_by_id', all_params, local_var_params) - # verify the required parameter 'replication_id' is set - if ('replication_id' not in local_var_params or - local_var_params['replication_id'] is None): - raise ValueError("Missing the required parameter `replication_id` when calling `delete_replication_by_id`") # noqa: E501 - - path_params = {} - if 'replication_id' in local_var_params: - path_params['replicationID'] = local_var_params['replication_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_replication_by_id(self, replication_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a replication. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_replication_by_id(replication_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str replication_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: Replication - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_replication_by_id_with_http_info(replication_id, **kwargs) # noqa: E501 - else: - (data) = self.get_replication_by_id_with_http_info(replication_id, **kwargs) # noqa: E501 - return data - - def get_replication_by_id_with_http_info(self, replication_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a replication. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_replication_by_id_with_http_info(replication_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str replication_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: Replication - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_replication_by_id_prepare(replication_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/replications/{replicationID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Replication', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_replication_by_id_async(self, replication_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a replication. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str replication_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: Replication - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_replication_by_id_prepare(replication_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/replications/{replicationID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Replication', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_replication_by_id_prepare(self, replication_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['replication_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_replication_by_id', all_params, local_var_params) - # verify the required parameter 'replication_id' is set - if ('replication_id' not in local_var_params or - local_var_params['replication_id'] is None): - raise ValueError("Missing the required parameter `replication_id` when calling `get_replication_by_id`") # noqa: E501 - - path_params = {} - if 'replication_id' in local_var_params: - path_params['replicationID'] = local_var_params['replication_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_replications(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all replications. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_replications(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str name: - :param str remote_id: - :param str local_bucket_id: - :return: Replications - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_replications_with_http_info(org_id, **kwargs) # noqa: E501 - else: - (data) = self.get_replications_with_http_info(org_id, **kwargs) # noqa: E501 - return data - - def get_replications_with_http_info(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all replications. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_replications_with_http_info(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str name: - :param str remote_id: - :param str local_bucket_id: - :return: Replications - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_replications_prepare(org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/replications', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Replications', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_replications_async(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all replications. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: The organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str name: - :param str remote_id: - :param str local_bucket_id: - :return: Replications - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_replications_prepare(org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/replications', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Replications', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_replications_prepare(self, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'zap_trace_span', 'name', 'remote_id', 'local_bucket_id'] # noqa: E501 - self._check_operation_params('get_replications', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `get_replications`") # noqa: E501 - - path_params = {} - - query_params = [] - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'name' in local_var_params: - query_params.append(('name', local_var_params['name'])) # noqa: E501 - if 'remote_id' in local_var_params: - query_params.append(('remoteID', local_var_params['remote_id'])) # noqa: E501 - if 'local_bucket_id' in local_var_params: - query_params.append(('localBucketID', local_var_params['local_bucket_id'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_replication_by_id(self, replication_id, replication_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a replication. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_replication_by_id(replication_id, replication_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str replication_id: (required) - :param ReplicationUpdateRequest replication_update_request: (required) - :param str zap_trace_span: OpenTracing span context - :param bool validate: If true, validate the updated information, but don't save it. - :return: Replication - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_replication_by_id_with_http_info(replication_id, replication_update_request, **kwargs) # noqa: E501 - else: - (data) = self.patch_replication_by_id_with_http_info(replication_id, replication_update_request, **kwargs) # noqa: E501 - return data - - def patch_replication_by_id_with_http_info(self, replication_id, replication_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a replication. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_replication_by_id_with_http_info(replication_id, replication_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str replication_id: (required) - :param ReplicationUpdateRequest replication_update_request: (required) - :param str zap_trace_span: OpenTracing span context - :param bool validate: If true, validate the updated information, but don't save it. - :return: Replication - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_replication_by_id_prepare(replication_id, replication_update_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/replications/{replicationID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Replication', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_replication_by_id_async(self, replication_id, replication_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a replication. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str replication_id: (required) - :param ReplicationUpdateRequest replication_update_request: (required) - :param str zap_trace_span: OpenTracing span context - :param bool validate: If true, validate the updated information, but don't save it. - :return: Replication - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_replication_by_id_prepare(replication_id, replication_update_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/replications/{replicationID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Replication', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_replication_by_id_prepare(self, replication_id, replication_update_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['replication_id', 'replication_update_request', 'zap_trace_span', 'validate'] # noqa: E501 - self._check_operation_params('patch_replication_by_id', all_params, local_var_params) - # verify the required parameter 'replication_id' is set - if ('replication_id' not in local_var_params or - local_var_params['replication_id'] is None): - raise ValueError("Missing the required parameter `replication_id` when calling `patch_replication_by_id`") # noqa: E501 - # verify the required parameter 'replication_update_request' is set - if ('replication_update_request' not in local_var_params or - local_var_params['replication_update_request'] is None): - raise ValueError("Missing the required parameter `replication_update_request` when calling `patch_replication_by_id`") # noqa: E501 - - path_params = {} - if 'replication_id' in local_var_params: - path_params['replicationID'] = local_var_params['replication_id'] # noqa: E501 - - query_params = [] - if 'validate' in local_var_params: - query_params.append(('validate', local_var_params['validate'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'replication_update_request' in local_var_params: - body_params = local_var_params['replication_update_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_replication(self, replication_creation_request, **kwargs): # noqa: E501,D401,D403 - """Register a new replication. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_replication(replication_creation_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param ReplicationCreationRequest replication_creation_request: (required) - :param str zap_trace_span: OpenTracing span context - :param bool validate: If true, validate the replication, but don't save it. - :return: Replication - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_replication_with_http_info(replication_creation_request, **kwargs) # noqa: E501 - else: - (data) = self.post_replication_with_http_info(replication_creation_request, **kwargs) # noqa: E501 - return data - - def post_replication_with_http_info(self, replication_creation_request, **kwargs): # noqa: E501,D401,D403 - """Register a new replication. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_replication_with_http_info(replication_creation_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param ReplicationCreationRequest replication_creation_request: (required) - :param str zap_trace_span: OpenTracing span context - :param bool validate: If true, validate the replication, but don't save it. - :return: Replication - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_replication_prepare(replication_creation_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/replications', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Replication', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_replication_async(self, replication_creation_request, **kwargs): # noqa: E501,D401,D403 - """Register a new replication. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param ReplicationCreationRequest replication_creation_request: (required) - :param str zap_trace_span: OpenTracing span context - :param bool validate: If true, validate the replication, but don't save it. - :return: Replication - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_replication_prepare(replication_creation_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/replications', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Replication', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_replication_prepare(self, replication_creation_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['replication_creation_request', 'zap_trace_span', 'validate'] # noqa: E501 - self._check_operation_params('post_replication', all_params, local_var_params) - # verify the required parameter 'replication_creation_request' is set - if ('replication_creation_request' not in local_var_params or - local_var_params['replication_creation_request'] is None): - raise ValueError("Missing the required parameter `replication_creation_request` when calling `post_replication`") # noqa: E501 - - path_params = {} - - query_params = [] - if 'validate' in local_var_params: - query_params.append(('validate', local_var_params['validate'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'replication_creation_request' in local_var_params: - body_params = local_var_params['replication_creation_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_validate_replication_by_id(self, replication_id, **kwargs): # noqa: E501,D401,D403 - """Validate a replication. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_validate_replication_by_id(replication_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str replication_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_validate_replication_by_id_with_http_info(replication_id, **kwargs) # noqa: E501 - else: - (data) = self.post_validate_replication_by_id_with_http_info(replication_id, **kwargs) # noqa: E501 - return data - - def post_validate_replication_by_id_with_http_info(self, replication_id, **kwargs): # noqa: E501,D401,D403 - """Validate a replication. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_validate_replication_by_id_with_http_info(replication_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str replication_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_validate_replication_by_id_prepare(replication_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/replications/{replicationID}/validate', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_validate_replication_by_id_async(self, replication_id, **kwargs): # noqa: E501,D401,D403 - """Validate a replication. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str replication_id: (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_validate_replication_by_id_prepare(replication_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/replications/{replicationID}/validate', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_validate_replication_by_id_prepare(self, replication_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['replication_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_validate_replication_by_id', all_params, local_var_params) - # verify the required parameter 'replication_id' is set - if ('replication_id' not in local_var_params or - local_var_params['replication_id'] is None): - raise ValueError("Missing the required parameter `replication_id` when calling `post_validate_replication_by_id`") # noqa: E501 - - path_params = {} - if 'replication_id' in local_var_params: - path_params['replicationID'] = local_var_params['replication_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/resources_service.py b/frogpilot/third_party/influxdb_client/service/resources_service.py deleted file mode 100644 index d86cfe393..000000000 --- a/frogpilot/third_party/influxdb_client/service/resources_service.py +++ /dev/null @@ -1,137 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class ResourcesService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """ResourcesService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def get_resources(self, **kwargs): # noqa: E501,D401,D403 - """List all known resources. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_resources(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: list[str] - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_resources_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_resources_with_http_info(**kwargs) # noqa: E501 - return data - - def get_resources_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List all known resources. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_resources_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: list[str] - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_resources_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/resources', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='list[str]', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_resources_async(self, **kwargs): # noqa: E501,D401,D403 - """List all known resources. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: list[str] - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_resources_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/resources', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='list[str]', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_resources_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span'] # noqa: E501 - self._check_operation_params('get_resources', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/restore_service.py b/frogpilot/third_party/influxdb_client/service/restore_service.py deleted file mode 100644 index 6275ed018..000000000 --- a/frogpilot/third_party/influxdb_client/service/restore_service.py +++ /dev/null @@ -1,683 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class RestoreService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """RestoreService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def post_restore_bucket_id(self, bucket_id, body, **kwargs): # noqa: E501,D401,D403 - """Overwrite storage metadata for a bucket with shard info from a backup.. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_restore_bucket_id(bucket_id, body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The bucket ID. (required) - :param str body: Database info serialized as protobuf. (required) - :param str zap_trace_span: OpenTracing span context - :param str content_type: - :return: str - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_restore_bucket_id_with_http_info(bucket_id, body, **kwargs) # noqa: E501 - else: - (data) = self.post_restore_bucket_id_with_http_info(bucket_id, body, **kwargs) # noqa: E501 - return data - - def post_restore_bucket_id_with_http_info(self, bucket_id, body, **kwargs): # noqa: E501,D401,D403 - """Overwrite storage metadata for a bucket with shard info from a backup.. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_restore_bucket_id_with_http_info(bucket_id, body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str bucket_id: The bucket ID. (required) - :param str body: Database info serialized as protobuf. (required) - :param str zap_trace_span: OpenTracing span context - :param str content_type: - :return: str - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_restore_bucket_id_prepare(bucket_id, body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/restore/bucket/{bucketID}', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='str', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_restore_bucket_id_async(self, bucket_id, body, **kwargs): # noqa: E501,D401,D403 - """Overwrite storage metadata for a bucket with shard info from a backup.. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str bucket_id: The bucket ID. (required) - :param str body: Database info serialized as protobuf. (required) - :param str zap_trace_span: OpenTracing span context - :param str content_type: - :return: str - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_restore_bucket_id_prepare(bucket_id, body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/restore/bucket/{bucketID}', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='str', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_restore_bucket_id_prepare(self, bucket_id, body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_id', 'body', 'zap_trace_span', 'content_type'] # noqa: E501 - self._check_operation_params('post_restore_bucket_id', all_params, local_var_params) - # verify the required parameter 'bucket_id' is set - if ('bucket_id' not in local_var_params or - local_var_params['bucket_id'] is None): - raise ValueError("Missing the required parameter `bucket_id` when calling `post_restore_bucket_id`") # noqa: E501 - # verify the required parameter 'body' is set - if ('body' not in local_var_params or - local_var_params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `post_restore_bucket_id`") # noqa: E501 - - path_params = {} - if 'bucket_id' in local_var_params: - path_params['bucketID'] = local_var_params['bucket_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'content_type' in local_var_params: - header_params['Content-Type'] = local_var_params['content_type'] # noqa: E501 - - body_params = None - if 'body' in local_var_params: - body_params = local_var_params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['text/plain']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_restore_bucket_metadata(self, bucket_metadata_manifest, **kwargs): # noqa: E501,D401,D403 - """Create a new bucket pre-seeded with shard info from a backup.. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_restore_bucket_metadata(bucket_metadata_manifest, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param BucketMetadataManifest bucket_metadata_manifest: Metadata manifest for a bucket. (required) - :param str zap_trace_span: OpenTracing span context - :return: RestoredBucketMappings - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_restore_bucket_metadata_with_http_info(bucket_metadata_manifest, **kwargs) # noqa: E501 - else: - (data) = self.post_restore_bucket_metadata_with_http_info(bucket_metadata_manifest, **kwargs) # noqa: E501 - return data - - def post_restore_bucket_metadata_with_http_info(self, bucket_metadata_manifest, **kwargs): # noqa: E501,D401,D403 - """Create a new bucket pre-seeded with shard info from a backup.. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_restore_bucket_metadata_with_http_info(bucket_metadata_manifest, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param BucketMetadataManifest bucket_metadata_manifest: Metadata manifest for a bucket. (required) - :param str zap_trace_span: OpenTracing span context - :return: RestoredBucketMappings - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_restore_bucket_metadata_prepare(bucket_metadata_manifest, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/restore/bucketMetadata', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='RestoredBucketMappings', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_restore_bucket_metadata_async(self, bucket_metadata_manifest, **kwargs): # noqa: E501,D401,D403 - """Create a new bucket pre-seeded with shard info from a backup.. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param BucketMetadataManifest bucket_metadata_manifest: Metadata manifest for a bucket. (required) - :param str zap_trace_span: OpenTracing span context - :return: RestoredBucketMappings - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_restore_bucket_metadata_prepare(bucket_metadata_manifest, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/restore/bucketMetadata', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='RestoredBucketMappings', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_restore_bucket_metadata_prepare(self, bucket_metadata_manifest, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['bucket_metadata_manifest', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_restore_bucket_metadata', all_params, local_var_params) - # verify the required parameter 'bucket_metadata_manifest' is set - if ('bucket_metadata_manifest' not in local_var_params or - local_var_params['bucket_metadata_manifest'] is None): - raise ValueError("Missing the required parameter `bucket_metadata_manifest` when calling `post_restore_bucket_metadata`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'bucket_metadata_manifest' in local_var_params: - body_params = local_var_params['bucket_metadata_manifest'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_restore_kv(self, body, **kwargs): # noqa: E501,D401,D403 - """Overwrite the embedded KV store on the server with a backed-up snapshot.. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_restore_kv(body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param file body: Full KV snapshot. (required) - :param str zap_trace_span: OpenTracing span context - :param str content_encoding: The value tells InfluxDB what compression is applied to the line protocol in the request payload. To make an API request with a GZIP payload, send `Content-Encoding: gzip` as a request header. - :param str content_type: - :return: PostRestoreKVResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_restore_kv_with_http_info(body, **kwargs) # noqa: E501 - else: - (data) = self.post_restore_kv_with_http_info(body, **kwargs) # noqa: E501 - return data - - def post_restore_kv_with_http_info(self, body, **kwargs): # noqa: E501,D401,D403 - """Overwrite the embedded KV store on the server with a backed-up snapshot.. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_restore_kv_with_http_info(body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param file body: Full KV snapshot. (required) - :param str zap_trace_span: OpenTracing span context - :param str content_encoding: The value tells InfluxDB what compression is applied to the line protocol in the request payload. To make an API request with a GZIP payload, send `Content-Encoding: gzip` as a request header. - :param str content_type: - :return: PostRestoreKVResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_restore_kv_prepare(body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/restore/kv', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='PostRestoreKVResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_restore_kv_async(self, body, **kwargs): # noqa: E501,D401,D403 - """Overwrite the embedded KV store on the server with a backed-up snapshot.. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param file body: Full KV snapshot. (required) - :param str zap_trace_span: OpenTracing span context - :param str content_encoding: The value tells InfluxDB what compression is applied to the line protocol in the request payload. To make an API request with a GZIP payload, send `Content-Encoding: gzip` as a request header. - :param str content_type: - :return: PostRestoreKVResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_restore_kv_prepare(body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/restore/kv', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='PostRestoreKVResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_restore_kv_prepare(self, body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['body', 'zap_trace_span', 'content_encoding', 'content_type'] # noqa: E501 - self._check_operation_params('post_restore_kv', all_params, local_var_params) - # verify the required parameter 'body' is set - if ('body' not in local_var_params or - local_var_params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `post_restore_kv`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'content_encoding' in local_var_params: - header_params['Content-Encoding'] = local_var_params['content_encoding'] # noqa: E501 - if 'content_type' in local_var_params: - header_params['Content-Type'] = local_var_params['content_type'] # noqa: E501 - - body_params = None - if 'body' in local_var_params: - body_params = local_var_params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['text/plain']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_restore_shard_id(self, shard_id, body, **kwargs): # noqa: E501,D401,D403 - """Restore a TSM snapshot into a shard.. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_restore_shard_id(shard_id, body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str shard_id: The shard ID. (required) - :param file body: TSM snapshot. (required) - :param str zap_trace_span: OpenTracing span context - :param str content_encoding: The value tells InfluxDB what compression is applied to the line protocol in the request payload. To make an API request with a GZIP payload, send `Content-Encoding: gzip` as a request header. - :param str content_type: - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_restore_shard_id_with_http_info(shard_id, body, **kwargs) # noqa: E501 - else: - (data) = self.post_restore_shard_id_with_http_info(shard_id, body, **kwargs) # noqa: E501 - return data - - def post_restore_shard_id_with_http_info(self, shard_id, body, **kwargs): # noqa: E501,D401,D403 - """Restore a TSM snapshot into a shard.. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_restore_shard_id_with_http_info(shard_id, body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str shard_id: The shard ID. (required) - :param file body: TSM snapshot. (required) - :param str zap_trace_span: OpenTracing span context - :param str content_encoding: The value tells InfluxDB what compression is applied to the line protocol in the request payload. To make an API request with a GZIP payload, send `Content-Encoding: gzip` as a request header. - :param str content_type: - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_restore_shard_id_prepare(shard_id, body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/restore/shards/{shardID}', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_restore_shard_id_async(self, shard_id, body, **kwargs): # noqa: E501,D401,D403 - """Restore a TSM snapshot into a shard.. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str shard_id: The shard ID. (required) - :param file body: TSM snapshot. (required) - :param str zap_trace_span: OpenTracing span context - :param str content_encoding: The value tells InfluxDB what compression is applied to the line protocol in the request payload. To make an API request with a GZIP payload, send `Content-Encoding: gzip` as a request header. - :param str content_type: - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_restore_shard_id_prepare(shard_id, body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/restore/shards/{shardID}', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_restore_shard_id_prepare(self, shard_id, body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['shard_id', 'body', 'zap_trace_span', 'content_encoding', 'content_type'] # noqa: E501 - self._check_operation_params('post_restore_shard_id', all_params, local_var_params) - # verify the required parameter 'shard_id' is set - if ('shard_id' not in local_var_params or - local_var_params['shard_id'] is None): - raise ValueError("Missing the required parameter `shard_id` when calling `post_restore_shard_id`") # noqa: E501 - # verify the required parameter 'body' is set - if ('body' not in local_var_params or - local_var_params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `post_restore_shard_id`") # noqa: E501 - - path_params = {} - if 'shard_id' in local_var_params: - path_params['shardID'] = local_var_params['shard_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'content_encoding' in local_var_params: - header_params['Content-Encoding'] = local_var_params['content_encoding'] # noqa: E501 - if 'content_type' in local_var_params: - header_params['Content-Type'] = local_var_params['content_type'] # noqa: E501 - - body_params = None - if 'body' in local_var_params: - body_params = local_var_params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['text/plain']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_restore_sql(self, body, **kwargs): # noqa: E501,D401,D403 - """Overwrite the embedded SQL store on the server with a backed-up snapshot.. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_restore_sql(body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param file body: Full SQL snapshot. (required) - :param str zap_trace_span: OpenTracing span context - :param str content_encoding: The value tells InfluxDB what compression is applied to the line protocol in the request payload. To make an API request with a GZIP payload, send `Content-Encoding: gzip` as a request header. - :param str content_type: - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_restore_sql_with_http_info(body, **kwargs) # noqa: E501 - else: - (data) = self.post_restore_sql_with_http_info(body, **kwargs) # noqa: E501 - return data - - def post_restore_sql_with_http_info(self, body, **kwargs): # noqa: E501,D401,D403 - """Overwrite the embedded SQL store on the server with a backed-up snapshot.. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_restore_sql_with_http_info(body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param file body: Full SQL snapshot. (required) - :param str zap_trace_span: OpenTracing span context - :param str content_encoding: The value tells InfluxDB what compression is applied to the line protocol in the request payload. To make an API request with a GZIP payload, send `Content-Encoding: gzip` as a request header. - :param str content_type: - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_restore_sql_prepare(body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/restore/sql', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_restore_sql_async(self, body, **kwargs): # noqa: E501,D401,D403 - """Overwrite the embedded SQL store on the server with a backed-up snapshot.. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param file body: Full SQL snapshot. (required) - :param str zap_trace_span: OpenTracing span context - :param str content_encoding: The value tells InfluxDB what compression is applied to the line protocol in the request payload. To make an API request with a GZIP payload, send `Content-Encoding: gzip` as a request header. - :param str content_type: - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_restore_sql_prepare(body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/restore/sql', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_restore_sql_prepare(self, body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['body', 'zap_trace_span', 'content_encoding', 'content_type'] # noqa: E501 - self._check_operation_params('post_restore_sql', all_params, local_var_params) - # verify the required parameter 'body' is set - if ('body' not in local_var_params or - local_var_params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `post_restore_sql`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'content_encoding' in local_var_params: - header_params['Content-Encoding'] = local_var_params['content_encoding'] # noqa: E501 - if 'content_type' in local_var_params: - header_params['Content-Type'] = local_var_params['content_type'] # noqa: E501 - - body_params = None - if 'body' in local_var_params: - body_params = local_var_params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['text/plain']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/routes_service.py b/frogpilot/third_party/influxdb_client/service/routes_service.py deleted file mode 100644 index 8b79c4f67..000000000 --- a/frogpilot/third_party/influxdb_client/service/routes_service.py +++ /dev/null @@ -1,140 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class RoutesService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """RoutesService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def get_routes(self, **kwargs): # noqa: E501,D401,D403 - """List all top level routes. - - Retrieves all the top level routes for the InfluxDB API. #### Limitations - Only returns top level routes--for example, the response contains `"tasks":"/api/v2/tasks"`, and doesn't contain resource-specific routes for tasks (`/api/v2/tasks/TASK_ID/...`). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_routes(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: Routes - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_routes_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_routes_with_http_info(**kwargs) # noqa: E501 - return data - - def get_routes_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List all top level routes. - - Retrieves all the top level routes for the InfluxDB API. #### Limitations - Only returns top level routes--for example, the response contains `"tasks":"/api/v2/tasks"`, and doesn't contain resource-specific routes for tasks (`/api/v2/tasks/TASK_ID/...`). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_routes_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: Routes - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_routes_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Routes', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_routes_async(self, **kwargs): # noqa: E501,D401,D403 - """List all top level routes. - - Retrieves all the top level routes for the InfluxDB API. #### Limitations - Only returns top level routes--for example, the response contains `"tasks":"/api/v2/tasks"`, and doesn't contain resource-specific routes for tasks (`/api/v2/tasks/TASK_ID/...`). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: Routes - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_routes_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Routes', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_routes_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span'] # noqa: E501 - self._check_operation_params('get_routes', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/rules_service.py b/frogpilot/third_party/influxdb_client/service/rules_service.py deleted file mode 100644 index 38a74f4a6..000000000 --- a/frogpilot/third_party/influxdb_client/service/rules_service.py +++ /dev/null @@ -1,146 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class RulesService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """RulesService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def get_notification_rules_id_query(self, rule_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a notification rule query. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_rules_id_query(rule_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: FluxResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_notification_rules_id_query_with_http_info(rule_id, **kwargs) # noqa: E501 - else: - (data) = self.get_notification_rules_id_query_with_http_info(rule_id, **kwargs) # noqa: E501 - return data - - def get_notification_rules_id_query_with_http_info(self, rule_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a notification rule query. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_notification_rules_id_query_with_http_info(rule_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: FluxResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_rules_id_query_prepare(rule_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}/query', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='FluxResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_notification_rules_id_query_async(self, rule_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a notification rule query. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str rule_id: The notification rule ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: FluxResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_notification_rules_id_query_prepare(rule_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/notificationRules/{ruleID}/query', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='FluxResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_notification_rules_id_query_prepare(self, rule_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['rule_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_notification_rules_id_query', all_params, local_var_params) - # verify the required parameter 'rule_id' is set - if ('rule_id' not in local_var_params or - local_var_params['rule_id'] is None): - raise ValueError("Missing the required parameter `rule_id` when calling `get_notification_rules_id_query`") # noqa: E501 - - path_params = {} - if 'rule_id' in local_var_params: - path_params['ruleID'] = local_var_params['rule_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/scraper_targets_service.py b/frogpilot/third_party/influxdb_client/service/scraper_targets_service.py deleted file mode 100644 index 144a39314..000000000 --- a/frogpilot/third_party/influxdb_client/service/scraper_targets_service.py +++ /dev/null @@ -1,1748 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class ScraperTargetsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """ScraperTargetsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_scrapers_id(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """Delete a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_scrapers_id(scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The identifier of the scraper target. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_scrapers_id_with_http_info(scraper_target_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_scrapers_id_with_http_info(scraper_target_id, **kwargs) # noqa: E501 - return data - - def delete_scrapers_id_with_http_info(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """Delete a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_scrapers_id_with_http_info(scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The identifier of the scraper target. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_scrapers_id_prepare(scraper_target_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_scrapers_id_async(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """Delete a scraper target. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str scraper_target_id: The identifier of the scraper target. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_scrapers_id_prepare(scraper_target_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_scrapers_id_prepare(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['scraper_target_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_scrapers_id', all_params, local_var_params) - # verify the required parameter 'scraper_target_id' is set - if ('scraper_target_id' not in local_var_params or - local_var_params['scraper_target_id'] is None): - raise ValueError("Missing the required parameter `scraper_target_id` when calling `delete_scrapers_id`") # noqa: E501 - - path_params = {} - if 'scraper_target_id' in local_var_params: - path_params['scraperTargetID'] = local_var_params['scraper_target_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_scrapers_id_labels_id(self, scraper_target_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_scrapers_id_labels_id(scraper_target_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param str label_id: The label ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_scrapers_id_labels_id_with_http_info(scraper_target_id, label_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_scrapers_id_labels_id_with_http_info(scraper_target_id, label_id, **kwargs) # noqa: E501 - return data - - def delete_scrapers_id_labels_id_with_http_info(self, scraper_target_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_scrapers_id_labels_id_with_http_info(scraper_target_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param str label_id: The label ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_scrapers_id_labels_id_prepare(scraper_target_id, label_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_scrapers_id_labels_id_async(self, scraper_target_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a scraper target. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param str label_id: The label ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_scrapers_id_labels_id_prepare(scraper_target_id, label_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_scrapers_id_labels_id_prepare(self, scraper_target_id, label_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['scraper_target_id', 'label_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_scrapers_id_labels_id', all_params, local_var_params) - # verify the required parameter 'scraper_target_id' is set - if ('scraper_target_id' not in local_var_params or - local_var_params['scraper_target_id'] is None): - raise ValueError("Missing the required parameter `scraper_target_id` when calling `delete_scrapers_id_labels_id`") # noqa: E501 - # verify the required parameter 'label_id' is set - if ('label_id' not in local_var_params or - local_var_params['label_id'] is None): - raise ValueError("Missing the required parameter `label_id` when calling `delete_scrapers_id_labels_id`") # noqa: E501 - - path_params = {} - if 'scraper_target_id' in local_var_params: - path_params['scraperTargetID'] = local_var_params['scraper_target_id'] # noqa: E501 - if 'label_id' in local_var_params: - path_params['labelID'] = local_var_params['label_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_scrapers_id_members_id(self, user_id, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_scrapers_id_members_id(user_id, scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of member to remove. (required) - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_scrapers_id_members_id_with_http_info(user_id, scraper_target_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_scrapers_id_members_id_with_http_info(user_id, scraper_target_id, **kwargs) # noqa: E501 - return data - - def delete_scrapers_id_members_id_with_http_info(self, user_id, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_scrapers_id_members_id_with_http_info(user_id, scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of member to remove. (required) - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_scrapers_id_members_id_prepare(user_id, scraper_target_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/members/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_scrapers_id_members_id_async(self, user_id, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a scraper target. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of member to remove. (required) - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_scrapers_id_members_id_prepare(user_id, scraper_target_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/members/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_scrapers_id_members_id_prepare(self, user_id, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'scraper_target_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_scrapers_id_members_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `delete_scrapers_id_members_id`") # noqa: E501 - # verify the required parameter 'scraper_target_id' is set - if ('scraper_target_id' not in local_var_params or - local_var_params['scraper_target_id'] is None): - raise ValueError("Missing the required parameter `scraper_target_id` when calling `delete_scrapers_id_members_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - if 'scraper_target_id' in local_var_params: - path_params['scraperTargetID'] = local_var_params['scraper_target_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_scrapers_id_owners_id(self, user_id, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_scrapers_id_owners_id(user_id, scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of owner to remove. (required) - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_scrapers_id_owners_id_with_http_info(user_id, scraper_target_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_scrapers_id_owners_id_with_http_info(user_id, scraper_target_id, **kwargs) # noqa: E501 - return data - - def delete_scrapers_id_owners_id_with_http_info(self, user_id, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_scrapers_id_owners_id_with_http_info(user_id, scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of owner to remove. (required) - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_scrapers_id_owners_id_prepare(user_id, scraper_target_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/owners/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_scrapers_id_owners_id_async(self, user_id, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a scraper target. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of owner to remove. (required) - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_scrapers_id_owners_id_prepare(user_id, scraper_target_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/owners/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_scrapers_id_owners_id_prepare(self, user_id, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'scraper_target_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_scrapers_id_owners_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `delete_scrapers_id_owners_id`") # noqa: E501 - # verify the required parameter 'scraper_target_id' is set - if ('scraper_target_id' not in local_var_params or - local_var_params['scraper_target_id'] is None): - raise ValueError("Missing the required parameter `scraper_target_id` when calling `delete_scrapers_id_owners_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - if 'scraper_target_id' in local_var_params: - path_params['scraperTargetID'] = local_var_params['scraper_target_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_scrapers(self, **kwargs): # noqa: E501,D401,D403 - """List all scraper targets. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scrapers(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str name: Specifies the name of the scraper target. - :param list[str] id: List of scraper target IDs to return. If both `id` and `owner` are specified, only `id` is used. - :param str org_id: Specifies the organization ID of the scraper target. - :param str org: Specifies the organization name of the scraper target. - :return: ScraperTargetResponses - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_scrapers_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_scrapers_with_http_info(**kwargs) # noqa: E501 - return data - - def get_scrapers_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List all scraper targets. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scrapers_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str name: Specifies the name of the scraper target. - :param list[str] id: List of scraper target IDs to return. If both `id` and `owner` are specified, only `id` is used. - :param str org_id: Specifies the organization ID of the scraper target. - :param str org: Specifies the organization name of the scraper target. - :return: ScraperTargetResponses - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scrapers_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ScraperTargetResponses', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_scrapers_async(self, **kwargs): # noqa: E501,D401,D403 - """List all scraper targets. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str name: Specifies the name of the scraper target. - :param list[str] id: List of scraper target IDs to return. If both `id` and `owner` are specified, only `id` is used. - :param str org_id: Specifies the organization ID of the scraper target. - :param str org: Specifies the organization name of the scraper target. - :return: ScraperTargetResponses - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scrapers_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ScraperTargetResponses', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_scrapers_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'name', 'id', 'org_id', 'org'] # noqa: E501 - self._check_operation_params('get_scrapers', all_params, local_var_params) - - path_params = {} - - query_params = [] - if 'name' in local_var_params: - query_params.append(('name', local_var_params['name'])) # noqa: E501 - if 'id' in local_var_params: - query_params.append(('id', local_var_params['id'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_scrapers_id(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scrapers_id(scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The identifier of the scraper target. (required) - :param str zap_trace_span: OpenTracing span context - :return: ScraperTargetResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_scrapers_id_with_http_info(scraper_target_id, **kwargs) # noqa: E501 - else: - (data) = self.get_scrapers_id_with_http_info(scraper_target_id, **kwargs) # noqa: E501 - return data - - def get_scrapers_id_with_http_info(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scrapers_id_with_http_info(scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The identifier of the scraper target. (required) - :param str zap_trace_span: OpenTracing span context - :return: ScraperTargetResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scrapers_id_prepare(scraper_target_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ScraperTargetResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_scrapers_id_async(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a scraper target. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str scraper_target_id: The identifier of the scraper target. (required) - :param str zap_trace_span: OpenTracing span context - :return: ScraperTargetResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scrapers_id_prepare(scraper_target_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ScraperTargetResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_scrapers_id_prepare(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['scraper_target_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_scrapers_id', all_params, local_var_params) - # verify the required parameter 'scraper_target_id' is set - if ('scraper_target_id' not in local_var_params or - local_var_params['scraper_target_id'] is None): - raise ValueError("Missing the required parameter `scraper_target_id` when calling `get_scrapers_id`") # noqa: E501 - - path_params = {} - if 'scraper_target_id' in local_var_params: - path_params['scraperTargetID'] = local_var_params['scraper_target_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_scrapers_id_labels(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scrapers_id_labels(scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_scrapers_id_labels_with_http_info(scraper_target_id, **kwargs) # noqa: E501 - else: - (data) = self.get_scrapers_id_labels_with_http_info(scraper_target_id, **kwargs) # noqa: E501 - return data - - def get_scrapers_id_labels_with_http_info(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scrapers_id_labels_with_http_info(scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scrapers_id_labels_prepare(scraper_target_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_scrapers_id_labels_async(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a scraper target. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scrapers_id_labels_prepare(scraper_target_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_scrapers_id_labels_prepare(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['scraper_target_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_scrapers_id_labels', all_params, local_var_params) - # verify the required parameter 'scraper_target_id' is set - if ('scraper_target_id' not in local_var_params or - local_var_params['scraper_target_id'] is None): - raise ValueError("Missing the required parameter `scraper_target_id` when calling `get_scrapers_id_labels`") # noqa: E501 - - path_params = {} - if 'scraper_target_id' in local_var_params: - path_params['scraperTargetID'] = local_var_params['scraper_target_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_scrapers_id_members(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """List all users with member privileges for a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scrapers_id_members(scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_scrapers_id_members_with_http_info(scraper_target_id, **kwargs) # noqa: E501 - else: - (data) = self.get_scrapers_id_members_with_http_info(scraper_target_id, **kwargs) # noqa: E501 - return data - - def get_scrapers_id_members_with_http_info(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """List all users with member privileges for a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scrapers_id_members_with_http_info(scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scrapers_id_members_prepare(scraper_target_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/members', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMembers', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_scrapers_id_members_async(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """List all users with member privileges for a scraper target. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scrapers_id_members_prepare(scraper_target_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/members', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMembers', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_scrapers_id_members_prepare(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['scraper_target_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_scrapers_id_members', all_params, local_var_params) - # verify the required parameter 'scraper_target_id' is set - if ('scraper_target_id' not in local_var_params or - local_var_params['scraper_target_id'] is None): - raise ValueError("Missing the required parameter `scraper_target_id` when calling `get_scrapers_id_members`") # noqa: E501 - - path_params = {} - if 'scraper_target_id' in local_var_params: - path_params['scraperTargetID'] = local_var_params['scraper_target_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_scrapers_id_owners(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scrapers_id_owners(scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_scrapers_id_owners_with_http_info(scraper_target_id, **kwargs) # noqa: E501 - else: - (data) = self.get_scrapers_id_owners_with_http_info(scraper_target_id, **kwargs) # noqa: E501 - return data - - def get_scrapers_id_owners_with_http_info(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_scrapers_id_owners_with_http_info(scraper_target_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scrapers_id_owners_prepare(scraper_target_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/owners', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwners', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_scrapers_id_owners_async(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of a scraper target. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_scrapers_id_owners_prepare(scraper_target_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/owners', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwners', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_scrapers_id_owners_prepare(self, scraper_target_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['scraper_target_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_scrapers_id_owners', all_params, local_var_params) - # verify the required parameter 'scraper_target_id' is set - if ('scraper_target_id' not in local_var_params or - local_var_params['scraper_target_id'] is None): - raise ValueError("Missing the required parameter `scraper_target_id` when calling `get_scrapers_id_owners`") # noqa: E501 - - path_params = {} - if 'scraper_target_id' in local_var_params: - path_params['scraperTargetID'] = local_var_params['scraper_target_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_scrapers_id(self, scraper_target_id, scraper_target_request, **kwargs): # noqa: E501,D401,D403 - """Update a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_scrapers_id(scraper_target_id, scraper_target_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The identifier of the scraper target. (required) - :param ScraperTargetRequest scraper_target_request: Scraper target update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: ScraperTargetResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_scrapers_id_with_http_info(scraper_target_id, scraper_target_request, **kwargs) # noqa: E501 - else: - (data) = self.patch_scrapers_id_with_http_info(scraper_target_id, scraper_target_request, **kwargs) # noqa: E501 - return data - - def patch_scrapers_id_with_http_info(self, scraper_target_id, scraper_target_request, **kwargs): # noqa: E501,D401,D403 - """Update a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_scrapers_id_with_http_info(scraper_target_id, scraper_target_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The identifier of the scraper target. (required) - :param ScraperTargetRequest scraper_target_request: Scraper target update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: ScraperTargetResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_scrapers_id_prepare(scraper_target_id, scraper_target_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ScraperTargetResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_scrapers_id_async(self, scraper_target_id, scraper_target_request, **kwargs): # noqa: E501,D401,D403 - """Update a scraper target. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str scraper_target_id: The identifier of the scraper target. (required) - :param ScraperTargetRequest scraper_target_request: Scraper target update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: ScraperTargetResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_scrapers_id_prepare(scraper_target_id, scraper_target_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ScraperTargetResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_scrapers_id_prepare(self, scraper_target_id, scraper_target_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['scraper_target_id', 'scraper_target_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_scrapers_id', all_params, local_var_params) - # verify the required parameter 'scraper_target_id' is set - if ('scraper_target_id' not in local_var_params or - local_var_params['scraper_target_id'] is None): - raise ValueError("Missing the required parameter `scraper_target_id` when calling `patch_scrapers_id`") # noqa: E501 - # verify the required parameter 'scraper_target_request' is set - if ('scraper_target_request' not in local_var_params or - local_var_params['scraper_target_request'] is None): - raise ValueError("Missing the required parameter `scraper_target_request` when calling `patch_scrapers_id`") # noqa: E501 - - path_params = {} - if 'scraper_target_id' in local_var_params: - path_params['scraperTargetID'] = local_var_params['scraper_target_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'scraper_target_request' in local_var_params: - body_params = local_var_params['scraper_target_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_scrapers(self, scraper_target_request, **kwargs): # noqa: E501,D401,D403 - """Create a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_scrapers(scraper_target_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param ScraperTargetRequest scraper_target_request: Scraper target to create (required) - :param str zap_trace_span: OpenTracing span context - :return: ScraperTargetResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_scrapers_with_http_info(scraper_target_request, **kwargs) # noqa: E501 - else: - (data) = self.post_scrapers_with_http_info(scraper_target_request, **kwargs) # noqa: E501 - return data - - def post_scrapers_with_http_info(self, scraper_target_request, **kwargs): # noqa: E501,D401,D403 - """Create a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_scrapers_with_http_info(scraper_target_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param ScraperTargetRequest scraper_target_request: Scraper target to create (required) - :param str zap_trace_span: OpenTracing span context - :return: ScraperTargetResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_scrapers_prepare(scraper_target_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ScraperTargetResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_scrapers_async(self, scraper_target_request, **kwargs): # noqa: E501,D401,D403 - """Create a scraper target. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param ScraperTargetRequest scraper_target_request: Scraper target to create (required) - :param str zap_trace_span: OpenTracing span context - :return: ScraperTargetResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_scrapers_prepare(scraper_target_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ScraperTargetResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_scrapers_prepare(self, scraper_target_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['scraper_target_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_scrapers', all_params, local_var_params) - # verify the required parameter 'scraper_target_request' is set - if ('scraper_target_request' not in local_var_params or - local_var_params['scraper_target_request'] is None): - raise ValueError("Missing the required parameter `scraper_target_request` when calling `post_scrapers`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'scraper_target_request' in local_var_params: - body_params = local_var_params['scraper_target_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_scrapers_id_labels(self, scraper_target_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_scrapers_id_labels(scraper_target_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_scrapers_id_labels_with_http_info(scraper_target_id, label_mapping, **kwargs) # noqa: E501 - else: - (data) = self.post_scrapers_id_labels_with_http_info(scraper_target_id, label_mapping, **kwargs) # noqa: E501 - return data - - def post_scrapers_id_labels_with_http_info(self, scraper_target_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_scrapers_id_labels_with_http_info(scraper_target_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_scrapers_id_labels_prepare(scraper_target_id, label_mapping, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_scrapers_id_labels_async(self, scraper_target_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a scraper target. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_scrapers_id_labels_prepare(scraper_target_id, label_mapping, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_scrapers_id_labels_prepare(self, scraper_target_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['scraper_target_id', 'label_mapping', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_scrapers_id_labels', all_params, local_var_params) - # verify the required parameter 'scraper_target_id' is set - if ('scraper_target_id' not in local_var_params or - local_var_params['scraper_target_id'] is None): - raise ValueError("Missing the required parameter `scraper_target_id` when calling `post_scrapers_id_labels`") # noqa: E501 - # verify the required parameter 'label_mapping' is set - if ('label_mapping' not in local_var_params or - local_var_params['label_mapping'] is None): - raise ValueError("Missing the required parameter `label_mapping` when calling `post_scrapers_id_labels`") # noqa: E501 - - path_params = {} - if 'scraper_target_id' in local_var_params: - path_params['scraperTargetID'] = local_var_params['scraper_target_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'label_mapping' in local_var_params: - body_params = local_var_params['label_mapping'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_scrapers_id_members(self, scraper_target_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_scrapers_id_members(scraper_target_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as member (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_scrapers_id_members_with_http_info(scraper_target_id, add_resource_member_request_body, **kwargs) # noqa: E501 - else: - (data) = self.post_scrapers_id_members_with_http_info(scraper_target_id, add_resource_member_request_body, **kwargs) # noqa: E501 - return data - - def post_scrapers_id_members_with_http_info(self, scraper_target_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_scrapers_id_members_with_http_info(scraper_target_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as member (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_scrapers_id_members_prepare(scraper_target_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/members', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMember', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_scrapers_id_members_async(self, scraper_target_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a scraper target. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as member (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_scrapers_id_members_prepare(scraper_target_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/members', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMember', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_scrapers_id_members_prepare(self, scraper_target_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['scraper_target_id', 'add_resource_member_request_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_scrapers_id_members', all_params, local_var_params) - # verify the required parameter 'scraper_target_id' is set - if ('scraper_target_id' not in local_var_params or - local_var_params['scraper_target_id'] is None): - raise ValueError("Missing the required parameter `scraper_target_id` when calling `post_scrapers_id_members`") # noqa: E501 - # verify the required parameter 'add_resource_member_request_body' is set - if ('add_resource_member_request_body' not in local_var_params or - local_var_params['add_resource_member_request_body'] is None): - raise ValueError("Missing the required parameter `add_resource_member_request_body` when calling `post_scrapers_id_members`") # noqa: E501 - - path_params = {} - if 'scraper_target_id' in local_var_params: - path_params['scraperTargetID'] = local_var_params['scraper_target_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'add_resource_member_request_body' in local_var_params: - body_params = local_var_params['add_resource_member_request_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_scrapers_id_owners(self, scraper_target_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_scrapers_id_owners(scraper_target_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as owner (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_scrapers_id_owners_with_http_info(scraper_target_id, add_resource_member_request_body, **kwargs) # noqa: E501 - else: - (data) = self.post_scrapers_id_owners_with_http_info(scraper_target_id, add_resource_member_request_body, **kwargs) # noqa: E501 - return data - - def post_scrapers_id_owners_with_http_info(self, scraper_target_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to a scraper target. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_scrapers_id_owners_with_http_info(scraper_target_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as owner (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_scrapers_id_owners_prepare(scraper_target_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/owners', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwner', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_scrapers_id_owners_async(self, scraper_target_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to a scraper target. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str scraper_target_id: The scraper target ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as owner (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_scrapers_id_owners_prepare(scraper_target_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/scrapers/{scraperTargetID}/owners', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwner', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_scrapers_id_owners_prepare(self, scraper_target_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['scraper_target_id', 'add_resource_member_request_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_scrapers_id_owners', all_params, local_var_params) - # verify the required parameter 'scraper_target_id' is set - if ('scraper_target_id' not in local_var_params or - local_var_params['scraper_target_id'] is None): - raise ValueError("Missing the required parameter `scraper_target_id` when calling `post_scrapers_id_owners`") # noqa: E501 - # verify the required parameter 'add_resource_member_request_body' is set - if ('add_resource_member_request_body' not in local_var_params or - local_var_params['add_resource_member_request_body'] is None): - raise ValueError("Missing the required parameter `add_resource_member_request_body` when calling `post_scrapers_id_owners`") # noqa: E501 - - path_params = {} - if 'scraper_target_id' in local_var_params: - path_params['scraperTargetID'] = local_var_params['scraper_target_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'add_resource_member_request_body' in local_var_params: - body_params = local_var_params['add_resource_member_request_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/secrets_service.py b/frogpilot/third_party/influxdb_client/service/secrets_service.py deleted file mode 100644 index 495ac9520..000000000 --- a/frogpilot/third_party/influxdb_client/service/secrets_service.py +++ /dev/null @@ -1,529 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class SecretsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """SecretsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_orgs_id_secrets_id(self, org_id, secret_id, **kwargs): # noqa: E501,D401,D403 - """Delete a secret from an organization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_orgs_id_secrets_id(org_id, secret_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The organization ID. (required) - :param str secret_id: The secret ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_orgs_id_secrets_id_with_http_info(org_id, secret_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_orgs_id_secrets_id_with_http_info(org_id, secret_id, **kwargs) # noqa: E501 - return data - - def delete_orgs_id_secrets_id_with_http_info(self, org_id, secret_id, **kwargs): # noqa: E501,D401,D403 - """Delete a secret from an organization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_orgs_id_secrets_id_with_http_info(org_id, secret_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The organization ID. (required) - :param str secret_id: The secret ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_orgs_id_secrets_id_prepare(org_id, secret_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs/{orgID}/secrets/{secretID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_orgs_id_secrets_id_async(self, org_id, secret_id, **kwargs): # noqa: E501,D401,D403 - """Delete a secret from an organization. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: The organization ID. (required) - :param str secret_id: The secret ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_orgs_id_secrets_id_prepare(org_id, secret_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs/{orgID}/secrets/{secretID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_orgs_id_secrets_id_prepare(self, org_id, secret_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'secret_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_orgs_id_secrets_id', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `delete_orgs_id_secrets_id`") # noqa: E501 - # verify the required parameter 'secret_id' is set - if ('secret_id' not in local_var_params or - local_var_params['secret_id'] is None): - raise ValueError("Missing the required parameter `secret_id` when calling `delete_orgs_id_secrets_id`") # noqa: E501 - - path_params = {} - if 'org_id' in local_var_params: - path_params['orgID'] = local_var_params['org_id'] # noqa: E501 - if 'secret_id' in local_var_params: - path_params['secretID'] = local_var_params['secret_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_orgs_id_secrets(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all secret keys for an organization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_orgs_id_secrets(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: SecretKeysResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_orgs_id_secrets_with_http_info(org_id, **kwargs) # noqa: E501 - else: - (data) = self.get_orgs_id_secrets_with_http_info(org_id, **kwargs) # noqa: E501 - return data - - def get_orgs_id_secrets_with_http_info(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all secret keys for an organization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_orgs_id_secrets_with_http_info(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: SecretKeysResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_orgs_id_secrets_prepare(org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs/{orgID}/secrets', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='SecretKeysResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_orgs_id_secrets_async(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List all secret keys for an organization. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: The organization ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: SecretKeysResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_orgs_id_secrets_prepare(org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs/{orgID}/secrets', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='SecretKeysResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_orgs_id_secrets_prepare(self, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_orgs_id_secrets', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `get_orgs_id_secrets`") # noqa: E501 - - path_params = {} - if 'org_id' in local_var_params: - path_params['orgID'] = local_var_params['org_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_orgs_id_secrets(self, org_id, request_body, **kwargs): # noqa: E501,D401,D403 - """Update secrets in an organization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_orgs_id_secrets(org_id, request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The organization ID. (required) - :param dict(str, str) request_body: Secret key value pairs to update/add (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_orgs_id_secrets_with_http_info(org_id, request_body, **kwargs) # noqa: E501 - else: - (data) = self.patch_orgs_id_secrets_with_http_info(org_id, request_body, **kwargs) # noqa: E501 - return data - - def patch_orgs_id_secrets_with_http_info(self, org_id, request_body, **kwargs): # noqa: E501,D401,D403 - """Update secrets in an organization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_orgs_id_secrets_with_http_info(org_id, request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The organization ID. (required) - :param dict(str, str) request_body: Secret key value pairs to update/add (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_orgs_id_secrets_prepare(org_id, request_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs/{orgID}/secrets', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_orgs_id_secrets_async(self, org_id, request_body, **kwargs): # noqa: E501,D401,D403 - """Update secrets in an organization. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: The organization ID. (required) - :param dict(str, str) request_body: Secret key value pairs to update/add (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_orgs_id_secrets_prepare(org_id, request_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs/{orgID}/secrets', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_orgs_id_secrets_prepare(self, org_id, request_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'request_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_orgs_id_secrets', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `patch_orgs_id_secrets`") # noqa: E501 - # verify the required parameter 'request_body' is set - if ('request_body' not in local_var_params or - local_var_params['request_body'] is None): - raise ValueError("Missing the required parameter `request_body` when calling `patch_orgs_id_secrets`") # noqa: E501 - - path_params = {} - if 'org_id' in local_var_params: - path_params['orgID'] = local_var_params['org_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'request_body' in local_var_params: - body_params = local_var_params['request_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_orgs_id_secrets(self, org_id, secret_keys, **kwargs): # noqa: E501,D401,D403 - """Delete secrets from an organization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_orgs_id_secrets(org_id, secret_keys, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The organization ID. (required) - :param SecretKeys secret_keys: Secret key to delete (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_orgs_id_secrets_with_http_info(org_id, secret_keys, **kwargs) # noqa: E501 - else: - (data) = self.post_orgs_id_secrets_with_http_info(org_id, secret_keys, **kwargs) # noqa: E501 - return data - - def post_orgs_id_secrets_with_http_info(self, org_id, secret_keys, **kwargs): # noqa: E501,D401,D403 - """Delete secrets from an organization. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_orgs_id_secrets_with_http_info(org_id, secret_keys, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: The organization ID. (required) - :param SecretKeys secret_keys: Secret key to delete (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_orgs_id_secrets_prepare(org_id, secret_keys, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/orgs/{orgID}/secrets/delete', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_orgs_id_secrets_async(self, org_id, secret_keys, **kwargs): # noqa: E501,D401,D403 - """Delete secrets from an organization. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: The organization ID. (required) - :param SecretKeys secret_keys: Secret key to delete (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_orgs_id_secrets_prepare(org_id, secret_keys, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/orgs/{orgID}/secrets/delete', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_orgs_id_secrets_prepare(self, org_id, secret_keys, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'secret_keys', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_orgs_id_secrets', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `post_orgs_id_secrets`") # noqa: E501 - # verify the required parameter 'secret_keys' is set - if ('secret_keys' not in local_var_params or - local_var_params['secret_keys'] is None): - raise ValueError("Missing the required parameter `secret_keys` when calling `post_orgs_id_secrets`") # noqa: E501 - - path_params = {} - if 'org_id' in local_var_params: - path_params['orgID'] = local_var_params['org_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'secret_keys' in local_var_params: - body_params = local_var_params['secret_keys'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/setup_service.py b/frogpilot/third_party/influxdb_client/service/setup_service.py deleted file mode 100644 index ed12bde0c..000000000 --- a/frogpilot/third_party/influxdb_client/service/setup_service.py +++ /dev/null @@ -1,263 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class SetupService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """SetupService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def get_setup(self, **kwargs): # noqa: E501,D401,D403 - """Check if database has default user, org, bucket. - - Returns `true` if no default user, organization, or bucket has been created. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_setup(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: IsOnboarding - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_setup_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_setup_with_http_info(**kwargs) # noqa: E501 - return data - - def get_setup_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Check if database has default user, org, bucket. - - Returns `true` if no default user, organization, or bucket has been created. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_setup_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: IsOnboarding - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_setup_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/setup', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='IsOnboarding', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_setup_async(self, **kwargs): # noqa: E501,D401,D403 - """Check if database has default user, org, bucket. - - Returns `true` if no default user, organization, or bucket has been created. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: IsOnboarding - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_setup_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/setup', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='IsOnboarding', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_setup_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span'] # noqa: E501 - self._check_operation_params('get_setup', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_setup(self, onboarding_request, **kwargs): # noqa: E501,D401,D403 - """Set up initial user, org and bucket. - - Post an onboarding request to set up initial user, org and bucket. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_setup(onboarding_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param OnboardingRequest onboarding_request: Source to create (required) - :param str zap_trace_span: OpenTracing span context - :return: OnboardingResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_setup_with_http_info(onboarding_request, **kwargs) # noqa: E501 - else: - (data) = self.post_setup_with_http_info(onboarding_request, **kwargs) # noqa: E501 - return data - - def post_setup_with_http_info(self, onboarding_request, **kwargs): # noqa: E501,D401,D403 - """Set up initial user, org and bucket. - - Post an onboarding request to set up initial user, org and bucket. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_setup_with_http_info(onboarding_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param OnboardingRequest onboarding_request: Source to create (required) - :param str zap_trace_span: OpenTracing span context - :return: OnboardingResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_setup_prepare(onboarding_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/setup', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='OnboardingResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_setup_async(self, onboarding_request, **kwargs): # noqa: E501,D401,D403 - """Set up initial user, org and bucket. - - Post an onboarding request to set up initial user, org and bucket. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param OnboardingRequest onboarding_request: Source to create (required) - :param str zap_trace_span: OpenTracing span context - :return: OnboardingResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_setup_prepare(onboarding_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/setup', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='OnboardingResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_setup_prepare(self, onboarding_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['onboarding_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_setup', all_params, local_var_params) - # verify the required parameter 'onboarding_request' is set - if ('onboarding_request' not in local_var_params or - local_var_params['onboarding_request'] is None): - raise ValueError("Missing the required parameter `onboarding_request` when calling `post_setup`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'onboarding_request' in local_var_params: - body_params = local_var_params['onboarding_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/signin_service.py b/frogpilot/third_party/influxdb_client/service/signin_service.py deleted file mode 100644 index f3ca698a5..000000000 --- a/frogpilot/third_party/influxdb_client/service/signin_service.py +++ /dev/null @@ -1,145 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class SigninService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """SigninService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def post_signin(self, **kwargs): # noqa: E501,D401,D403 - """Create a user session.. - - Authenticates [Basic authentication credentials](#section/Authentication/BasicAuthentication) for a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user), and then, if successful, generates a user session. To authenticate a user, pass the HTTP `Authorization` header with the `Basic` scheme and the base64-encoded username and password. For syntax and more information, see [Basic Authentication](#section/Authentication/BasicAuthentication) for syntax and more information. If authentication is successful, InfluxDB creates a new session for the user and then returns the session cookie in the `Set-Cookie` response header. InfluxDB stores user sessions in memory only. They expire within ten minutes and during restarts of the InfluxDB instance. #### User sessions with authorizations - In InfluxDB Cloud, a user session inherits all the user's permissions for the organization. - In InfluxDB OSS, a user session inherits all the user's permissions for all the organizations that the user belongs to. #### Related endpoints - [Signout](#tag/Signout) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_signin(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str authorization: An auth credential for the Basic scheme - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_signin_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.post_signin_with_http_info(**kwargs) # noqa: E501 - return data - - def post_signin_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Create a user session.. - - Authenticates [Basic authentication credentials](#section/Authentication/BasicAuthentication) for a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user), and then, if successful, generates a user session. To authenticate a user, pass the HTTP `Authorization` header with the `Basic` scheme and the base64-encoded username and password. For syntax and more information, see [Basic Authentication](#section/Authentication/BasicAuthentication) for syntax and more information. If authentication is successful, InfluxDB creates a new session for the user and then returns the session cookie in the `Set-Cookie` response header. InfluxDB stores user sessions in memory only. They expire within ten minutes and during restarts of the InfluxDB instance. #### User sessions with authorizations - In InfluxDB Cloud, a user session inherits all the user's permissions for the organization. - In InfluxDB OSS, a user session inherits all the user's permissions for all the organizations that the user belongs to. #### Related endpoints - [Signout](#tag/Signout) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_signin_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str authorization: An auth credential for the Basic scheme - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_signin_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/signin', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=['BasicAuthentication'], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_signin_async(self, **kwargs): # noqa: E501,D401,D403 - """Create a user session.. - - Authenticates [Basic authentication credentials](#section/Authentication/BasicAuthentication) for a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user), and then, if successful, generates a user session. To authenticate a user, pass the HTTP `Authorization` header with the `Basic` scheme and the base64-encoded username and password. For syntax and more information, see [Basic Authentication](#section/Authentication/BasicAuthentication) for syntax and more information. If authentication is successful, InfluxDB creates a new session for the user and then returns the session cookie in the `Set-Cookie` response header. InfluxDB stores user sessions in memory only. They expire within ten minutes and during restarts of the InfluxDB instance. #### User sessions with authorizations - In InfluxDB Cloud, a user session inherits all the user's permissions for the organization. - In InfluxDB OSS, a user session inherits all the user's permissions for all the organizations that the user belongs to. #### Related endpoints - [Signout](#tag/Signout) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str authorization: An auth credential for the Basic scheme - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_signin_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/signin', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=['BasicAuthentication'], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_signin_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'authorization'] # noqa: E501 - self._check_operation_params('post_signin', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'authorization' in local_var_params: - header_params['Authorization'] = local_var_params['authorization'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/signout_service.py b/frogpilot/third_party/influxdb_client/service/signout_service.py deleted file mode 100644 index 882e78732..000000000 --- a/frogpilot/third_party/influxdb_client/service/signout_service.py +++ /dev/null @@ -1,140 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class SignoutService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """SignoutService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def post_signout(self, **kwargs): # noqa: E501,D401,D403 - """Expire a user session. - - Expires a user session specified by a session cookie. Use this endpoint to expire a user session that was generated when the user authenticated with the InfluxDB Developer Console (UI) or the `POST /api/v2/signin` endpoint. For example, the `POST /api/v2/signout` endpoint represents the third step in the following three-step process to authenticate a user, retrieve the `user` resource, and then expire the session: 1. Send a request with the user's [Basic authentication credentials](#section/Authentication/BasicAuthentication) to the `POST /api/v2/signin` endpoint to create a user session and generate a session cookie. 2. Send a request to the `GET /api/v2/me` endpoint, passing the stored session cookie from step 1 to retrieve user information. 3. Send a request to the `POST /api/v2/signout` endpoint, passing the stored session cookie to expire the session. _See the complete example in request samples._ InfluxDB stores user sessions in memory only. If a user doesn't sign out, then the user session automatically expires within ten minutes or during a restart of the InfluxDB instance. To learn more about cookies in HTTP requests, see [Mozilla Developer Network (MDN) Web Docs, HTTP cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies). #### Related endpoints - [Signin](#tag/Signin) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_signout(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_signout_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.post_signout_with_http_info(**kwargs) # noqa: E501 - return data - - def post_signout_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Expire a user session. - - Expires a user session specified by a session cookie. Use this endpoint to expire a user session that was generated when the user authenticated with the InfluxDB Developer Console (UI) or the `POST /api/v2/signin` endpoint. For example, the `POST /api/v2/signout` endpoint represents the third step in the following three-step process to authenticate a user, retrieve the `user` resource, and then expire the session: 1. Send a request with the user's [Basic authentication credentials](#section/Authentication/BasicAuthentication) to the `POST /api/v2/signin` endpoint to create a user session and generate a session cookie. 2. Send a request to the `GET /api/v2/me` endpoint, passing the stored session cookie from step 1 to retrieve user information. 3. Send a request to the `POST /api/v2/signout` endpoint, passing the stored session cookie to expire the session. _See the complete example in request samples._ InfluxDB stores user sessions in memory only. If a user doesn't sign out, then the user session automatically expires within ten minutes or during a restart of the InfluxDB instance. To learn more about cookies in HTTP requests, see [Mozilla Developer Network (MDN) Web Docs, HTTP cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies). #### Related endpoints - [Signin](#tag/Signin) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_signout_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_signout_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/signout', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_signout_async(self, **kwargs): # noqa: E501,D401,D403 - """Expire a user session. - - Expires a user session specified by a session cookie. Use this endpoint to expire a user session that was generated when the user authenticated with the InfluxDB Developer Console (UI) or the `POST /api/v2/signin` endpoint. For example, the `POST /api/v2/signout` endpoint represents the third step in the following three-step process to authenticate a user, retrieve the `user` resource, and then expire the session: 1. Send a request with the user's [Basic authentication credentials](#section/Authentication/BasicAuthentication) to the `POST /api/v2/signin` endpoint to create a user session and generate a session cookie. 2. Send a request to the `GET /api/v2/me` endpoint, passing the stored session cookie from step 1 to retrieve user information. 3. Send a request to the `POST /api/v2/signout` endpoint, passing the stored session cookie to expire the session. _See the complete example in request samples._ InfluxDB stores user sessions in memory only. If a user doesn't sign out, then the user session automatically expires within ten minutes or during a restart of the InfluxDB instance. To learn more about cookies in HTTP requests, see [Mozilla Developer Network (MDN) Web Docs, HTTP cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies). #### Related endpoints - [Signin](#tag/Signin) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_signout_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/signout', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_signout_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span'] # noqa: E501 - self._check_operation_params('post_signout', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/sources_service.py b/frogpilot/third_party/influxdb_client/service/sources_service.py deleted file mode 100644 index 5bb381f15..000000000 --- a/frogpilot/third_party/influxdb_client/service/sources_service.py +++ /dev/null @@ -1,860 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class SourcesService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """SourcesService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_sources_id(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Delete a source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_sources_id(source_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_sources_id_with_http_info(source_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_sources_id_with_http_info(source_id, **kwargs) # noqa: E501 - return data - - def delete_sources_id_with_http_info(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Delete a source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_sources_id_with_http_info(source_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_sources_id_prepare(source_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/sources/{sourceID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_sources_id_async(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Delete a source. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_sources_id_prepare(source_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/sources/{sourceID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_sources_id_prepare(self, source_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['source_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_sources_id', all_params, local_var_params) - # verify the required parameter 'source_id' is set - if ('source_id' not in local_var_params or - local_var_params['source_id'] is None): - raise ValueError("Missing the required parameter `source_id` when calling `delete_sources_id`") # noqa: E501 - - path_params = {} - if 'source_id' in local_var_params: - path_params['sourceID'] = local_var_params['source_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_sources(self, **kwargs): # noqa: E501,D401,D403 - """List all sources. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_sources(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org: The name of the organization. - :return: Sources - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_sources_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_sources_with_http_info(**kwargs) # noqa: E501 - return data - - def get_sources_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List all sources. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_sources_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org: The name of the organization. - :return: Sources - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_sources_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/sources', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Sources', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_sources_async(self, **kwargs): # noqa: E501,D401,D403 - """List all sources. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org: The name of the organization. - :return: Sources - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_sources_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/sources', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Sources', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_sources_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'org'] # noqa: E501 - self._check_operation_params('get_sources', all_params, local_var_params) - - path_params = {} - - query_params = [] - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_sources_id(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_sources_id(source_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: Source - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_sources_id_with_http_info(source_id, **kwargs) # noqa: E501 - else: - (data) = self.get_sources_id_with_http_info(source_id, **kwargs) # noqa: E501 - return data - - def get_sources_id_with_http_info(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_sources_id_with_http_info(source_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: Source - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_sources_id_prepare(source_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/sources/{sourceID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Source', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_sources_id_async(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a source. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: Source - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_sources_id_prepare(source_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/sources/{sourceID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Source', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_sources_id_prepare(self, source_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['source_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_sources_id', all_params, local_var_params) - # verify the required parameter 'source_id' is set - if ('source_id' not in local_var_params or - local_var_params['source_id'] is None): - raise ValueError("Missing the required parameter `source_id` when calling `get_sources_id`") # noqa: E501 - - path_params = {} - if 'source_id' in local_var_params: - path_params['sourceID'] = local_var_params['source_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_sources_id_buckets(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Get buckets in a source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_sources_id_buckets(source_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str org: The name of the organization. - :return: Buckets - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_sources_id_buckets_with_http_info(source_id, **kwargs) # noqa: E501 - else: - (data) = self.get_sources_id_buckets_with_http_info(source_id, **kwargs) # noqa: E501 - return data - - def get_sources_id_buckets_with_http_info(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Get buckets in a source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_sources_id_buckets_with_http_info(source_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str org: The name of the organization. - :return: Buckets - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_sources_id_buckets_prepare(source_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/sources/{sourceID}/buckets', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Buckets', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_sources_id_buckets_async(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Get buckets in a source. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str org: The name of the organization. - :return: Buckets - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_sources_id_buckets_prepare(source_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/sources/{sourceID}/buckets', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Buckets', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_sources_id_buckets_prepare(self, source_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['source_id', 'zap_trace_span', 'org'] # noqa: E501 - self._check_operation_params('get_sources_id_buckets', all_params, local_var_params) - # verify the required parameter 'source_id' is set - if ('source_id' not in local_var_params or - local_var_params['source_id'] is None): - raise ValueError("Missing the required parameter `source_id` when calling `get_sources_id_buckets`") # noqa: E501 - - path_params = {} - if 'source_id' in local_var_params: - path_params['sourceID'] = local_var_params['source_id'] # noqa: E501 - - query_params = [] - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_sources_id_health(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Get the health of a source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_sources_id_health(source_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: HealthCheck - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_sources_id_health_with_http_info(source_id, **kwargs) # noqa: E501 - else: - (data) = self.get_sources_id_health_with_http_info(source_id, **kwargs) # noqa: E501 - return data - - def get_sources_id_health_with_http_info(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Get the health of a source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_sources_id_health_with_http_info(source_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: HealthCheck - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_sources_id_health_prepare(source_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/sources/{sourceID}/health', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='HealthCheck', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_sources_id_health_async(self, source_id, **kwargs): # noqa: E501,D401,D403 - """Get the health of a source. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str source_id: The source ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: HealthCheck - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_sources_id_health_prepare(source_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/sources/{sourceID}/health', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='HealthCheck', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_sources_id_health_prepare(self, source_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['source_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_sources_id_health', all_params, local_var_params) - # verify the required parameter 'source_id' is set - if ('source_id' not in local_var_params or - local_var_params['source_id'] is None): - raise ValueError("Missing the required parameter `source_id` when calling `get_sources_id_health`") # noqa: E501 - - path_params = {} - if 'source_id' in local_var_params: - path_params['sourceID'] = local_var_params['source_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_sources_id(self, source_id, source, **kwargs): # noqa: E501,D401,D403 - """Update a Source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_sources_id(source_id, source, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str source_id: The source ID. (required) - :param Source source: Source update (required) - :param str zap_trace_span: OpenTracing span context - :return: Source - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_sources_id_with_http_info(source_id, source, **kwargs) # noqa: E501 - else: - (data) = self.patch_sources_id_with_http_info(source_id, source, **kwargs) # noqa: E501 - return data - - def patch_sources_id_with_http_info(self, source_id, source, **kwargs): # noqa: E501,D401,D403 - """Update a Source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_sources_id_with_http_info(source_id, source, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str source_id: The source ID. (required) - :param Source source: Source update (required) - :param str zap_trace_span: OpenTracing span context - :return: Source - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_sources_id_prepare(source_id, source, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/sources/{sourceID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Source', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_sources_id_async(self, source_id, source, **kwargs): # noqa: E501,D401,D403 - """Update a Source. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str source_id: The source ID. (required) - :param Source source: Source update (required) - :param str zap_trace_span: OpenTracing span context - :return: Source - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_sources_id_prepare(source_id, source, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/sources/{sourceID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Source', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_sources_id_prepare(self, source_id, source, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['source_id', 'source', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_sources_id', all_params, local_var_params) - # verify the required parameter 'source_id' is set - if ('source_id' not in local_var_params or - local_var_params['source_id'] is None): - raise ValueError("Missing the required parameter `source_id` when calling `patch_sources_id`") # noqa: E501 - # verify the required parameter 'source' is set - if ('source' not in local_var_params or - local_var_params['source'] is None): - raise ValueError("Missing the required parameter `source` when calling `patch_sources_id`") # noqa: E501 - - path_params = {} - if 'source_id' in local_var_params: - path_params['sourceID'] = local_var_params['source_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'source' in local_var_params: - body_params = local_var_params['source'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_sources(self, source, **kwargs): # noqa: E501,D401,D403 - """Create a source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_sources(source, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param Source source: Source to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Source - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_sources_with_http_info(source, **kwargs) # noqa: E501 - else: - (data) = self.post_sources_with_http_info(source, **kwargs) # noqa: E501 - return data - - def post_sources_with_http_info(self, source, **kwargs): # noqa: E501,D401,D403 - """Create a source. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_sources_with_http_info(source, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param Source source: Source to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Source - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_sources_prepare(source, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/sources', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Source', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_sources_async(self, source, **kwargs): # noqa: E501,D401,D403 - """Create a source. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param Source source: Source to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Source - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_sources_prepare(source, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/sources', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Source', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_sources_prepare(self, source, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['source', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_sources', all_params, local_var_params) - # verify the required parameter 'source' is set - if ('source' not in local_var_params or - local_var_params['source'] is None): - raise ValueError("Missing the required parameter `source` when calling `post_sources`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'source' in local_var_params: - body_params = local_var_params['source'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/tasks_service.py b/frogpilot/third_party/influxdb_client/service/tasks_service.py deleted file mode 100644 index 914295141..000000000 --- a/frogpilot/third_party/influxdb_client/service/tasks_service.py +++ /dev/null @@ -1,2725 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class TasksService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """TasksService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_tasks_id(self, task_id, **kwargs): # noqa: E501,D401,D403 - """Delete a task. - - Deletes a task and associated records. Use this endpoint to delete a task and all associated records (task runs, logs, and labels). Once the task is deleted, InfluxDB cancels all scheduled runs of the task. If you want to disable a task instead of delete it, [update the task status to `inactive`](#operation/PatchTasksID). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_tasks_id(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_tasks_id_with_http_info(task_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_tasks_id_with_http_info(task_id, **kwargs) # noqa: E501 - return data - - def delete_tasks_id_with_http_info(self, task_id, **kwargs): # noqa: E501,D401,D403 - """Delete a task. - - Deletes a task and associated records. Use this endpoint to delete a task and all associated records (task runs, logs, and labels). Once the task is deleted, InfluxDB cancels all scheduled runs of the task. If you want to disable a task instead of delete it, [update the task status to `inactive`](#operation/PatchTasksID). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_tasks_id_with_http_info(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_tasks_id_prepare(task_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_tasks_id_async(self, task_id, **kwargs): # noqa: E501,D401,D403 - """Delete a task. - - Deletes a task and associated records. Use this endpoint to delete a task and all associated records (task runs, logs, and labels). Once the task is deleted, InfluxDB cancels all scheduled runs of the task. If you want to disable a task instead of delete it, [update the task status to `inactive`](#operation/PatchTasksID). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The ID of the task to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_tasks_id_prepare(task_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_tasks_id_prepare(self, task_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_tasks_id', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `delete_tasks_id`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_tasks_id_labels_id(self, task_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a task. - - Deletes a label from a task. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_tasks_id_labels_id(task_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to delete the label from. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_tasks_id_labels_id_with_http_info(task_id, label_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_tasks_id_labels_id_with_http_info(task_id, label_id, **kwargs) # noqa: E501 - return data - - def delete_tasks_id_labels_id_with_http_info(self, task_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a task. - - Deletes a label from a task. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_tasks_id_labels_id_with_http_info(task_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to delete the label from. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_tasks_id_labels_id_prepare(task_id, label_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_tasks_id_labels_id_async(self, task_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a task. - - Deletes a label from a task. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The ID of the task to delete the label from. (required) - :param str label_id: The ID of the label to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_tasks_id_labels_id_prepare(task_id, label_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_tasks_id_labels_id_prepare(self, task_id, label_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'label_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_tasks_id_labels_id', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `delete_tasks_id_labels_id`") # noqa: E501 - # verify the required parameter 'label_id' is set - if ('label_id' not in local_var_params or - local_var_params['label_id'] is None): - raise ValueError("Missing the required parameter `label_id` when calling `delete_tasks_id_labels_id`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - if 'label_id' in local_var_params: - path_params['labelID'] = local_var_params['label_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_tasks_id_members_id(self, user_id, task_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Removes a member from a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_tasks_id_members_id(user_id, task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the member to remove. (required) - :param str task_id: The task ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_tasks_id_members_id_with_http_info(user_id, task_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_tasks_id_members_id_with_http_info(user_id, task_id, **kwargs) # noqa: E501 - return data - - def delete_tasks_id_members_id_with_http_info(self, user_id, task_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Removes a member from a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_tasks_id_members_id_with_http_info(user_id, task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the member to remove. (required) - :param str task_id: The task ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_tasks_id_members_id_prepare(user_id, task_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/members/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_tasks_id_members_id_async(self, user_id, task_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Removes a member from a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of the member to remove. (required) - :param str task_id: The task ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_tasks_id_members_id_prepare(user_id, task_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/members/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_tasks_id_members_id_prepare(self, user_id, task_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'task_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_tasks_id_members_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `delete_tasks_id_members_id`") # noqa: E501 - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `delete_tasks_id_members_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_tasks_id_owners_id(self, user_id, task_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_tasks_id_owners_id(user_id, task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the owner to remove. (required) - :param str task_id: The task ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_tasks_id_owners_id_with_http_info(user_id, task_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_tasks_id_owners_id_with_http_info(user_id, task_id, **kwargs) # noqa: E501 - return data - - def delete_tasks_id_owners_id_with_http_info(self, user_id, task_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_tasks_id_owners_id_with_http_info(user_id, task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the owner to remove. (required) - :param str task_id: The task ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_tasks_id_owners_id_prepare(user_id, task_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/owners/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_tasks_id_owners_id_async(self, user_id, task_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of the owner to remove. (required) - :param str task_id: The task ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_tasks_id_owners_id_prepare(user_id, task_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/owners/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_tasks_id_owners_id_prepare(self, user_id, task_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'task_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_tasks_id_owners_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `delete_tasks_id_owners_id`") # noqa: E501 - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `delete_tasks_id_owners_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_tasks_id_runs_id(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - """Cancel a running task. - - Cancels a running [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). Use this endpoint with InfluxDB OSS to cancel a running task. #### InfluxDB Cloud - Doesn't support this operation. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_tasks_id_runs_id(task_id, run_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to cancel. (required) - :param str run_id: The ID of the task run to cancel. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_tasks_id_runs_id_with_http_info(task_id, run_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_tasks_id_runs_id_with_http_info(task_id, run_id, **kwargs) # noqa: E501 - return data - - def delete_tasks_id_runs_id_with_http_info(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - """Cancel a running task. - - Cancels a running [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). Use this endpoint with InfluxDB OSS to cancel a running task. #### InfluxDB Cloud - Doesn't support this operation. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_tasks_id_runs_id_with_http_info(task_id, run_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to cancel. (required) - :param str run_id: The ID of the task run to cancel. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_tasks_id_runs_id_prepare(task_id, run_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/runs/{runID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_tasks_id_runs_id_async(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - """Cancel a running task. - - Cancels a running [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). Use this endpoint with InfluxDB OSS to cancel a running task. #### InfluxDB Cloud - Doesn't support this operation. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The ID of the task to cancel. (required) - :param str run_id: The ID of the task run to cancel. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_tasks_id_runs_id_prepare(task_id, run_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/runs/{runID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_tasks_id_runs_id_prepare(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'run_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_tasks_id_runs_id', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `delete_tasks_id_runs_id`") # noqa: E501 - # verify the required parameter 'run_id' is set - if ('run_id' not in local_var_params or - local_var_params['run_id'] is None): - raise ValueError("Missing the required parameter `run_id` when calling `delete_tasks_id_runs_id`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - if 'run_id' in local_var_params: - path_params['runID'] = local_var_params['run_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_tasks(self, **kwargs): # noqa: E501,D401,D403 - """List tasks. - - Retrieves a list of [tasks](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). To limit which tasks are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all tasks up to the default `limit`. #### Related guide - [Process data with InfluxDB tasks](https://docs.influxdata.com/influxdb/latest/process-data/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str name: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) name. Only returns tasks with the specified name. Different tasks may have the same name. - :param str after: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) ID. Only returns tasks created after the specified task. - :param str user: A [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) ID. Only returns tasks owned by the specified user. - :param str org: An [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) name. Only returns tasks owned by the specified organization. - :param str org_id: An [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) ID. Only returns tasks owned by the specified organization. - :param str status: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) status. Only returns tasks that have the specified status (`active` or `inactive`). - :param int limit: The maximum number of [tasks](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) to return. Default is `100`. The minimum is `1` and the maximum is `500`. To reduce the payload size, combine _`type=basic`_ and _`limit`_ (see _Request samples_). For more information about the `basic` response, see the _`type`_ parameter. - :param str type: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) type (`basic` or `system`). Default is `system`. Specifies the level of detail for tasks in the response. The default (`system`) response contains all the metadata properties for tasks. To reduce the response size, pass `basic` to omit some task properties (`flux`, `createdAt`, `updatedAt`). - :return: Tasks - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_tasks_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_tasks_with_http_info(**kwargs) # noqa: E501 - return data - - def get_tasks_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List tasks. - - Retrieves a list of [tasks](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). To limit which tasks are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all tasks up to the default `limit`. #### Related guide - [Process data with InfluxDB tasks](https://docs.influxdata.com/influxdb/latest/process-data/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str name: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) name. Only returns tasks with the specified name. Different tasks may have the same name. - :param str after: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) ID. Only returns tasks created after the specified task. - :param str user: A [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) ID. Only returns tasks owned by the specified user. - :param str org: An [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) name. Only returns tasks owned by the specified organization. - :param str org_id: An [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) ID. Only returns tasks owned by the specified organization. - :param str status: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) status. Only returns tasks that have the specified status (`active` or `inactive`). - :param int limit: The maximum number of [tasks](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) to return. Default is `100`. The minimum is `1` and the maximum is `500`. To reduce the payload size, combine _`type=basic`_ and _`limit`_ (see _Request samples_). For more information about the `basic` response, see the _`type`_ parameter. - :param str type: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) type (`basic` or `system`). Default is `system`. Specifies the level of detail for tasks in the response. The default (`system`) response contains all the metadata properties for tasks. To reduce the response size, pass `basic` to omit some task properties (`flux`, `createdAt`, `updatedAt`). - :return: Tasks - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Tasks', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_tasks_async(self, **kwargs): # noqa: E501,D401,D403 - """List tasks. - - Retrieves a list of [tasks](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). To limit which tasks are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all tasks up to the default `limit`. #### Related guide - [Process data with InfluxDB tasks](https://docs.influxdata.com/influxdb/latest/process-data/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str name: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) name. Only returns tasks with the specified name. Different tasks may have the same name. - :param str after: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) ID. Only returns tasks created after the specified task. - :param str user: A [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) ID. Only returns tasks owned by the specified user. - :param str org: An [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) name. Only returns tasks owned by the specified organization. - :param str org_id: An [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization) ID. Only returns tasks owned by the specified organization. - :param str status: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) status. Only returns tasks that have the specified status (`active` or `inactive`). - :param int limit: The maximum number of [tasks](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) to return. Default is `100`. The minimum is `1` and the maximum is `500`. To reduce the payload size, combine _`type=basic`_ and _`limit`_ (see _Request samples_). For more information about the `basic` response, see the _`type`_ parameter. - :param str type: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) type (`basic` or `system`). Default is `system`. Specifies the level of detail for tasks in the response. The default (`system`) response contains all the metadata properties for tasks. To reduce the response size, pass `basic` to omit some task properties (`flux`, `createdAt`, `updatedAt`). - :return: Tasks - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Tasks', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_tasks_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'name', 'after', 'user', 'org', 'org_id', 'status', 'limit', 'type'] # noqa: E501 - self._check_operation_params('get_tasks', all_params, local_var_params) - - if 'limit' in local_var_params and local_var_params['limit'] > 500: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_tasks`, must be a value less than or equal to `500`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] < 1: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_tasks`, must be a value greater than or equal to `1`") # noqa: E501 - path_params = {} - - query_params = [] - if 'name' in local_var_params: - query_params.append(('name', local_var_params['name'])) # noqa: E501 - if 'after' in local_var_params: - query_params.append(('after', local_var_params['after'])) # noqa: E501 - if 'user' in local_var_params: - query_params.append(('user', local_var_params['user'])) # noqa: E501 - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'status' in local_var_params: - query_params.append(('status', local_var_params['status'])) # noqa: E501 - if 'limit' in local_var_params: - query_params.append(('limit', local_var_params['limit'])) # noqa: E501 - if 'type' in local_var_params: - query_params.append(('type', local_var_params['type'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_tasks_id(self, task_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a task. - - Retrieves a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Task - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_tasks_id_with_http_info(task_id, **kwargs) # noqa: E501 - else: - (data) = self.get_tasks_id_with_http_info(task_id, **kwargs) # noqa: E501 - return data - - def get_tasks_id_with_http_info(self, task_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a task. - - Retrieves a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_with_http_info(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Task - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_prepare(task_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Task', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_tasks_id_async(self, task_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a task. - - Retrieves a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The ID of the task to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Task - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_prepare(task_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Task', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_tasks_id_prepare(self, task_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_tasks_id', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `get_tasks_id`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_tasks_id_labels(self, task_id, **kwargs): # noqa: E501,D401,D403 - """List labels for a task. - - Retrieves a list of all labels for a task. Labels may be used for grouping and filtering tasks. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_labels(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to retrieve labels for. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_tasks_id_labels_with_http_info(task_id, **kwargs) # noqa: E501 - else: - (data) = self.get_tasks_id_labels_with_http_info(task_id, **kwargs) # noqa: E501 - return data - - def get_tasks_id_labels_with_http_info(self, task_id, **kwargs): # noqa: E501,D401,D403 - """List labels for a task. - - Retrieves a list of all labels for a task. Labels may be used for grouping and filtering tasks. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_labels_with_http_info(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to retrieve labels for. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_labels_prepare(task_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_tasks_id_labels_async(self, task_id, **kwargs): # noqa: E501,D401,D403 - """List labels for a task. - - Retrieves a list of all labels for a task. Labels may be used for grouping and filtering tasks. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The ID of the task to retrieve labels for. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_labels_prepare(task_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_tasks_id_labels_prepare(self, task_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_tasks_id_labels', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `get_tasks_id_labels`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_tasks_id_logs(self, task_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve all logs for a task. - - Retrieves a list of all logs for a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). When an InfluxDB task runs, a “run” record is created in the task’s history. Logs associated with each run provide relevant log messages, timestamps, and the exit status of the run attempt. Use this endpoint to retrieve only the log events for a task, without additional task metadata. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_logs(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The task ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: Logs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_tasks_id_logs_with_http_info(task_id, **kwargs) # noqa: E501 - else: - (data) = self.get_tasks_id_logs_with_http_info(task_id, **kwargs) # noqa: E501 - return data - - def get_tasks_id_logs_with_http_info(self, task_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve all logs for a task. - - Retrieves a list of all logs for a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). When an InfluxDB task runs, a “run” record is created in the task’s history. Logs associated with each run provide relevant log messages, timestamps, and the exit status of the run attempt. Use this endpoint to retrieve only the log events for a task, without additional task metadata. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_logs_with_http_info(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The task ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: Logs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_logs_prepare(task_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/logs', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Logs', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_tasks_id_logs_async(self, task_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve all logs for a task. - - Retrieves a list of all logs for a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). When an InfluxDB task runs, a “run” record is created in the task’s history. Logs associated with each run provide relevant log messages, timestamps, and the exit status of the run attempt. Use this endpoint to retrieve only the log events for a task, without additional task metadata. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The task ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: Logs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_logs_prepare(task_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/logs', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Logs', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_tasks_id_logs_prepare(self, task_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_tasks_id_logs', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `get_tasks_id_logs`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_tasks_id_members(self, task_id, **kwargs): # noqa: E501,D401,D403 - """List all task members. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Lists all users that have the `member` role for the specified [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_members(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The task ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_tasks_id_members_with_http_info(task_id, **kwargs) # noqa: E501 - else: - (data) = self.get_tasks_id_members_with_http_info(task_id, **kwargs) # noqa: E501 - return data - - def get_tasks_id_members_with_http_info(self, task_id, **kwargs): # noqa: E501,D401,D403 - """List all task members. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Lists all users that have the `member` role for the specified [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_members_with_http_info(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The task ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_members_prepare(task_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/members', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMembers', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_tasks_id_members_async(self, task_id, **kwargs): # noqa: E501,D401,D403 - """List all task members. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Lists all users that have the `member` role for the specified [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The task ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_members_prepare(task_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/members', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMembers', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_tasks_id_members_prepare(self, task_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_tasks_id_members', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `get_tasks_id_members`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_tasks_id_owners(self, task_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Retrieves all users that have owner permission for a task. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_owners(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to retrieve owners for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_tasks_id_owners_with_http_info(task_id, **kwargs) # noqa: E501 - else: - (data) = self.get_tasks_id_owners_with_http_info(task_id, **kwargs) # noqa: E501 - return data - - def get_tasks_id_owners_with_http_info(self, task_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Retrieves all users that have owner permission for a task. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_owners_with_http_info(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to retrieve owners for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_owners_prepare(task_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/owners', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwners', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_tasks_id_owners_async(self, task_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Retrieves all users that have owner permission for a task. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The ID of the task to retrieve owners for. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_owners_prepare(task_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/owners', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwners', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_tasks_id_owners_prepare(self, task_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_tasks_id_owners', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `get_tasks_id_owners`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_tasks_id_runs(self, task_id, **kwargs): # noqa: E501,D401,D403 - """List runs for a task. - - Retrieves a list of runs for a [task](https://docs.influxdata.com/influxdb/latest/process-data/). To limit which task runs are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all task runs up to the default `limit`. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_runs(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to get runs for. Only returns runs for this task. (required) - :param str zap_trace_span: OpenTracing span context - :param str after: A task run ID. Only returns runs created after this run. - :param int limit: Limits the number of task runs returned. Default is `100`. - :param datetime after_time: A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)). Only returns runs scheduled after this time. - :param datetime before_time: A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)). Only returns runs scheduled before this time. - :return: Runs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_tasks_id_runs_with_http_info(task_id, **kwargs) # noqa: E501 - else: - (data) = self.get_tasks_id_runs_with_http_info(task_id, **kwargs) # noqa: E501 - return data - - def get_tasks_id_runs_with_http_info(self, task_id, **kwargs): # noqa: E501,D401,D403 - """List runs for a task. - - Retrieves a list of runs for a [task](https://docs.influxdata.com/influxdb/latest/process-data/). To limit which task runs are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all task runs up to the default `limit`. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_runs_with_http_info(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to get runs for. Only returns runs for this task. (required) - :param str zap_trace_span: OpenTracing span context - :param str after: A task run ID. Only returns runs created after this run. - :param int limit: Limits the number of task runs returned. Default is `100`. - :param datetime after_time: A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)). Only returns runs scheduled after this time. - :param datetime before_time: A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)). Only returns runs scheduled before this time. - :return: Runs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_runs_prepare(task_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/runs', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Runs', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_tasks_id_runs_async(self, task_id, **kwargs): # noqa: E501,D401,D403 - """List runs for a task. - - Retrieves a list of runs for a [task](https://docs.influxdata.com/influxdb/latest/process-data/). To limit which task runs are returned, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all task runs up to the default `limit`. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The ID of the task to get runs for. Only returns runs for this task. (required) - :param str zap_trace_span: OpenTracing span context - :param str after: A task run ID. Only returns runs created after this run. - :param int limit: Limits the number of task runs returned. Default is `100`. - :param datetime after_time: A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)). Only returns runs scheduled after this time. - :param datetime before_time: A timestamp ([RFC3339 date/time format](https://docs.influxdata.com/influxdb/latest/reference/glossary/#rfc3339-timestamp)). Only returns runs scheduled before this time. - :return: Runs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_runs_prepare(task_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/runs', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Runs', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_tasks_id_runs_prepare(self, task_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'zap_trace_span', 'after', 'limit', 'after_time', 'before_time'] # noqa: E501 - self._check_operation_params('get_tasks_id_runs', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `get_tasks_id_runs`") # noqa: E501 - - if 'limit' in local_var_params and local_var_params['limit'] > 500: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_tasks_id_runs`, must be a value less than or equal to `500`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] < 1: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_tasks_id_runs`, must be a value greater than or equal to `1`") # noqa: E501 - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - if 'after' in local_var_params: - query_params.append(('after', local_var_params['after'])) # noqa: E501 - if 'limit' in local_var_params: - query_params.append(('limit', local_var_params['limit'])) # noqa: E501 - if 'after_time' in local_var_params: - query_params.append(('afterTime', local_var_params['after_time'])) # noqa: E501 - if 'before_time' in local_var_params: - query_params.append(('beforeTime', local_var_params['before_time'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_tasks_id_runs_id(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a run for a task.. - - Retrieves a specific run for a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). Use this endpoint to retrieve detail and logs for a specific task run. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_runs_id(task_id, run_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to retrieve runs for. (required) - :param str run_id: The ID of the run to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Run - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_tasks_id_runs_id_with_http_info(task_id, run_id, **kwargs) # noqa: E501 - else: - (data) = self.get_tasks_id_runs_id_with_http_info(task_id, run_id, **kwargs) # noqa: E501 - return data - - def get_tasks_id_runs_id_with_http_info(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a run for a task.. - - Retrieves a specific run for a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). Use this endpoint to retrieve detail and logs for a specific task run. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_runs_id_with_http_info(task_id, run_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to retrieve runs for. (required) - :param str run_id: The ID of the run to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Run - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_runs_id_prepare(task_id, run_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/runs/{runID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Run', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_tasks_id_runs_id_async(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a run for a task.. - - Retrieves a specific run for a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task). Use this endpoint to retrieve detail and logs for a specific task run. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The ID of the task to retrieve runs for. (required) - :param str run_id: The ID of the run to retrieve. (required) - :param str zap_trace_span: OpenTracing span context - :return: Run - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_runs_id_prepare(task_id, run_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/runs/{runID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Run', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_tasks_id_runs_id_prepare(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'run_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_tasks_id_runs_id', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `get_tasks_id_runs_id`") # noqa: E501 - # verify the required parameter 'run_id' is set - if ('run_id' not in local_var_params or - local_var_params['run_id'] is None): - raise ValueError("Missing the required parameter `run_id` when calling `get_tasks_id_runs_id`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - if 'run_id' in local_var_params: - path_params['runID'] = local_var_params['run_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_tasks_id_runs_id_logs(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve all logs for a run. - - Retrieves all logs for a task run. A log is a list of run events with `runID`, `time`, and `message` properties. Use this endpoint to help analyze task performance and troubleshoot failed task runs. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_runs_id_logs(task_id, run_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to get logs for. (required) - :param str run_id: The ID of the run to get logs for. (required) - :param str zap_trace_span: OpenTracing span context - :return: Logs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_tasks_id_runs_id_logs_with_http_info(task_id, run_id, **kwargs) # noqa: E501 - else: - (data) = self.get_tasks_id_runs_id_logs_with_http_info(task_id, run_id, **kwargs) # noqa: E501 - return data - - def get_tasks_id_runs_id_logs_with_http_info(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve all logs for a run. - - Retrieves all logs for a task run. A log is a list of run events with `runID`, `time`, and `message` properties. Use this endpoint to help analyze task performance and troubleshoot failed task runs. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_tasks_id_runs_id_logs_with_http_info(task_id, run_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to get logs for. (required) - :param str run_id: The ID of the run to get logs for. (required) - :param str zap_trace_span: OpenTracing span context - :return: Logs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_runs_id_logs_prepare(task_id, run_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/runs/{runID}/logs', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Logs', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_tasks_id_runs_id_logs_async(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve all logs for a run. - - Retrieves all logs for a task run. A log is a list of run events with `runID`, `time`, and `message` properties. Use this endpoint to help analyze task performance and troubleshoot failed task runs. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The ID of the task to get logs for. (required) - :param str run_id: The ID of the run to get logs for. (required) - :param str zap_trace_span: OpenTracing span context - :return: Logs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_tasks_id_runs_id_logs_prepare(task_id, run_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/runs/{runID}/logs', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Logs', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_tasks_id_runs_id_logs_prepare(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'run_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_tasks_id_runs_id_logs', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `get_tasks_id_runs_id_logs`") # noqa: E501 - # verify the required parameter 'run_id' is set - if ('run_id' not in local_var_params or - local_var_params['run_id'] is None): - raise ValueError("Missing the required parameter `run_id` when calling `get_tasks_id_runs_id_logs`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - if 'run_id' in local_var_params: - path_params['runID'] = local_var_params['run_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_tasks_id(self, task_id, task_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a task. - - Updates a task and then cancels all scheduled runs of the task. Use this endpoint to set, modify, and clear task properties (for example: `cron`, `name`, `flux`, `status`). Once InfluxDB applies the update, it cancels all previously scheduled runs of the task. To update a task, pass an object that contains the updated key-value pairs. To activate or inactivate a task, set the `status` property. _`"status": "inactive"`_ cancels scheduled runs and prevents manual runs of the task. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_tasks_id(task_id, task_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to update. (required) - :param TaskUpdateRequest task_update_request: An object that contains updated task properties to apply. (required) - :param str zap_trace_span: OpenTracing span context - :return: Task - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_tasks_id_with_http_info(task_id, task_update_request, **kwargs) # noqa: E501 - else: - (data) = self.patch_tasks_id_with_http_info(task_id, task_update_request, **kwargs) # noqa: E501 - return data - - def patch_tasks_id_with_http_info(self, task_id, task_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a task. - - Updates a task and then cancels all scheduled runs of the task. Use this endpoint to set, modify, and clear task properties (for example: `cron`, `name`, `flux`, `status`). Once InfluxDB applies the update, it cancels all previously scheduled runs of the task. To update a task, pass an object that contains the updated key-value pairs. To activate or inactivate a task, set the `status` property. _`"status": "inactive"`_ cancels scheduled runs and prevents manual runs of the task. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_tasks_id_with_http_info(task_id, task_update_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to update. (required) - :param TaskUpdateRequest task_update_request: An object that contains updated task properties to apply. (required) - :param str zap_trace_span: OpenTracing span context - :return: Task - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_tasks_id_prepare(task_id, task_update_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Task', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_tasks_id_async(self, task_id, task_update_request, **kwargs): # noqa: E501,D401,D403 - """Update a task. - - Updates a task and then cancels all scheduled runs of the task. Use this endpoint to set, modify, and clear task properties (for example: `cron`, `name`, `flux`, `status`). Once InfluxDB applies the update, it cancels all previously scheduled runs of the task. To update a task, pass an object that contains the updated key-value pairs. To activate or inactivate a task, set the `status` property. _`"status": "inactive"`_ cancels scheduled runs and prevents manual runs of the task. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The ID of the task to update. (required) - :param TaskUpdateRequest task_update_request: An object that contains updated task properties to apply. (required) - :param str zap_trace_span: OpenTracing span context - :return: Task - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_tasks_id_prepare(task_id, task_update_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Task', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_tasks_id_prepare(self, task_id, task_update_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'task_update_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_tasks_id', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `patch_tasks_id`") # noqa: E501 - # verify the required parameter 'task_update_request' is set - if ('task_update_request' not in local_var_params or - local_var_params['task_update_request'] is None): - raise ValueError("Missing the required parameter `task_update_request` when calling `patch_tasks_id`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'task_update_request' in local_var_params: - body_params = local_var_params['task_update_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_tasks(self, task_create_request, **kwargs): # noqa: E501,D401,D403 - """Create a task. - - Creates a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) and returns the task. #### Related guides - [Get started with tasks](https://docs.influxdata.com/influxdb/latest/process-data/get-started/) - [Create a task](https://docs.influxdata.com/influxdb/latest/process-data/manage-tasks/create-task/) - [Common tasks](https://docs.influxdata.com/influxdb/latest/process-data/common-tasks/) - [Task configuration options](https://docs.influxdata.com/influxdb/latest/process-data/task-options/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_tasks(task_create_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param TaskCreateRequest task_create_request: The task to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: Task - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_tasks_with_http_info(task_create_request, **kwargs) # noqa: E501 - else: - (data) = self.post_tasks_with_http_info(task_create_request, **kwargs) # noqa: E501 - return data - - def post_tasks_with_http_info(self, task_create_request, **kwargs): # noqa: E501,D401,D403 - """Create a task. - - Creates a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) and returns the task. #### Related guides - [Get started with tasks](https://docs.influxdata.com/influxdb/latest/process-data/get-started/) - [Create a task](https://docs.influxdata.com/influxdb/latest/process-data/manage-tasks/create-task/) - [Common tasks](https://docs.influxdata.com/influxdb/latest/process-data/common-tasks/) - [Task configuration options](https://docs.influxdata.com/influxdb/latest/process-data/task-options/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_tasks_with_http_info(task_create_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param TaskCreateRequest task_create_request: The task to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: Task - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_tasks_prepare(task_create_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Task', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_tasks_async(self, task_create_request, **kwargs): # noqa: E501,D401,D403 - """Create a task. - - Creates a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) and returns the task. #### Related guides - [Get started with tasks](https://docs.influxdata.com/influxdb/latest/process-data/get-started/) - [Create a task](https://docs.influxdata.com/influxdb/latest/process-data/manage-tasks/create-task/) - [Common tasks](https://docs.influxdata.com/influxdb/latest/process-data/common-tasks/) - [Task configuration options](https://docs.influxdata.com/influxdb/latest/process-data/task-options/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param TaskCreateRequest task_create_request: The task to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: Task - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_tasks_prepare(task_create_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Task', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_tasks_prepare(self, task_create_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_create_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_tasks', all_params, local_var_params) - # verify the required parameter 'task_create_request' is set - if ('task_create_request' not in local_var_params or - local_var_params['task_create_request'] is None): - raise ValueError("Missing the required parameter `task_create_request` when calling `post_tasks`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'task_create_request' in local_var_params: - body_params = local_var_params['task_create_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_tasks_id_labels(self, task_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a task. - - Adds a label to a task. Use this endpoint to add a label that you can use to filter tasks in the InfluxDB UI. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_tasks_id_labels(task_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to label. (required) - :param LabelMapping label_mapping: An object that contains a _`labelID`_ to add to the task. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_tasks_id_labels_with_http_info(task_id, label_mapping, **kwargs) # noqa: E501 - else: - (data) = self.post_tasks_id_labels_with_http_info(task_id, label_mapping, **kwargs) # noqa: E501 - return data - - def post_tasks_id_labels_with_http_info(self, task_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a task. - - Adds a label to a task. Use this endpoint to add a label that you can use to filter tasks in the InfluxDB UI. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_tasks_id_labels_with_http_info(task_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The ID of the task to label. (required) - :param LabelMapping label_mapping: An object that contains a _`labelID`_ to add to the task. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_tasks_id_labels_prepare(task_id, label_mapping, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_tasks_id_labels_async(self, task_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a task. - - Adds a label to a task. Use this endpoint to add a label that you can use to filter tasks in the InfluxDB UI. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The ID of the task to label. (required) - :param LabelMapping label_mapping: An object that contains a _`labelID`_ to add to the task. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_tasks_id_labels_prepare(task_id, label_mapping, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_tasks_id_labels_prepare(self, task_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'label_mapping', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_tasks_id_labels', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `post_tasks_id_labels`") # noqa: E501 - # verify the required parameter 'label_mapping' is set - if ('label_mapping' not in local_var_params or - local_var_params['label_mapping'] is None): - raise ValueError("Missing the required parameter `label_mapping` when calling `post_tasks_id_labels`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'label_mapping' in local_var_params: - body_params = local_var_params['label_mapping'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_tasks_id_members(self, task_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Adds a user to members of a task and returns the member. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_tasks_id_members(task_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The task ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: A user to add as a member of the task. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_tasks_id_members_with_http_info(task_id, add_resource_member_request_body, **kwargs) # noqa: E501 - else: - (data) = self.post_tasks_id_members_with_http_info(task_id, add_resource_member_request_body, **kwargs) # noqa: E501 - return data - - def post_tasks_id_members_with_http_info(self, task_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Adds a user to members of a task and returns the member. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_tasks_id_members_with_http_info(task_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The task ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: A user to add as a member of the task. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_tasks_id_members_prepare(task_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/members', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMember', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_tasks_id_members_async(self, task_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Adds a user to members of a task and returns the member. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The task ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: A user to add as a member of the task. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_tasks_id_members_prepare(task_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/members', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMember', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_tasks_id_members_prepare(self, task_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'add_resource_member_request_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_tasks_id_members', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `post_tasks_id_members`") # noqa: E501 - # verify the required parameter 'add_resource_member_request_body' is set - if ('add_resource_member_request_body' not in local_var_params or - local_var_params['add_resource_member_request_body'] is None): - raise ValueError("Missing the required parameter `add_resource_member_request_body` when calling `post_tasks_id_members`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'add_resource_member_request_body' in local_var_params: - body_params = local_var_params['add_resource_member_request_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_tasks_id_owners(self, task_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner for a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Assigns a task `owner` role to a user. Use this endpoint to create a _resource owner_ for the task. A _resource owner_ is a user with `role: owner` for a specific resource. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_tasks_id_owners(task_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The task ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: A user to add as an owner of the task. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_tasks_id_owners_with_http_info(task_id, add_resource_member_request_body, **kwargs) # noqa: E501 - else: - (data) = self.post_tasks_id_owners_with_http_info(task_id, add_resource_member_request_body, **kwargs) # noqa: E501 - return data - - def post_tasks_id_owners_with_http_info(self, task_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner for a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Assigns a task `owner` role to a user. Use this endpoint to create a _resource owner_ for the task. A _resource owner_ is a user with `role: owner` for a specific resource. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_tasks_id_owners_with_http_info(task_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: The task ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: A user to add as an owner of the task. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_tasks_id_owners_prepare(task_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/owners', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwner', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_tasks_id_owners_async(self, task_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner for a task. - - **Deprecated**: Tasks don't use `owner` and `member` roles. Use [`/api/v2/authorizations`](#tag/Authorizations-(API-tokens)) to assign user permissions. Assigns a task `owner` role to a user. Use this endpoint to create a _resource owner_ for the task. A _resource owner_ is a user with `role: owner` for a specific resource. - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: The task ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: A user to add as an owner of the task. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_tasks_id_owners_prepare(task_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/owners', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwner', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_tasks_id_owners_prepare(self, task_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'add_resource_member_request_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_tasks_id_owners', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `post_tasks_id_owners`") # noqa: E501 - # verify the required parameter 'add_resource_member_request_body' is set - if ('add_resource_member_request_body' not in local_var_params or - local_var_params['add_resource_member_request_body'] is None): - raise ValueError("Missing the required parameter `add_resource_member_request_body` when calling `post_tasks_id_owners`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'add_resource_member_request_body' in local_var_params: - body_params = local_var_params['add_resource_member_request_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_tasks_id_runs(self, task_id, **kwargs): # noqa: E501,D401,D403 - """Start a task run, overriding the schedule. - - Schedules a task run to start immediately, ignoring scheduled runs. Use this endpoint to manually start a task run. Scheduled runs will continue to run as scheduled. This may result in concurrently running tasks. To _retry_ a previous run (and avoid creating a new run), use the [`POST /api/v2/tasks/{taskID}/runs/{runID}/retry` endpoint](#operation/PostTasksIDRunsIDRetry). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_tasks_id_runs(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: (required) - :param str zap_trace_span: OpenTracing span context - :param RunManually run_manually: - :return: Run - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_tasks_id_runs_with_http_info(task_id, **kwargs) # noqa: E501 - else: - (data) = self.post_tasks_id_runs_with_http_info(task_id, **kwargs) # noqa: E501 - return data - - def post_tasks_id_runs_with_http_info(self, task_id, **kwargs): # noqa: E501,D401,D403 - """Start a task run, overriding the schedule. - - Schedules a task run to start immediately, ignoring scheduled runs. Use this endpoint to manually start a task run. Scheduled runs will continue to run as scheduled. This may result in concurrently running tasks. To _retry_ a previous run (and avoid creating a new run), use the [`POST /api/v2/tasks/{taskID}/runs/{runID}/retry` endpoint](#operation/PostTasksIDRunsIDRetry). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_tasks_id_runs_with_http_info(task_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: (required) - :param str zap_trace_span: OpenTracing span context - :param RunManually run_manually: - :return: Run - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_tasks_id_runs_prepare(task_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/runs', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Run', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_tasks_id_runs_async(self, task_id, **kwargs): # noqa: E501,D401,D403 - """Start a task run, overriding the schedule. - - Schedules a task run to start immediately, ignoring scheduled runs. Use this endpoint to manually start a task run. Scheduled runs will continue to run as scheduled. This may result in concurrently running tasks. To _retry_ a previous run (and avoid creating a new run), use the [`POST /api/v2/tasks/{taskID}/runs/{runID}/retry` endpoint](#operation/PostTasksIDRunsIDRetry). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: (required) - :param str zap_trace_span: OpenTracing span context - :param RunManually run_manually: - :return: Run - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_tasks_id_runs_prepare(task_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/runs', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Run', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_tasks_id_runs_prepare(self, task_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'zap_trace_span', 'run_manually'] # noqa: E501 - self._check_operation_params('post_tasks_id_runs', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `post_tasks_id_runs`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'run_manually' in local_var_params: - body_params = local_var_params['run_manually'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_tasks_id_runs_id_retry(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - """Retry a task run. - - Queues a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) run to retry and returns the scheduled run. To manually start a _new_ task run, use the [`POST /api/v2/tasks/{taskID}/runs` endpoint](#operation/PostTasksIDRuns). #### Limitations - The task must be _active_ (`status: "active"`). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_tasks_id_runs_id_retry(task_id, run_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) ID. Specifies the task to retry. (required) - :param str run_id: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) run ID. Specifies the task run to retry. To find a task run ID, use the [`GET /api/v2/tasks/{taskID}/runs` endpoint](#operation/GetTasksIDRuns) to list task runs. (required) - :param str zap_trace_span: OpenTracing span context - :param str body: - :return: Run - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_tasks_id_runs_id_retry_with_http_info(task_id, run_id, **kwargs) # noqa: E501 - else: - (data) = self.post_tasks_id_runs_id_retry_with_http_info(task_id, run_id, **kwargs) # noqa: E501 - return data - - def post_tasks_id_runs_id_retry_with_http_info(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - """Retry a task run. - - Queues a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) run to retry and returns the scheduled run. To manually start a _new_ task run, use the [`POST /api/v2/tasks/{taskID}/runs` endpoint](#operation/PostTasksIDRuns). #### Limitations - The task must be _active_ (`status: "active"`). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_tasks_id_runs_id_retry_with_http_info(task_id, run_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str task_id: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) ID. Specifies the task to retry. (required) - :param str run_id: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) run ID. Specifies the task run to retry. To find a task run ID, use the [`GET /api/v2/tasks/{taskID}/runs` endpoint](#operation/GetTasksIDRuns) to list task runs. (required) - :param str zap_trace_span: OpenTracing span context - :param str body: - :return: Run - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_tasks_id_runs_id_retry_prepare(task_id, run_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/tasks/{taskID}/runs/{runID}/retry', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Run', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_tasks_id_runs_id_retry_async(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - """Retry a task run. - - Queues a [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) run to retry and returns the scheduled run. To manually start a _new_ task run, use the [`POST /api/v2/tasks/{taskID}/runs` endpoint](#operation/PostTasksIDRuns). #### Limitations - The task must be _active_ (`status: "active"`). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str task_id: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) ID. Specifies the task to retry. (required) - :param str run_id: A [task](https://docs.influxdata.com/influxdb/latest/reference/glossary/#task) run ID. Specifies the task run to retry. To find a task run ID, use the [`GET /api/v2/tasks/{taskID}/runs` endpoint](#operation/GetTasksIDRuns) to list task runs. (required) - :param str zap_trace_span: OpenTracing span context - :param str body: - :return: Run - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_tasks_id_runs_id_retry_prepare(task_id, run_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/tasks/{taskID}/runs/{runID}/retry', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Run', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_tasks_id_runs_id_retry_prepare(self, task_id, run_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['task_id', 'run_id', 'zap_trace_span', 'body'] # noqa: E501 - self._check_operation_params('post_tasks_id_runs_id_retry', all_params, local_var_params) - # verify the required parameter 'task_id' is set - if ('task_id' not in local_var_params or - local_var_params['task_id'] is None): - raise ValueError("Missing the required parameter `task_id` when calling `post_tasks_id_runs_id_retry`") # noqa: E501 - # verify the required parameter 'run_id' is set - if ('run_id' not in local_var_params or - local_var_params['run_id'] is None): - raise ValueError("Missing the required parameter `run_id` when calling `post_tasks_id_runs_id_retry`") # noqa: E501 - - path_params = {} - if 'task_id' in local_var_params: - path_params['taskID'] = local_var_params['task_id'] # noqa: E501 - if 'run_id' in local_var_params: - path_params['runID'] = local_var_params['run_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'body' in local_var_params: - body_params = local_var_params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json; charset=utf-8']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/telegraf_plugins_service.py b/frogpilot/third_party/influxdb_client/service/telegraf_plugins_service.py deleted file mode 100644 index 905fdd343..000000000 --- a/frogpilot/third_party/influxdb_client/service/telegraf_plugins_service.py +++ /dev/null @@ -1,142 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class TelegrafPluginsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """TelegrafPluginsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def get_telegraf_plugins(self, **kwargs): # noqa: E501,D401,D403 - """List all Telegraf plugins. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_telegraf_plugins(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str type: The type of plugin desired. - :return: TelegrafPlugins - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_telegraf_plugins_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_telegraf_plugins_with_http_info(**kwargs) # noqa: E501 - return data - - def get_telegraf_plugins_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List all Telegraf plugins. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_telegraf_plugins_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str type: The type of plugin desired. - :return: TelegrafPlugins - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_telegraf_plugins_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegraf/plugins', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='TelegrafPlugins', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_telegraf_plugins_async(self, **kwargs): # noqa: E501,D401,D403 - """List all Telegraf plugins. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str type: The type of plugin desired. - :return: TelegrafPlugins - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_telegraf_plugins_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegraf/plugins', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='TelegrafPlugins', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_telegraf_plugins_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'type'] # noqa: E501 - self._check_operation_params('get_telegraf_plugins', all_params, local_var_params) - - path_params = {} - - query_params = [] - if 'type' in local_var_params: - query_params.append(('type', local_var_params['type'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/telegrafs_service.py b/frogpilot/third_party/influxdb_client/service/telegrafs_service.py deleted file mode 100644 index 4c3bfe9ee..000000000 --- a/frogpilot/third_party/influxdb_client/service/telegrafs_service.py +++ /dev/null @@ -1,1738 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class TelegrafsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """TelegrafsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_telegrafs_id(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """Delete a Telegraf configuration. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_telegrafs_id(telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf configuration ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_telegrafs_id_with_http_info(telegraf_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_telegrafs_id_with_http_info(telegraf_id, **kwargs) # noqa: E501 - return data - - def delete_telegrafs_id_with_http_info(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """Delete a Telegraf configuration. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_telegrafs_id_with_http_info(telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf configuration ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_telegrafs_id_prepare(telegraf_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_telegrafs_id_async(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """Delete a Telegraf configuration. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str telegraf_id: The Telegraf configuration ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_telegrafs_id_prepare(telegraf_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_telegrafs_id_prepare(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['telegraf_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_telegrafs_id', all_params, local_var_params) - # verify the required parameter 'telegraf_id' is set - if ('telegraf_id' not in local_var_params or - local_var_params['telegraf_id'] is None): - raise ValueError("Missing the required parameter `telegraf_id` when calling `delete_telegrafs_id`") # noqa: E501 - - path_params = {} - if 'telegraf_id' in local_var_params: - path_params['telegrafID'] = local_var_params['telegraf_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_telegrafs_id_labels_id(self, telegraf_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_telegrafs_id_labels_id(telegraf_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param str label_id: The label ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_telegrafs_id_labels_id_with_http_info(telegraf_id, label_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_telegrafs_id_labels_id_with_http_info(telegraf_id, label_id, **kwargs) # noqa: E501 - return data - - def delete_telegrafs_id_labels_id_with_http_info(self, telegraf_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_telegrafs_id_labels_id_with_http_info(telegraf_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param str label_id: The label ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_telegrafs_id_labels_id_prepare(telegraf_id, label_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_telegrafs_id_labels_id_async(self, telegraf_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a Telegraf config. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param str label_id: The label ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_telegrafs_id_labels_id_prepare(telegraf_id, label_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_telegrafs_id_labels_id_prepare(self, telegraf_id, label_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['telegraf_id', 'label_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_telegrafs_id_labels_id', all_params, local_var_params) - # verify the required parameter 'telegraf_id' is set - if ('telegraf_id' not in local_var_params or - local_var_params['telegraf_id'] is None): - raise ValueError("Missing the required parameter `telegraf_id` when calling `delete_telegrafs_id_labels_id`") # noqa: E501 - # verify the required parameter 'label_id' is set - if ('label_id' not in local_var_params or - local_var_params['label_id'] is None): - raise ValueError("Missing the required parameter `label_id` when calling `delete_telegrafs_id_labels_id`") # noqa: E501 - - path_params = {} - if 'telegraf_id' in local_var_params: - path_params['telegrafID'] = local_var_params['telegraf_id'] # noqa: E501 - if 'label_id' in local_var_params: - path_params['labelID'] = local_var_params['label_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_telegrafs_id_members_id(self, user_id, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_telegrafs_id_members_id(user_id, telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the member to remove. (required) - :param str telegraf_id: The Telegraf config ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_telegrafs_id_members_id_with_http_info(user_id, telegraf_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_telegrafs_id_members_id_with_http_info(user_id, telegraf_id, **kwargs) # noqa: E501 - return data - - def delete_telegrafs_id_members_id_with_http_info(self, user_id, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_telegrafs_id_members_id_with_http_info(user_id, telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the member to remove. (required) - :param str telegraf_id: The Telegraf config ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_telegrafs_id_members_id_prepare(user_id, telegraf_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/members/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_telegrafs_id_members_id_async(self, user_id, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """Remove a member from a Telegraf config. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of the member to remove. (required) - :param str telegraf_id: The Telegraf config ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_telegrafs_id_members_id_prepare(user_id, telegraf_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/members/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_telegrafs_id_members_id_prepare(self, user_id, telegraf_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'telegraf_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_telegrafs_id_members_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `delete_telegrafs_id_members_id`") # noqa: E501 - # verify the required parameter 'telegraf_id' is set - if ('telegraf_id' not in local_var_params or - local_var_params['telegraf_id'] is None): - raise ValueError("Missing the required parameter `telegraf_id` when calling `delete_telegrafs_id_members_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - if 'telegraf_id' in local_var_params: - path_params['telegrafID'] = local_var_params['telegraf_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_telegrafs_id_owners_id(self, user_id, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_telegrafs_id_owners_id(user_id, telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the owner to remove. (required) - :param str telegraf_id: The Telegraf config ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_telegrafs_id_owners_id_with_http_info(user_id, telegraf_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_telegrafs_id_owners_id_with_http_info(user_id, telegraf_id, **kwargs) # noqa: E501 - return data - - def delete_telegrafs_id_owners_id_with_http_info(self, user_id, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_telegrafs_id_owners_id_with_http_info(user_id, telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the owner to remove. (required) - :param str telegraf_id: The Telegraf config ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_telegrafs_id_owners_id_prepare(user_id, telegraf_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/owners/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_telegrafs_id_owners_id_async(self, user_id, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """Remove an owner from a Telegraf config. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of the owner to remove. (required) - :param str telegraf_id: The Telegraf config ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_telegrafs_id_owners_id_prepare(user_id, telegraf_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/owners/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_telegrafs_id_owners_id_prepare(self, user_id, telegraf_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'telegraf_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_telegrafs_id_owners_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `delete_telegrafs_id_owners_id`") # noqa: E501 - # verify the required parameter 'telegraf_id' is set - if ('telegraf_id' not in local_var_params or - local_var_params['telegraf_id'] is None): - raise ValueError("Missing the required parameter `telegraf_id` when calling `delete_telegrafs_id_owners_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - if 'telegraf_id' in local_var_params: - path_params['telegrafID'] = local_var_params['telegraf_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_telegrafs(self, **kwargs): # noqa: E501,D401,D403 - """List all Telegraf configurations. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_telegrafs(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org_id: The organization ID the Telegraf config belongs to. - :return: Telegrafs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_telegrafs_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_telegrafs_with_http_info(**kwargs) # noqa: E501 - return data - - def get_telegrafs_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List all Telegraf configurations. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_telegrafs_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org_id: The organization ID the Telegraf config belongs to. - :return: Telegrafs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_telegrafs_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Telegrafs', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_telegrafs_async(self, **kwargs): # noqa: E501,D401,D403 - """List all Telegraf configurations. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org_id: The organization ID the Telegraf config belongs to. - :return: Telegrafs - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_telegrafs_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Telegrafs', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_telegrafs_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'org_id'] # noqa: E501 - self._check_operation_params('get_telegrafs', all_params, local_var_params) - - path_params = {} - - query_params = [] - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_telegrafs_id(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a Telegraf configuration. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_telegrafs_id(telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf configuration ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str accept: - :return: str - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_telegrafs_id_with_http_info(telegraf_id, **kwargs) # noqa: E501 - else: - (data) = self.get_telegrafs_id_with_http_info(telegraf_id, **kwargs) # noqa: E501 - return data - - def get_telegrafs_id_with_http_info(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a Telegraf configuration. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_telegrafs_id_with_http_info(telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf configuration ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str accept: - :return: str - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_telegrafs_id_prepare(telegraf_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='str', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_telegrafs_id_async(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a Telegraf configuration. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str telegraf_id: The Telegraf configuration ID. (required) - :param str zap_trace_span: OpenTracing span context - :param str accept: - :return: str - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_telegrafs_id_prepare(telegraf_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='str', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_telegrafs_id_prepare(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['telegraf_id', 'zap_trace_span', 'accept'] # noqa: E501 - self._check_operation_params('get_telegrafs_id', all_params, local_var_params) - # verify the required parameter 'telegraf_id' is set - if ('telegraf_id' not in local_var_params or - local_var_params['telegraf_id'] is None): - raise ValueError("Missing the required parameter `telegraf_id` when calling `get_telegrafs_id`") # noqa: E501 - - path_params = {} - if 'telegraf_id' in local_var_params: - path_params['telegrafID'] = local_var_params['telegraf_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'accept' in local_var_params: - header_params['Accept'] = local_var_params['accept'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/toml', 'application/json', 'application/octet-stream']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_telegrafs_id_labels(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_telegrafs_id_labels(telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_telegrafs_id_labels_with_http_info(telegraf_id, **kwargs) # noqa: E501 - else: - (data) = self.get_telegrafs_id_labels_with_http_info(telegraf_id, **kwargs) # noqa: E501 - return data - - def get_telegrafs_id_labels_with_http_info(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_telegrafs_id_labels_with_http_info(telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_telegrafs_id_labels_prepare(telegraf_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_telegrafs_id_labels_async(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a Telegraf config. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_telegrafs_id_labels_prepare(telegraf_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_telegrafs_id_labels_prepare(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['telegraf_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_telegrafs_id_labels', all_params, local_var_params) - # verify the required parameter 'telegraf_id' is set - if ('telegraf_id' not in local_var_params or - local_var_params['telegraf_id'] is None): - raise ValueError("Missing the required parameter `telegraf_id` when calling `get_telegrafs_id_labels`") # noqa: E501 - - path_params = {} - if 'telegraf_id' in local_var_params: - path_params['telegrafID'] = local_var_params['telegraf_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_telegrafs_id_members(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """List all users with member privileges for a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_telegrafs_id_members(telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_telegrafs_id_members_with_http_info(telegraf_id, **kwargs) # noqa: E501 - else: - (data) = self.get_telegrafs_id_members_with_http_info(telegraf_id, **kwargs) # noqa: E501 - return data - - def get_telegrafs_id_members_with_http_info(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """List all users with member privileges for a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_telegrafs_id_members_with_http_info(telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_telegrafs_id_members_prepare(telegraf_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/members', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMembers', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_telegrafs_id_members_async(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """List all users with member privileges for a Telegraf config. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMembers - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_telegrafs_id_members_prepare(telegraf_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/members', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMembers', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_telegrafs_id_members_prepare(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['telegraf_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_telegrafs_id_members', all_params, local_var_params) - # verify the required parameter 'telegraf_id' is set - if ('telegraf_id' not in local_var_params or - local_var_params['telegraf_id'] is None): - raise ValueError("Missing the required parameter `telegraf_id` when calling `get_telegrafs_id_members`") # noqa: E501 - - path_params = {} - if 'telegraf_id' in local_var_params: - path_params['telegrafID'] = local_var_params['telegraf_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_telegrafs_id_owners(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of a Telegraf configuration. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_telegrafs_id_owners(telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf configuration ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_telegrafs_id_owners_with_http_info(telegraf_id, **kwargs) # noqa: E501 - else: - (data) = self.get_telegrafs_id_owners_with_http_info(telegraf_id, **kwargs) # noqa: E501 - return data - - def get_telegrafs_id_owners_with_http_info(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of a Telegraf configuration. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_telegrafs_id_owners_with_http_info(telegraf_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf configuration ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_telegrafs_id_owners_prepare(telegraf_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/owners', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwners', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_telegrafs_id_owners_async(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - """List all owners of a Telegraf configuration. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str telegraf_id: The Telegraf configuration ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwners - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_telegrafs_id_owners_prepare(telegraf_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/owners', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwners', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_telegrafs_id_owners_prepare(self, telegraf_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['telegraf_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_telegrafs_id_owners', all_params, local_var_params) - # verify the required parameter 'telegraf_id' is set - if ('telegraf_id' not in local_var_params or - local_var_params['telegraf_id'] is None): - raise ValueError("Missing the required parameter `telegraf_id` when calling `get_telegrafs_id_owners`") # noqa: E501 - - path_params = {} - if 'telegraf_id' in local_var_params: - path_params['telegrafID'] = local_var_params['telegraf_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_telegrafs(self, telegraf_plugin_request, **kwargs): # noqa: E501,D401,D403 - """Create a Telegraf configuration. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_telegrafs(telegraf_plugin_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param TelegrafPluginRequest telegraf_plugin_request: Telegraf configuration to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Telegraf - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_telegrafs_with_http_info(telegraf_plugin_request, **kwargs) # noqa: E501 - else: - (data) = self.post_telegrafs_with_http_info(telegraf_plugin_request, **kwargs) # noqa: E501 - return data - - def post_telegrafs_with_http_info(self, telegraf_plugin_request, **kwargs): # noqa: E501,D401,D403 - """Create a Telegraf configuration. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_telegrafs_with_http_info(telegraf_plugin_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param TelegrafPluginRequest telegraf_plugin_request: Telegraf configuration to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Telegraf - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_telegrafs_prepare(telegraf_plugin_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Telegraf', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_telegrafs_async(self, telegraf_plugin_request, **kwargs): # noqa: E501,D401,D403 - """Create a Telegraf configuration. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param TelegrafPluginRequest telegraf_plugin_request: Telegraf configuration to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Telegraf - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_telegrafs_prepare(telegraf_plugin_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Telegraf', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_telegrafs_prepare(self, telegraf_plugin_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['telegraf_plugin_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_telegrafs', all_params, local_var_params) - # verify the required parameter 'telegraf_plugin_request' is set - if ('telegraf_plugin_request' not in local_var_params or - local_var_params['telegraf_plugin_request'] is None): - raise ValueError("Missing the required parameter `telegraf_plugin_request` when calling `post_telegrafs`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'telegraf_plugin_request' in local_var_params: - body_params = local_var_params['telegraf_plugin_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_telegrafs_id_labels(self, telegraf_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_telegrafs_id_labels(telegraf_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_telegrafs_id_labels_with_http_info(telegraf_id, label_mapping, **kwargs) # noqa: E501 - else: - (data) = self.post_telegrafs_id_labels_with_http_info(telegraf_id, label_mapping, **kwargs) # noqa: E501 - return data - - def post_telegrafs_id_labels_with_http_info(self, telegraf_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_telegrafs_id_labels_with_http_info(telegraf_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_telegrafs_id_labels_prepare(telegraf_id, label_mapping, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_telegrafs_id_labels_async(self, telegraf_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a Telegraf config. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_telegrafs_id_labels_prepare(telegraf_id, label_mapping, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_telegrafs_id_labels_prepare(self, telegraf_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['telegraf_id', 'label_mapping', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_telegrafs_id_labels', all_params, local_var_params) - # verify the required parameter 'telegraf_id' is set - if ('telegraf_id' not in local_var_params or - local_var_params['telegraf_id'] is None): - raise ValueError("Missing the required parameter `telegraf_id` when calling `post_telegrafs_id_labels`") # noqa: E501 - # verify the required parameter 'label_mapping' is set - if ('label_mapping' not in local_var_params or - local_var_params['label_mapping'] is None): - raise ValueError("Missing the required parameter `label_mapping` when calling `post_telegrafs_id_labels`") # noqa: E501 - - path_params = {} - if 'telegraf_id' in local_var_params: - path_params['telegrafID'] = local_var_params['telegraf_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'label_mapping' in local_var_params: - body_params = local_var_params['label_mapping'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_telegrafs_id_members(self, telegraf_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_telegrafs_id_members(telegraf_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as member (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_telegrafs_id_members_with_http_info(telegraf_id, add_resource_member_request_body, **kwargs) # noqa: E501 - else: - (data) = self.post_telegrafs_id_members_with_http_info(telegraf_id, add_resource_member_request_body, **kwargs) # noqa: E501 - return data - - def post_telegrafs_id_members_with_http_info(self, telegraf_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a Telegraf config. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_telegrafs_id_members_with_http_info(telegraf_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as member (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_telegrafs_id_members_prepare(telegraf_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/members', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMember', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_telegrafs_id_members_async(self, telegraf_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add a member to a Telegraf config. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as member (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceMember - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_telegrafs_id_members_prepare(telegraf_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/members', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceMember', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_telegrafs_id_members_prepare(self, telegraf_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['telegraf_id', 'add_resource_member_request_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_telegrafs_id_members', all_params, local_var_params) - # verify the required parameter 'telegraf_id' is set - if ('telegraf_id' not in local_var_params or - local_var_params['telegraf_id'] is None): - raise ValueError("Missing the required parameter `telegraf_id` when calling `post_telegrafs_id_members`") # noqa: E501 - # verify the required parameter 'add_resource_member_request_body' is set - if ('add_resource_member_request_body' not in local_var_params or - local_var_params['add_resource_member_request_body'] is None): - raise ValueError("Missing the required parameter `add_resource_member_request_body` when calling `post_telegrafs_id_members`") # noqa: E501 - - path_params = {} - if 'telegraf_id' in local_var_params: - path_params['telegrafID'] = local_var_params['telegraf_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'add_resource_member_request_body' in local_var_params: - body_params = local_var_params['add_resource_member_request_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_telegrafs_id_owners(self, telegraf_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to a Telegraf configuration. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_telegrafs_id_owners(telegraf_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf configuration ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as owner (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_telegrafs_id_owners_with_http_info(telegraf_id, add_resource_member_request_body, **kwargs) # noqa: E501 - else: - (data) = self.post_telegrafs_id_owners_with_http_info(telegraf_id, add_resource_member_request_body, **kwargs) # noqa: E501 - return data - - def post_telegrafs_id_owners_with_http_info(self, telegraf_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to a Telegraf configuration. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_telegrafs_id_owners_with_http_info(telegraf_id, add_resource_member_request_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf configuration ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as owner (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_telegrafs_id_owners_prepare(telegraf_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/owners', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwner', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_telegrafs_id_owners_async(self, telegraf_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - """Add an owner to a Telegraf configuration. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str telegraf_id: The Telegraf configuration ID. (required) - :param AddResourceMemberRequestBody add_resource_member_request_body: User to add as owner (required) - :param str zap_trace_span: OpenTracing span context - :return: ResourceOwner - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_telegrafs_id_owners_prepare(telegraf_id, add_resource_member_request_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}/owners', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ResourceOwner', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_telegrafs_id_owners_prepare(self, telegraf_id, add_resource_member_request_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['telegraf_id', 'add_resource_member_request_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_telegrafs_id_owners', all_params, local_var_params) - # verify the required parameter 'telegraf_id' is set - if ('telegraf_id' not in local_var_params or - local_var_params['telegraf_id'] is None): - raise ValueError("Missing the required parameter `telegraf_id` when calling `post_telegrafs_id_owners`") # noqa: E501 - # verify the required parameter 'add_resource_member_request_body' is set - if ('add_resource_member_request_body' not in local_var_params or - local_var_params['add_resource_member_request_body'] is None): - raise ValueError("Missing the required parameter `add_resource_member_request_body` when calling `post_telegrafs_id_owners`") # noqa: E501 - - path_params = {} - if 'telegraf_id' in local_var_params: - path_params['telegrafID'] = local_var_params['telegraf_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'add_resource_member_request_body' in local_var_params: - body_params = local_var_params['add_resource_member_request_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def put_telegrafs_id(self, telegraf_id, telegraf_plugin_request, **kwargs): # noqa: E501,D401,D403 - """Update a Telegraf configuration. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_telegrafs_id(telegraf_id, telegraf_plugin_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param TelegrafPluginRequest telegraf_plugin_request: Telegraf configuration update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: Telegraf - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.put_telegrafs_id_with_http_info(telegraf_id, telegraf_plugin_request, **kwargs) # noqa: E501 - else: - (data) = self.put_telegrafs_id_with_http_info(telegraf_id, telegraf_plugin_request, **kwargs) # noqa: E501 - return data - - def put_telegrafs_id_with_http_info(self, telegraf_id, telegraf_plugin_request, **kwargs): # noqa: E501,D401,D403 - """Update a Telegraf configuration. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_telegrafs_id_with_http_info(telegraf_id, telegraf_plugin_request, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param TelegrafPluginRequest telegraf_plugin_request: Telegraf configuration update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: Telegraf - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_telegrafs_id_prepare(telegraf_id, telegraf_plugin_request, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Telegraf', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def put_telegrafs_id_async(self, telegraf_id, telegraf_plugin_request, **kwargs): # noqa: E501,D401,D403 - """Update a Telegraf configuration. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str telegraf_id: The Telegraf config ID. (required) - :param TelegrafPluginRequest telegraf_plugin_request: Telegraf configuration update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: Telegraf - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_telegrafs_id_prepare(telegraf_id, telegraf_plugin_request, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/telegrafs/{telegrafID}', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Telegraf', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _put_telegrafs_id_prepare(self, telegraf_id, telegraf_plugin_request, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['telegraf_id', 'telegraf_plugin_request', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('put_telegrafs_id', all_params, local_var_params) - # verify the required parameter 'telegraf_id' is set - if ('telegraf_id' not in local_var_params or - local_var_params['telegraf_id'] is None): - raise ValueError("Missing the required parameter `telegraf_id` when calling `put_telegrafs_id`") # noqa: E501 - # verify the required parameter 'telegraf_plugin_request' is set - if ('telegraf_plugin_request' not in local_var_params or - local_var_params['telegraf_plugin_request'] is None): - raise ValueError("Missing the required parameter `telegraf_plugin_request` when calling `put_telegrafs_id`") # noqa: E501 - - path_params = {} - if 'telegraf_id' in local_var_params: - path_params['telegrafID'] = local_var_params['telegraf_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'telegraf_plugin_request' in local_var_params: - body_params = local_var_params['telegraf_plugin_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/templates_service.py b/frogpilot/third_party/influxdb_client/service/templates_service.py deleted file mode 100644 index 92780a0ca..000000000 --- a/frogpilot/third_party/influxdb_client/service/templates_service.py +++ /dev/null @@ -1,959 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class TemplatesService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """TemplatesService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def apply_template(self, template_apply, **kwargs): # noqa: E501,D401,D403 - """Apply or dry-run a template. - - Applies a template to create or update a [stack](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/) of InfluxDB [resources](https://docs.influxdata.com/influxdb/latest/reference/cli/influx/export/all/#resources). The response contains the diff of changes and the stack ID. Use this endpoint to install an InfluxDB template to an organization. Provide template URLs or template objects in your request. To customize which template resources are installed, use the `actions` parameter. By default, when you apply a template, InfluxDB installs the template to create and update stack resources and then generates a diff of the changes. If you pass `dryRun: true` in the request body, InfluxDB validates the template and generates the resource diff, but doesn’t make any changes to your instance. #### Custom values for templates - Some templates may contain [environment references](https://docs.influxdata.com/influxdb/latest/influxdb-templates/create/#include-user-definable-resource-names) for custom metadata. To provide custom values for environment references, pass the _`envRefs`_ property in the request body. For more information and examples, see how to [define environment references](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/#define-environment-references). - Some templates may contain queries that use [secrets](https://docs.influxdata.com/influxdb/latest/security/secrets/). To provide custom secret values, pass the _`secrets`_ property in the request body. Don't expose secret values in templates. For more information, see [how to pass secrets when installing a template](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/#pass-secrets-when-installing-a-template). #### Required permissions - `write` permissions for resource types in the template. #### Rate limits (with InfluxDB Cloud) - Adjustable service quotas apply. For more information, see [limits and adjustable quotas](https://docs.influxdata.com/influxdb/cloud/account-management/limits/). #### Related guides - [Use templates](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/) - [Stacks](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.apply_template(template_apply, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param TemplateApply template_apply: Parameters for applying templates. (required) - :return: TemplateSummary - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.apply_template_with_http_info(template_apply, **kwargs) # noqa: E501 - else: - (data) = self.apply_template_with_http_info(template_apply, **kwargs) # noqa: E501 - return data - - def apply_template_with_http_info(self, template_apply, **kwargs): # noqa: E501,D401,D403 - """Apply or dry-run a template. - - Applies a template to create or update a [stack](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/) of InfluxDB [resources](https://docs.influxdata.com/influxdb/latest/reference/cli/influx/export/all/#resources). The response contains the diff of changes and the stack ID. Use this endpoint to install an InfluxDB template to an organization. Provide template URLs or template objects in your request. To customize which template resources are installed, use the `actions` parameter. By default, when you apply a template, InfluxDB installs the template to create and update stack resources and then generates a diff of the changes. If you pass `dryRun: true` in the request body, InfluxDB validates the template and generates the resource diff, but doesn’t make any changes to your instance. #### Custom values for templates - Some templates may contain [environment references](https://docs.influxdata.com/influxdb/latest/influxdb-templates/create/#include-user-definable-resource-names) for custom metadata. To provide custom values for environment references, pass the _`envRefs`_ property in the request body. For more information and examples, see how to [define environment references](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/#define-environment-references). - Some templates may contain queries that use [secrets](https://docs.influxdata.com/influxdb/latest/security/secrets/). To provide custom secret values, pass the _`secrets`_ property in the request body. Don't expose secret values in templates. For more information, see [how to pass secrets when installing a template](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/#pass-secrets-when-installing-a-template). #### Required permissions - `write` permissions for resource types in the template. #### Rate limits (with InfluxDB Cloud) - Adjustable service quotas apply. For more information, see [limits and adjustable quotas](https://docs.influxdata.com/influxdb/cloud/account-management/limits/). #### Related guides - [Use templates](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/) - [Stacks](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.apply_template_with_http_info(template_apply, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param TemplateApply template_apply: Parameters for applying templates. (required) - :return: TemplateSummary - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._apply_template_prepare(template_apply, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/templates/apply', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='TemplateSummary', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def apply_template_async(self, template_apply, **kwargs): # noqa: E501,D401,D403 - """Apply or dry-run a template. - - Applies a template to create or update a [stack](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/) of InfluxDB [resources](https://docs.influxdata.com/influxdb/latest/reference/cli/influx/export/all/#resources). The response contains the diff of changes and the stack ID. Use this endpoint to install an InfluxDB template to an organization. Provide template URLs or template objects in your request. To customize which template resources are installed, use the `actions` parameter. By default, when you apply a template, InfluxDB installs the template to create and update stack resources and then generates a diff of the changes. If you pass `dryRun: true` in the request body, InfluxDB validates the template and generates the resource diff, but doesn’t make any changes to your instance. #### Custom values for templates - Some templates may contain [environment references](https://docs.influxdata.com/influxdb/latest/influxdb-templates/create/#include-user-definable-resource-names) for custom metadata. To provide custom values for environment references, pass the _`envRefs`_ property in the request body. For more information and examples, see how to [define environment references](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/#define-environment-references). - Some templates may contain queries that use [secrets](https://docs.influxdata.com/influxdb/latest/security/secrets/). To provide custom secret values, pass the _`secrets`_ property in the request body. Don't expose secret values in templates. For more information, see [how to pass secrets when installing a template](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/#pass-secrets-when-installing-a-template). #### Required permissions - `write` permissions for resource types in the template. #### Rate limits (with InfluxDB Cloud) - Adjustable service quotas apply. For more information, see [limits and adjustable quotas](https://docs.influxdata.com/influxdb/cloud/account-management/limits/). #### Related guides - [Use templates](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/) - [Stacks](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param TemplateApply template_apply: Parameters for applying templates. (required) - :return: TemplateSummary - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._apply_template_prepare(template_apply, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/templates/apply', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='TemplateSummary', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _apply_template_prepare(self, template_apply, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['template_apply'] # noqa: E501 - self._check_operation_params('apply_template', all_params, local_var_params) - # verify the required parameter 'template_apply' is set - if ('template_apply' not in local_var_params or - local_var_params['template_apply'] is None): - raise ValueError("Missing the required parameter `template_apply` when calling `apply_template`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - - body_params = None - if 'template_apply' in local_var_params: - body_params = local_var_params['template_apply'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json', 'application/x-jsonnet', 'text/yml']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def create_stack(self, **kwargs): # noqa: E501,D401,D403 - """Create a stack. - - Creates or initializes a stack. Use this endpoint to _manually_ initialize a new stack with the following optional information: - Stack name - Stack description - URLs for template manifest files To automatically create a stack when applying templates, use the [/api/v2/templates/apply endpoint](#operation/ApplyTemplate). #### Required permissions - `write` permission for the organization #### Related guides - [Initialize an InfluxDB stack](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/init/). - [Use InfluxDB templates](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/#apply-templates-to-an-influxdb-instance). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.create_stack(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PostStackRequest post_stack_request: - :return: Stack - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.create_stack_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.create_stack_with_http_info(**kwargs) # noqa: E501 - return data - - def create_stack_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Create a stack. - - Creates or initializes a stack. Use this endpoint to _manually_ initialize a new stack with the following optional information: - Stack name - Stack description - URLs for template manifest files To automatically create a stack when applying templates, use the [/api/v2/templates/apply endpoint](#operation/ApplyTemplate). #### Required permissions - `write` permission for the organization #### Related guides - [Initialize an InfluxDB stack](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/init/). - [Use InfluxDB templates](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/#apply-templates-to-an-influxdb-instance). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.create_stack_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PostStackRequest post_stack_request: - :return: Stack - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._create_stack_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/stacks', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Stack', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def create_stack_async(self, **kwargs): # noqa: E501,D401,D403 - """Create a stack. - - Creates or initializes a stack. Use this endpoint to _manually_ initialize a new stack with the following optional information: - Stack name - Stack description - URLs for template manifest files To automatically create a stack when applying templates, use the [/api/v2/templates/apply endpoint](#operation/ApplyTemplate). #### Required permissions - `write` permission for the organization #### Related guides - [Initialize an InfluxDB stack](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/init/). - [Use InfluxDB templates](https://docs.influxdata.com/influxdb/latest/influxdb-templates/use/#apply-templates-to-an-influxdb-instance). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param PostStackRequest post_stack_request: - :return: Stack - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._create_stack_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/stacks', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Stack', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _create_stack_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['post_stack_request'] # noqa: E501 - self._check_operation_params('create_stack', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - - body_params = None - if 'post_stack_request' in local_var_params: - body_params = local_var_params['post_stack_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_stack(self, stack_id, org_id, **kwargs): # noqa: E501,D401,D403 - """Delete a stack and associated resources. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_stack(stack_id, org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str stack_id: The identifier of the stack. (required) - :param str org_id: The identifier of the organization. (required) - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_stack_with_http_info(stack_id, org_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_stack_with_http_info(stack_id, org_id, **kwargs) # noqa: E501 - return data - - def delete_stack_with_http_info(self, stack_id, org_id, **kwargs): # noqa: E501,D401,D403 - """Delete a stack and associated resources. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_stack_with_http_info(stack_id, org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str stack_id: The identifier of the stack. (required) - :param str org_id: The identifier of the organization. (required) - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_stack_prepare(stack_id, org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/stacks/{stack_id}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_stack_async(self, stack_id, org_id, **kwargs): # noqa: E501,D401,D403 - """Delete a stack and associated resources. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str stack_id: The identifier of the stack. (required) - :param str org_id: The identifier of the organization. (required) - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_stack_prepare(stack_id, org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/stacks/{stack_id}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_stack_prepare(self, stack_id, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['stack_id', 'org_id'] # noqa: E501 - self._check_operation_params('delete_stack', all_params, local_var_params) - # verify the required parameter 'stack_id' is set - if ('stack_id' not in local_var_params or - local_var_params['stack_id'] is None): - raise ValueError("Missing the required parameter `stack_id` when calling `delete_stack`") # noqa: E501 - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `delete_stack`") # noqa: E501 - - path_params = {} - if 'stack_id' in local_var_params: - path_params['stack_id'] = local_var_params['stack_id'] # noqa: E501 - - query_params = [] - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - - header_params = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def export_template(self, **kwargs): # noqa: E501,D401,D403 - """Export a new template. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.export_template(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param TemplateExportByID template_export_by_id: Export resources as an InfluxDB template. - :return: list[object] - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.export_template_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.export_template_with_http_info(**kwargs) # noqa: E501 - return data - - def export_template_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Export a new template. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.export_template_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param TemplateExportByID template_export_by_id: Export resources as an InfluxDB template. - :return: list[object] - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._export_template_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/templates/export', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='list[object]', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def export_template_async(self, **kwargs): # noqa: E501,D401,D403 - """Export a new template. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param TemplateExportByID template_export_by_id: Export resources as an InfluxDB template. - :return: list[object] - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._export_template_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/templates/export', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='list[object]', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _export_template_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['template_export_by_id'] # noqa: E501 - self._check_operation_params('export_template', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - - body_params = None - if 'template_export_by_id' in local_var_params: - body_params = local_var_params['template_export_by_id'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json', 'application/x-yaml']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def list_stacks(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List installed stacks. - - Lists installed InfluxDB stacks. To limit stacks in the response, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all installed stacks for the organization. #### Related guides - [View InfluxDB stacks](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.list_stacks(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: An organization ID. Only returns stacks owned by the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). #### InfluxDB Cloud - Doesn't require this parameter; InfluxDB only returns resources allowed by the API token. (required) - :param str name: A stack name. Finds stack `events` with this name and returns the stacks. Repeatable. To filter for more than one stack name, repeat this parameter with each name--for example: - `INFLUX_URL/api/v2/stacks?&orgID=INFLUX_ORG_ID&name=project-stack-0&name=project-stack-1` - :param str stack_id: A stack ID. Only returns the specified stack. Repeatable. To filter for more than one stack ID, repeat this parameter with each ID--for example: - `INFLUX_URL/api/v2/stacks?&orgID=INFLUX_ORG_ID&stackID=09bd87cd33be3000&stackID=09bef35081fe3000` - :return: ListStacksResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.list_stacks_with_http_info(org_id, **kwargs) # noqa: E501 - else: - (data) = self.list_stacks_with_http_info(org_id, **kwargs) # noqa: E501 - return data - - def list_stacks_with_http_info(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List installed stacks. - - Lists installed InfluxDB stacks. To limit stacks in the response, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all installed stacks for the organization. #### Related guides - [View InfluxDB stacks](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.list_stacks_with_http_info(org_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org_id: An organization ID. Only returns stacks owned by the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). #### InfluxDB Cloud - Doesn't require this parameter; InfluxDB only returns resources allowed by the API token. (required) - :param str name: A stack name. Finds stack `events` with this name and returns the stacks. Repeatable. To filter for more than one stack name, repeat this parameter with each name--for example: - `INFLUX_URL/api/v2/stacks?&orgID=INFLUX_ORG_ID&name=project-stack-0&name=project-stack-1` - :param str stack_id: A stack ID. Only returns the specified stack. Repeatable. To filter for more than one stack ID, repeat this parameter with each ID--for example: - `INFLUX_URL/api/v2/stacks?&orgID=INFLUX_ORG_ID&stackID=09bd87cd33be3000&stackID=09bef35081fe3000` - :return: ListStacksResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._list_stacks_prepare(org_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/stacks', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ListStacksResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def list_stacks_async(self, org_id, **kwargs): # noqa: E501,D401,D403 - """List installed stacks. - - Lists installed InfluxDB stacks. To limit stacks in the response, pass query parameters in your request. If no query parameters are passed, InfluxDB returns all installed stacks for the organization. #### Related guides - [View InfluxDB stacks](https://docs.influxdata.com/influxdb/latest/influxdb-templates/stacks/). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org_id: An organization ID. Only returns stacks owned by the specified [organization](https://docs.influxdata.com/influxdb/latest/reference/glossary/#organization). #### InfluxDB Cloud - Doesn't require this parameter; InfluxDB only returns resources allowed by the API token. (required) - :param str name: A stack name. Finds stack `events` with this name and returns the stacks. Repeatable. To filter for more than one stack name, repeat this parameter with each name--for example: - `INFLUX_URL/api/v2/stacks?&orgID=INFLUX_ORG_ID&name=project-stack-0&name=project-stack-1` - :param str stack_id: A stack ID. Only returns the specified stack. Repeatable. To filter for more than one stack ID, repeat this parameter with each ID--for example: - `INFLUX_URL/api/v2/stacks?&orgID=INFLUX_ORG_ID&stackID=09bd87cd33be3000&stackID=09bef35081fe3000` - :return: ListStacksResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._list_stacks_prepare(org_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/stacks', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='ListStacksResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _list_stacks_prepare(self, org_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org_id', 'name', 'stack_id'] # noqa: E501 - self._check_operation_params('list_stacks', all_params, local_var_params) - # verify the required parameter 'org_id' is set - if ('org_id' not in local_var_params or - local_var_params['org_id'] is None): - raise ValueError("Missing the required parameter `org_id` when calling `list_stacks`") # noqa: E501 - - path_params = {} - - query_params = [] - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'name' in local_var_params: - query_params.append(('name', local_var_params['name'])) # noqa: E501 - if 'stack_id' in local_var_params: - query_params.append(('stackID', local_var_params['stack_id'])) # noqa: E501 - - header_params = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def read_stack(self, stack_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a stack. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.read_stack(stack_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str stack_id: The identifier of the stack. (required) - :return: Stack - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.read_stack_with_http_info(stack_id, **kwargs) # noqa: E501 - else: - (data) = self.read_stack_with_http_info(stack_id, **kwargs) # noqa: E501 - return data - - def read_stack_with_http_info(self, stack_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a stack. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.read_stack_with_http_info(stack_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str stack_id: The identifier of the stack. (required) - :return: Stack - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._read_stack_prepare(stack_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/stacks/{stack_id}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Stack', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def read_stack_async(self, stack_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a stack. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str stack_id: The identifier of the stack. (required) - :return: Stack - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._read_stack_prepare(stack_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/stacks/{stack_id}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Stack', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _read_stack_prepare(self, stack_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['stack_id'] # noqa: E501 - self._check_operation_params('read_stack', all_params, local_var_params) - # verify the required parameter 'stack_id' is set - if ('stack_id' not in local_var_params or - local_var_params['stack_id'] is None): - raise ValueError("Missing the required parameter `stack_id` when calling `read_stack`") # noqa: E501 - - path_params = {} - if 'stack_id' in local_var_params: - path_params['stack_id'] = local_var_params['stack_id'] # noqa: E501 - - query_params = [] - - header_params = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def uninstall_stack(self, stack_id, **kwargs): # noqa: E501,D401,D403 - """Uninstall a stack. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.uninstall_stack(stack_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str stack_id: The identifier of the stack. (required) - :return: Stack - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.uninstall_stack_with_http_info(stack_id, **kwargs) # noqa: E501 - else: - (data) = self.uninstall_stack_with_http_info(stack_id, **kwargs) # noqa: E501 - return data - - def uninstall_stack_with_http_info(self, stack_id, **kwargs): # noqa: E501,D401,D403 - """Uninstall a stack. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.uninstall_stack_with_http_info(stack_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str stack_id: The identifier of the stack. (required) - :return: Stack - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._uninstall_stack_prepare(stack_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/stacks/{stack_id}/uninstall', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Stack', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def uninstall_stack_async(self, stack_id, **kwargs): # noqa: E501,D401,D403 - """Uninstall a stack. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str stack_id: The identifier of the stack. (required) - :return: Stack - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._uninstall_stack_prepare(stack_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/stacks/{stack_id}/uninstall', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Stack', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _uninstall_stack_prepare(self, stack_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['stack_id'] # noqa: E501 - self._check_operation_params('uninstall_stack', all_params, local_var_params) - # verify the required parameter 'stack_id' is set - if ('stack_id' not in local_var_params or - local_var_params['stack_id'] is None): - raise ValueError("Missing the required parameter `stack_id` when calling `uninstall_stack`") # noqa: E501 - - path_params = {} - if 'stack_id' in local_var_params: - path_params['stack_id'] = local_var_params['stack_id'] # noqa: E501 - - query_params = [] - - header_params = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def update_stack(self, stack_id, **kwargs): # noqa: E501,D401,D403 - """Update a stack. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.update_stack(stack_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str stack_id: The identifier of the stack. (required) - :param PatchStackRequest patch_stack_request: - :return: Stack - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.update_stack_with_http_info(stack_id, **kwargs) # noqa: E501 - else: - (data) = self.update_stack_with_http_info(stack_id, **kwargs) # noqa: E501 - return data - - def update_stack_with_http_info(self, stack_id, **kwargs): # noqa: E501,D401,D403 - """Update a stack. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.update_stack_with_http_info(stack_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str stack_id: The identifier of the stack. (required) - :param PatchStackRequest patch_stack_request: - :return: Stack - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._update_stack_prepare(stack_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/stacks/{stack_id}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Stack', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def update_stack_async(self, stack_id, **kwargs): # noqa: E501,D401,D403 - """Update a stack. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str stack_id: The identifier of the stack. (required) - :param PatchStackRequest patch_stack_request: - :return: Stack - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._update_stack_prepare(stack_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/stacks/{stack_id}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Stack', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _update_stack_prepare(self, stack_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['stack_id', 'patch_stack_request'] # noqa: E501 - self._check_operation_params('update_stack', all_params, local_var_params) - # verify the required parameter 'stack_id' is set - if ('stack_id' not in local_var_params or - local_var_params['stack_id'] is None): - raise ValueError("Missing the required parameter `stack_id` when calling `update_stack`") # noqa: E501 - - path_params = {} - if 'stack_id' in local_var_params: - path_params['stack_id'] = local_var_params['stack_id'] # noqa: E501 - - query_params = [] - - header_params = {} - - body_params = None - if 'patch_stack_request' in local_var_params: - body_params = local_var_params['patch_stack_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/users_service.py b/frogpilot/third_party/influxdb_client/service/users_service.py deleted file mode 100644 index b53232446..000000000 --- a/frogpilot/third_party/influxdb_client/service/users_service.py +++ /dev/null @@ -1,1168 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class UsersService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """UsersService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_users_id(self, user_id, **kwargs): # noqa: E501,D401,D403 - """Delete a user. - - Deletes a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). #### Required permissions | Action | Permission required | |:------------|:-----------------------------------------------| | Delete a user | `write-users` or `write-user USER_ID` | *`USER_ID`* is the ID of the user that you want to delete. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/organizations/users/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_users_id(user_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: A user ID. Specifies the [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_users_id_with_http_info(user_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_users_id_with_http_info(user_id, **kwargs) # noqa: E501 - return data - - def delete_users_id_with_http_info(self, user_id, **kwargs): # noqa: E501,D401,D403 - """Delete a user. - - Deletes a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). #### Required permissions | Action | Permission required | |:------------|:-----------------------------------------------| | Delete a user | `write-users` or `write-user USER_ID` | *`USER_ID`* is the ID of the user that you want to delete. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/organizations/users/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_users_id_with_http_info(user_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: A user ID. Specifies the [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_users_id_prepare(user_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/users/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_users_id_async(self, user_id, **kwargs): # noqa: E501,D401,D403 - """Delete a user. - - Deletes a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). #### Required permissions | Action | Permission required | |:------------|:-----------------------------------------------| | Delete a user | `write-users` or `write-user USER_ID` | *`USER_ID`* is the ID of the user that you want to delete. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/organizations/users/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: A user ID. Specifies the [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_users_id_prepare(user_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/users/{userID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_users_id_prepare(self, user_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_users_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `delete_users_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_me(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve the currently authenticated user. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_me(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: UserResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_me_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_me_with_http_info(**kwargs) # noqa: E501 - return data - - def get_me_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve the currently authenticated user. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_me_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: UserResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_me_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/me', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='UserResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_me_async(self, **kwargs): # noqa: E501,D401,D403 - """Retrieve the currently authenticated user. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :return: UserResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_me_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/me', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='UserResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_me_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span'] # noqa: E501 - self._check_operation_params('get_me', all_params, local_var_params) - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_users(self, **kwargs): # noqa: E501,D401,D403 - """List users. - - Lists [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). Default limit is `20`. To limit which users are returned, pass query parameters in your request. #### Required permissions for InfluxDB OSS | Action | Permission required | Restriction | |:-------|:--------------------|:------------| | List all users | _[Operator token](https://docs.influxdata.com/influxdb/latest/security/tokens/#operator-token)_ | | | List a specific user | `read-users` or `read-user USER_ID` | | *`USER_ID`* is the ID of the user that you want to retrieve. #### Related guides - [View users](https://docs.influxdata.com/influxdb/latest/users/view-users/). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_users(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param str after: A resource ID to seek from. Returns records created after the specified record; results don't include the specified record. Use `after` instead of the `offset` parameter. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param str name: A user name. Only lists the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). - :param str id: A user ID. Only lists the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). - :return: Users - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_users_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_users_with_http_info(**kwargs) # noqa: E501 - return data - - def get_users_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List users. - - Lists [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). Default limit is `20`. To limit which users are returned, pass query parameters in your request. #### Required permissions for InfluxDB OSS | Action | Permission required | Restriction | |:-------|:--------------------|:------------| | List all users | _[Operator token](https://docs.influxdata.com/influxdb/latest/security/tokens/#operator-token)_ | | | List a specific user | `read-users` or `read-user USER_ID` | | *`USER_ID`* is the ID of the user that you want to retrieve. #### Related guides - [View users](https://docs.influxdata.com/influxdb/latest/users/view-users/). - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_users_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param str after: A resource ID to seek from. Returns records created after the specified record; results don't include the specified record. Use `after` instead of the `offset` parameter. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param str name: A user name. Only lists the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). - :param str id: A user ID. Only lists the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). - :return: Users - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_users_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/users', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Users', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_users_async(self, **kwargs): # noqa: E501,D401,D403 - """List users. - - Lists [users](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). Default limit is `20`. To limit which users are returned, pass query parameters in your request. #### Required permissions for InfluxDB OSS | Action | Permission required | Restriction | |:-------|:--------------------|:------------| | List all users | _[Operator token](https://docs.influxdata.com/influxdb/latest/security/tokens/#operator-token)_ | | | List a specific user | `read-users` or `read-user USER_ID` | | *`USER_ID`* is the ID of the user that you want to retrieve. #### Related guides - [View users](https://docs.influxdata.com/influxdb/latest/users/view-users/). - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param int offset: The offset for pagination. The number of records to skip. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param int limit: Limits the number of records returned. Default is `20`. - :param str after: A resource ID to seek from. Returns records created after the specified record; results don't include the specified record. Use `after` instead of the `offset` parameter. For more information about pagination parameters, see [Pagination](https://docs.influxdata.com/influxdb/latest/api/#tag/Pagination). - :param str name: A user name. Only lists the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). - :param str id: A user ID. Only lists the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). - :return: Users - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_users_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/users', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Users', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_users_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'offset', 'limit', 'after', 'name', 'id'] # noqa: E501 - self._check_operation_params('get_users', all_params, local_var_params) - - if 'offset' in local_var_params and local_var_params['offset'] < 0: # noqa: E501 - raise ValueError("Invalid value for parameter `offset` when calling `get_users`, must be a value greater than or equal to `0`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] > 100: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_users`, must be a value less than or equal to `100`") # noqa: E501 - if 'limit' in local_var_params and local_var_params['limit'] < 1: # noqa: E501 - raise ValueError("Invalid value for parameter `limit` when calling `get_users`, must be a value greater than or equal to `1`") # noqa: E501 - path_params = {} - - query_params = [] - if 'offset' in local_var_params: - query_params.append(('offset', local_var_params['offset'])) # noqa: E501 - if 'limit' in local_var_params: - query_params.append(('limit', local_var_params['limit'])) # noqa: E501 - if 'after' in local_var_params: - query_params.append(('after', local_var_params['after'])) # noqa: E501 - if 'name' in local_var_params: - query_params.append(('name', local_var_params['name'])) # noqa: E501 - if 'id' in local_var_params: - query_params.append(('id', local_var_params['id'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_users_id(self, user_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a user. - - Retrieves a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/organizations/users/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_users_id(user_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: A user ID. Retrieves the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). (required) - :param str zap_trace_span: OpenTracing span context - :return: UserResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_users_id_with_http_info(user_id, **kwargs) # noqa: E501 - else: - (data) = self.get_users_id_with_http_info(user_id, **kwargs) # noqa: E501 - return data - - def get_users_id_with_http_info(self, user_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a user. - - Retrieves a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/organizations/users/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_users_id_with_http_info(user_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: A user ID. Retrieves the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). (required) - :param str zap_trace_span: OpenTracing span context - :return: UserResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_users_id_prepare(user_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/users/{userID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='UserResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_users_id_async(self, user_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a user. - - Retrieves a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/organizations/users/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: A user ID. Retrieves the specified [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). (required) - :param str zap_trace_span: OpenTracing span context - :return: UserResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_users_id_prepare(user_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/users/{userID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='UserResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_users_id_prepare(self, user_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_users_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `get_users_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_users_id(self, user_id, user, **kwargs): # noqa: E501,D401,D403 - """Update a user. - - Updates a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) and returns the user. #### Required permissions | Action | Permission required | |:------------|:-----------------------------------------------| | Update a user | `write-users` or `write-user USER_ID` | *`USER_ID`* is the ID of the user that you want to update. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/organizations/users/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_users_id(user_id, user, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: A user ID. Specifies the [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) to update. (required) - :param User user: In the request body, provide the user properties to update. (required) - :param str zap_trace_span: OpenTracing span context - :return: UserResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_users_id_with_http_info(user_id, user, **kwargs) # noqa: E501 - else: - (data) = self.patch_users_id_with_http_info(user_id, user, **kwargs) # noqa: E501 - return data - - def patch_users_id_with_http_info(self, user_id, user, **kwargs): # noqa: E501,D401,D403 - """Update a user. - - Updates a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) and returns the user. #### Required permissions | Action | Permission required | |:------------|:-----------------------------------------------| | Update a user | `write-users` or `write-user USER_ID` | *`USER_ID`* is the ID of the user that you want to update. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/organizations/users/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_users_id_with_http_info(user_id, user, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: A user ID. Specifies the [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) to update. (required) - :param User user: In the request body, provide the user properties to update. (required) - :param str zap_trace_span: OpenTracing span context - :return: UserResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_users_id_prepare(user_id, user, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/users/{userID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='UserResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_users_id_async(self, user_id, user, **kwargs): # noqa: E501,D401,D403 - """Update a user. - - Updates a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) and returns the user. #### Required permissions | Action | Permission required | |:------------|:-----------------------------------------------| | Update a user | `write-users` or `write-user USER_ID` | *`USER_ID`* is the ID of the user that you want to update. #### Related guides - [Manage users](https://docs.influxdata.com/influxdb/latest/organizations/users/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: A user ID. Specifies the [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) to update. (required) - :param User user: In the request body, provide the user properties to update. (required) - :param str zap_trace_span: OpenTracing span context - :return: UserResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_users_id_prepare(user_id, user, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/users/{userID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='UserResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_users_id_prepare(self, user_id, user, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'user', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_users_id', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `patch_users_id`") # noqa: E501 - # verify the required parameter 'user' is set - if ('user' not in local_var_params or - local_var_params['user'] is None): - raise ValueError("Missing the required parameter `user` when calling `patch_users_id`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'user' in local_var_params: - body_params = local_var_params['user'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_users(self, user, **kwargs): # noqa: E501,D401,D403 - """Create a user. - - Creates a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) that can access InfluxDB. Returns the user. Use this endpoint to create a user that can sign in to start a user session through one of the following interfaces: - InfluxDB UI - `/api/v2/signin` InfluxDB API endpoint - InfluxDB CLI This endpoint represents the first two steps in a four-step process to allow a user to authenticate with a username and password, and then access data in an organization: 1. Create a user: send a `POST` request to `POST /api/v2/users`. The `name` property is required. 2. Extract the user ID (`id` property) value from the API response for _step 1_. 3. Create an authorization (and API token) for the user: send a `POST` request to [`POST /api/v2/authorizations`](#operation/PostAuthorizations), passing the user ID (`id`) from _step 2_. 4. Create a password for the user: send a `POST` request to [`POST /api/v2/users/USER_ID/password`](#operation/PostUsersIDPassword), passing the user ID from _step 2_. #### Required permissions | Action | Permission required | Restriction | |:-------|:--------------------|:------------| | Create a user | _[Operator token](https://docs.influxdata.com/influxdb/latest/security/tokens/#operator-token)_ | | #### Related guides - [Create a user](https://docs.influxdata.com/influxdb/latest/users/create-user/) - [Create an API token scoped to a user](https://docs.influxdata.com/influxdb/latest/security/tokens/create-token/#create-a-token-scoped-to-a-user) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_users(user, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param User user: The user to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: UserResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_users_with_http_info(user, **kwargs) # noqa: E501 - else: - (data) = self.post_users_with_http_info(user, **kwargs) # noqa: E501 - return data - - def post_users_with_http_info(self, user, **kwargs): # noqa: E501,D401,D403 - """Create a user. - - Creates a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) that can access InfluxDB. Returns the user. Use this endpoint to create a user that can sign in to start a user session through one of the following interfaces: - InfluxDB UI - `/api/v2/signin` InfluxDB API endpoint - InfluxDB CLI This endpoint represents the first two steps in a four-step process to allow a user to authenticate with a username and password, and then access data in an organization: 1. Create a user: send a `POST` request to `POST /api/v2/users`. The `name` property is required. 2. Extract the user ID (`id` property) value from the API response for _step 1_. 3. Create an authorization (and API token) for the user: send a `POST` request to [`POST /api/v2/authorizations`](#operation/PostAuthorizations), passing the user ID (`id`) from _step 2_. 4. Create a password for the user: send a `POST` request to [`POST /api/v2/users/USER_ID/password`](#operation/PostUsersIDPassword), passing the user ID from _step 2_. #### Required permissions | Action | Permission required | Restriction | |:-------|:--------------------|:------------| | Create a user | _[Operator token](https://docs.influxdata.com/influxdb/latest/security/tokens/#operator-token)_ | | #### Related guides - [Create a user](https://docs.influxdata.com/influxdb/latest/users/create-user/) - [Create an API token scoped to a user](https://docs.influxdata.com/influxdb/latest/security/tokens/create-token/#create-a-token-scoped-to-a-user) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_users_with_http_info(user, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param User user: The user to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: UserResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_users_prepare(user, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/users', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='UserResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_users_async(self, user, **kwargs): # noqa: E501,D401,D403 - """Create a user. - - Creates a [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user) that can access InfluxDB. Returns the user. Use this endpoint to create a user that can sign in to start a user session through one of the following interfaces: - InfluxDB UI - `/api/v2/signin` InfluxDB API endpoint - InfluxDB CLI This endpoint represents the first two steps in a four-step process to allow a user to authenticate with a username and password, and then access data in an organization: 1. Create a user: send a `POST` request to `POST /api/v2/users`. The `name` property is required. 2. Extract the user ID (`id` property) value from the API response for _step 1_. 3. Create an authorization (and API token) for the user: send a `POST` request to [`POST /api/v2/authorizations`](#operation/PostAuthorizations), passing the user ID (`id`) from _step 2_. 4. Create a password for the user: send a `POST` request to [`POST /api/v2/users/USER_ID/password`](#operation/PostUsersIDPassword), passing the user ID from _step 2_. #### Required permissions | Action | Permission required | Restriction | |:-------|:--------------------|:------------| | Create a user | _[Operator token](https://docs.influxdata.com/influxdb/latest/security/tokens/#operator-token)_ | | #### Related guides - [Create a user](https://docs.influxdata.com/influxdb/latest/users/create-user/) - [Create an API token scoped to a user](https://docs.influxdata.com/influxdb/latest/security/tokens/create-token/#create-a-token-scoped-to-a-user) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param User user: The user to create. (required) - :param str zap_trace_span: OpenTracing span context - :return: UserResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_users_prepare(user, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/users', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='UserResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_users_prepare(self, user, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_users', all_params, local_var_params) - # verify the required parameter 'user' is set - if ('user' not in local_var_params or - local_var_params['user'] is None): - raise ValueError("Missing the required parameter `user` when calling `post_users`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'user' in local_var_params: - body_params = local_var_params['user'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_users_id_password(self, user_id, password_reset_body, **kwargs): # noqa: E501,D401,D403 - """Update a password. - - Updates a user password. #### InfluxDB Cloud - Doesn't allow you to manage user passwords through the API. Use the InfluxDB Cloud user interface (UI) to update a password. #### Related guides - [InfluxDB Cloud - Change your password](https://docs.influxdata.com/influxdb/cloud/account-management/change-password/) - [InfluxDB OSS - Change your password](https://docs.influxdata.com/influxdb/latest/users/change-password/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_users_id_password(user_id, password_reset_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the user to set the password for. (required) - :param PasswordResetBody password_reset_body: The new password to set for the user. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_users_id_password_with_http_info(user_id, password_reset_body, **kwargs) # noqa: E501 - else: - (data) = self.post_users_id_password_with_http_info(user_id, password_reset_body, **kwargs) # noqa: E501 - return data - - def post_users_id_password_with_http_info(self, user_id, password_reset_body, **kwargs): # noqa: E501,D401,D403 - """Update a password. - - Updates a user password. #### InfluxDB Cloud - Doesn't allow you to manage user passwords through the API. Use the InfluxDB Cloud user interface (UI) to update a password. #### Related guides - [InfluxDB Cloud - Change your password](https://docs.influxdata.com/influxdb/cloud/account-management/change-password/) - [InfluxDB OSS - Change your password](https://docs.influxdata.com/influxdb/latest/users/change-password/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_users_id_password_with_http_info(user_id, password_reset_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the user to set the password for. (required) - :param PasswordResetBody password_reset_body: The new password to set for the user. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_users_id_password_prepare(user_id, password_reset_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/users/{userID}/password', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_users_id_password_async(self, user_id, password_reset_body, **kwargs): # noqa: E501,D401,D403 - """Update a password. - - Updates a user password. #### InfluxDB Cloud - Doesn't allow you to manage user passwords through the API. Use the InfluxDB Cloud user interface (UI) to update a password. #### Related guides - [InfluxDB Cloud - Change your password](https://docs.influxdata.com/influxdb/cloud/account-management/change-password/) - [InfluxDB OSS - Change your password](https://docs.influxdata.com/influxdb/latest/users/change-password/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of the user to set the password for. (required) - :param PasswordResetBody password_reset_body: The new password to set for the user. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_users_id_password_prepare(user_id, password_reset_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/users/{userID}/password', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_users_id_password_prepare(self, user_id, password_reset_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'password_reset_body', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_users_id_password', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `post_users_id_password`") # noqa: E501 - # verify the required parameter 'password_reset_body' is set - if ('password_reset_body' not in local_var_params or - local_var_params['password_reset_body'] is None): - raise ValueError("Missing the required parameter `password_reset_body` when calling `post_users_id_password`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'password_reset_body' in local_var_params: - body_params = local_var_params['password_reset_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def put_me_password(self, password_reset_body, **kwargs): # noqa: E501,D401,D403 - """Update a password. - - Updates the password for the signed-in [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). This endpoint represents the third step in the following three-step process to let a user with a user session update their password: 1. Pass the user's [Basic authentication credentials](#section/Authentication/BasicAuthentication) to the `POST /api/v2/signin` endpoint to create a user session and generate a session cookie. 2. From the response in the first step, extract the session cookie (`Set-Cookie`) header. 3. Pass the following in a request to the `PUT /api/v2/me/password` endpoint: - The `Set-Cookie` header from the second step - The `Authorization Basic` header with the user's _Basic authentication_ credentials - `{"password": "NEW_PASSWORD"}` in the request body #### InfluxDB Cloud - Doesn't let you manage user passwords through the API. Use the InfluxDB Cloud user interface (UI) to update your password. #### Related endpoints - [Signin](#tag/Signin) - [Signout](#tag/Signout) - [Users](#tag/Users) #### Related guides - [InfluxDB Cloud - Change your password](https://docs.influxdata.com/influxdb/cloud/account-management/change-password/) - [InfluxDB OSS - Change your password](https://docs.influxdata.com/influxdb/latest/users/change-password/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_me_password(password_reset_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PasswordResetBody password_reset_body: The new password. (required) - :param str zap_trace_span: OpenTracing span context - :param str authorization: An auth credential for the Basic scheme - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.put_me_password_with_http_info(password_reset_body, **kwargs) # noqa: E501 - else: - (data) = self.put_me_password_with_http_info(password_reset_body, **kwargs) # noqa: E501 - return data - - def put_me_password_with_http_info(self, password_reset_body, **kwargs): # noqa: E501,D401,D403 - """Update a password. - - Updates the password for the signed-in [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). This endpoint represents the third step in the following three-step process to let a user with a user session update their password: 1. Pass the user's [Basic authentication credentials](#section/Authentication/BasicAuthentication) to the `POST /api/v2/signin` endpoint to create a user session and generate a session cookie. 2. From the response in the first step, extract the session cookie (`Set-Cookie`) header. 3. Pass the following in a request to the `PUT /api/v2/me/password` endpoint: - The `Set-Cookie` header from the second step - The `Authorization Basic` header with the user's _Basic authentication_ credentials - `{"password": "NEW_PASSWORD"}` in the request body #### InfluxDB Cloud - Doesn't let you manage user passwords through the API. Use the InfluxDB Cloud user interface (UI) to update your password. #### Related endpoints - [Signin](#tag/Signin) - [Signout](#tag/Signout) - [Users](#tag/Users) #### Related guides - [InfluxDB Cloud - Change your password](https://docs.influxdata.com/influxdb/cloud/account-management/change-password/) - [InfluxDB OSS - Change your password](https://docs.influxdata.com/influxdb/latest/users/change-password/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_me_password_with_http_info(password_reset_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param PasswordResetBody password_reset_body: The new password. (required) - :param str zap_trace_span: OpenTracing span context - :param str authorization: An auth credential for the Basic scheme - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_me_password_prepare(password_reset_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/me/password', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=['BasicAuthentication'], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def put_me_password_async(self, password_reset_body, **kwargs): # noqa: E501,D401,D403 - """Update a password. - - Updates the password for the signed-in [user](https://docs.influxdata.com/influxdb/latest/reference/glossary/#user). This endpoint represents the third step in the following three-step process to let a user with a user session update their password: 1. Pass the user's [Basic authentication credentials](#section/Authentication/BasicAuthentication) to the `POST /api/v2/signin` endpoint to create a user session and generate a session cookie. 2. From the response in the first step, extract the session cookie (`Set-Cookie`) header. 3. Pass the following in a request to the `PUT /api/v2/me/password` endpoint: - The `Set-Cookie` header from the second step - The `Authorization Basic` header with the user's _Basic authentication_ credentials - `{"password": "NEW_PASSWORD"}` in the request body #### InfluxDB Cloud - Doesn't let you manage user passwords through the API. Use the InfluxDB Cloud user interface (UI) to update your password. #### Related endpoints - [Signin](#tag/Signin) - [Signout](#tag/Signout) - [Users](#tag/Users) #### Related guides - [InfluxDB Cloud - Change your password](https://docs.influxdata.com/influxdb/cloud/account-management/change-password/) - [InfluxDB OSS - Change your password](https://docs.influxdata.com/influxdb/latest/users/change-password/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param PasswordResetBody password_reset_body: The new password. (required) - :param str zap_trace_span: OpenTracing span context - :param str authorization: An auth credential for the Basic scheme - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_me_password_prepare(password_reset_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/me/password', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=['BasicAuthentication'], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _put_me_password_prepare(self, password_reset_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['password_reset_body', 'zap_trace_span', 'authorization'] # noqa: E501 - self._check_operation_params('put_me_password', all_params, local_var_params) - # verify the required parameter 'password_reset_body' is set - if ('password_reset_body' not in local_var_params or - local_var_params['password_reset_body'] is None): - raise ValueError("Missing the required parameter `password_reset_body` when calling `put_me_password`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'authorization' in local_var_params: - header_params['Authorization'] = local_var_params['authorization'] # noqa: E501 - - body_params = None - if 'password_reset_body' in local_var_params: - body_params = local_var_params['password_reset_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def put_users_id_password(self, user_id, password_reset_body, **kwargs): # noqa: E501,D401,D403 - """Update a password. - - Updates a user password. Use this endpoint to let a user authenticate with [Basic authentication credentials](#section/Authentication/BasicAuthentication) and set a new password. #### InfluxDB Cloud - Doesn't allow you to manage user passwords through the API. Use the InfluxDB Cloud user interface (UI) to update a password. #### Related guides - [InfluxDB Cloud - Change your password](https://docs.influxdata.com/influxdb/cloud/account-management/change-password/) - [InfluxDB OSS - Change your password](https://docs.influxdata.com/influxdb/latest/users/change-password/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_users_id_password(user_id, password_reset_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the user to set the password for. (required) - :param PasswordResetBody password_reset_body: The new password to set for the user. (required) - :param str zap_trace_span: OpenTracing span context - :param str authorization: An auth credential for the Basic scheme - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.put_users_id_password_with_http_info(user_id, password_reset_body, **kwargs) # noqa: E501 - else: - (data) = self.put_users_id_password_with_http_info(user_id, password_reset_body, **kwargs) # noqa: E501 - return data - - def put_users_id_password_with_http_info(self, user_id, password_reset_body, **kwargs): # noqa: E501,D401,D403 - """Update a password. - - Updates a user password. Use this endpoint to let a user authenticate with [Basic authentication credentials](#section/Authentication/BasicAuthentication) and set a new password. #### InfluxDB Cloud - Doesn't allow you to manage user passwords through the API. Use the InfluxDB Cloud user interface (UI) to update a password. #### Related guides - [InfluxDB Cloud - Change your password](https://docs.influxdata.com/influxdb/cloud/account-management/change-password/) - [InfluxDB OSS - Change your password](https://docs.influxdata.com/influxdb/latest/users/change-password/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_users_id_password_with_http_info(user_id, password_reset_body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str user_id: The ID of the user to set the password for. (required) - :param PasswordResetBody password_reset_body: The new password to set for the user. (required) - :param str zap_trace_span: OpenTracing span context - :param str authorization: An auth credential for the Basic scheme - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_users_id_password_prepare(user_id, password_reset_body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/users/{userID}/password', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=['BasicAuthentication'], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def put_users_id_password_async(self, user_id, password_reset_body, **kwargs): # noqa: E501,D401,D403 - """Update a password. - - Updates a user password. Use this endpoint to let a user authenticate with [Basic authentication credentials](#section/Authentication/BasicAuthentication) and set a new password. #### InfluxDB Cloud - Doesn't allow you to manage user passwords through the API. Use the InfluxDB Cloud user interface (UI) to update a password. #### Related guides - [InfluxDB Cloud - Change your password](https://docs.influxdata.com/influxdb/cloud/account-management/change-password/) - [InfluxDB OSS - Change your password](https://docs.influxdata.com/influxdb/latest/users/change-password/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str user_id: The ID of the user to set the password for. (required) - :param PasswordResetBody password_reset_body: The new password to set for the user. (required) - :param str zap_trace_span: OpenTracing span context - :param str authorization: An auth credential for the Basic scheme - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_users_id_password_prepare(user_id, password_reset_body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/users/{userID}/password', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=['BasicAuthentication'], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _put_users_id_password_prepare(self, user_id, password_reset_body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['user_id', 'password_reset_body', 'zap_trace_span', 'authorization'] # noqa: E501 - self._check_operation_params('put_users_id_password', all_params, local_var_params) - # verify the required parameter 'user_id' is set - if ('user_id' not in local_var_params or - local_var_params['user_id'] is None): - raise ValueError("Missing the required parameter `user_id` when calling `put_users_id_password`") # noqa: E501 - # verify the required parameter 'password_reset_body' is set - if ('password_reset_body' not in local_var_params or - local_var_params['password_reset_body'] is None): - raise ValueError("Missing the required parameter `password_reset_body` when calling `put_users_id_password`") # noqa: E501 - - path_params = {} - if 'user_id' in local_var_params: - path_params['userID'] = local_var_params['user_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'authorization' in local_var_params: - header_params['Authorization'] = local_var_params['authorization'] # noqa: E501 - - body_params = None - if 'password_reset_body' in local_var_params: - body_params = local_var_params['password_reset_body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/variables_service.py b/frogpilot/third_party/influxdb_client/service/variables_service.py deleted file mode 100644 index 143bd7cc6..000000000 --- a/frogpilot/third_party/influxdb_client/service/variables_service.py +++ /dev/null @@ -1,1127 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class VariablesService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """VariablesService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def delete_variables_id(self, variable_id, **kwargs): # noqa: E501,D401,D403 - """Delete a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_variables_id(variable_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_variables_id_with_http_info(variable_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_variables_id_with_http_info(variable_id, **kwargs) # noqa: E501 - return data - - def delete_variables_id_with_http_info(self, variable_id, **kwargs): # noqa: E501,D401,D403 - """Delete a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_variables_id_with_http_info(variable_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_variables_id_prepare(variable_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/variables/{variableID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_variables_id_async(self, variable_id, **kwargs): # noqa: E501,D401,D403 - """Delete a variable. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_variables_id_prepare(variable_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/variables/{variableID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_variables_id_prepare(self, variable_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['variable_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_variables_id', all_params, local_var_params) - # verify the required parameter 'variable_id' is set - if ('variable_id' not in local_var_params or - local_var_params['variable_id'] is None): - raise ValueError("Missing the required parameter `variable_id` when calling `delete_variables_id`") # noqa: E501 - - path_params = {} - if 'variable_id' in local_var_params: - path_params['variableID'] = local_var_params['variable_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def delete_variables_id_labels_id(self, variable_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_variables_id_labels_id(variable_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param str label_id: The label ID to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.delete_variables_id_labels_id_with_http_info(variable_id, label_id, **kwargs) # noqa: E501 - else: - (data) = self.delete_variables_id_labels_id_with_http_info(variable_id, label_id, **kwargs) # noqa: E501 - return data - - def delete_variables_id_labels_id_with_http_info(self, variable_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.delete_variables_id_labels_id_with_http_info(variable_id, label_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param str label_id: The label ID to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_variables_id_labels_id_prepare(variable_id, label_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/variables/{variableID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def delete_variables_id_labels_id_async(self, variable_id, label_id, **kwargs): # noqa: E501,D401,D403 - """Delete a label from a variable. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param str label_id: The label ID to delete. (required) - :param str zap_trace_span: OpenTracing span context - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._delete_variables_id_labels_id_prepare(variable_id, label_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/variables/{variableID}/labels/{labelID}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _delete_variables_id_labels_id_prepare(self, variable_id, label_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['variable_id', 'label_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('delete_variables_id_labels_id', all_params, local_var_params) - # verify the required parameter 'variable_id' is set - if ('variable_id' not in local_var_params or - local_var_params['variable_id'] is None): - raise ValueError("Missing the required parameter `variable_id` when calling `delete_variables_id_labels_id`") # noqa: E501 - # verify the required parameter 'label_id' is set - if ('label_id' not in local_var_params or - local_var_params['label_id'] is None): - raise ValueError("Missing the required parameter `label_id` when calling `delete_variables_id_labels_id`") # noqa: E501 - - path_params = {} - if 'variable_id' in local_var_params: - path_params['variableID'] = local_var_params['variable_id'] # noqa: E501 - if 'label_id' in local_var_params: - path_params['labelID'] = local_var_params['label_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_variables(self, **kwargs): # noqa: E501,D401,D403 - """List all variables. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_variables(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org: The name of the organization. - :param str org_id: The organization ID. - :return: Variables - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_variables_with_http_info(**kwargs) # noqa: E501 - else: - (data) = self.get_variables_with_http_info(**kwargs) # noqa: E501 - return data - - def get_variables_with_http_info(self, **kwargs): # noqa: E501,D401,D403 - """List all variables. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_variables_with_http_info(async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org: The name of the organization. - :param str org_id: The organization ID. - :return: Variables - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_variables_prepare(**kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/variables', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Variables', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_variables_async(self, **kwargs): # noqa: E501,D401,D403 - """List all variables. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str zap_trace_span: OpenTracing span context - :param str org: The name of the organization. - :param str org_id: The organization ID. - :return: Variables - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_variables_prepare(**kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/variables', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Variables', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_variables_prepare(self, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['zap_trace_span', 'org', 'org_id'] # noqa: E501 - self._check_operation_params('get_variables', all_params, local_var_params) - - path_params = {} - - query_params = [] - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_variables_id(self, variable_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_variables_id(variable_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: Variable - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_variables_id_with_http_info(variable_id, **kwargs) # noqa: E501 - else: - (data) = self.get_variables_id_with_http_info(variable_id, **kwargs) # noqa: E501 - return data - - def get_variables_id_with_http_info(self, variable_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_variables_id_with_http_info(variable_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: Variable - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_variables_id_prepare(variable_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/variables/{variableID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Variable', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_variables_id_async(self, variable_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve a variable. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: Variable - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_variables_id_prepare(variable_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/variables/{variableID}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Variable', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_variables_id_prepare(self, variable_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['variable_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_variables_id', all_params, local_var_params) - # verify the required parameter 'variable_id' is set - if ('variable_id' not in local_var_params or - local_var_params['variable_id'] is None): - raise ValueError("Missing the required parameter `variable_id` when calling `get_variables_id`") # noqa: E501 - - path_params = {} - if 'variable_id' in local_var_params: - path_params['variableID'] = local_var_params['variable_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def get_variables_id_labels(self, variable_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_variables_id_labels(variable_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_variables_id_labels_with_http_info(variable_id, **kwargs) # noqa: E501 - else: - (data) = self.get_variables_id_labels_with_http_info(variable_id, **kwargs) # noqa: E501 - return data - - def get_variables_id_labels_with_http_info(self, variable_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_variables_id_labels_with_http_info(variable_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_variables_id_labels_prepare(variable_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/variables/{variableID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_variables_id_labels_async(self, variable_id, **kwargs): # noqa: E501,D401,D403 - """List all labels for a variable. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelsResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_variables_id_labels_prepare(variable_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/variables/{variableID}/labels', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelsResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_variables_id_labels_prepare(self, variable_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['variable_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_variables_id_labels', all_params, local_var_params) - # verify the required parameter 'variable_id' is set - if ('variable_id' not in local_var_params or - local_var_params['variable_id'] is None): - raise ValueError("Missing the required parameter `variable_id` when calling `get_variables_id_labels`") # noqa: E501 - - path_params = {} - if 'variable_id' in local_var_params: - path_params['variableID'] = local_var_params['variable_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_variables_id(self, variable_id, variable, **kwargs): # noqa: E501,D401,D403 - """Update a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_variables_id(variable_id, variable, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param Variable variable: Variable update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: Variable - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_variables_id_with_http_info(variable_id, variable, **kwargs) # noqa: E501 - else: - (data) = self.patch_variables_id_with_http_info(variable_id, variable, **kwargs) # noqa: E501 - return data - - def patch_variables_id_with_http_info(self, variable_id, variable, **kwargs): # noqa: E501,D401,D403 - """Update a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_variables_id_with_http_info(variable_id, variable, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param Variable variable: Variable update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: Variable - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_variables_id_prepare(variable_id, variable, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/variables/{variableID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Variable', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_variables_id_async(self, variable_id, variable, **kwargs): # noqa: E501,D401,D403 - """Update a variable. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param Variable variable: Variable update to apply (required) - :param str zap_trace_span: OpenTracing span context - :return: Variable - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_variables_id_prepare(variable_id, variable, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/variables/{variableID}', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Variable', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_variables_id_prepare(self, variable_id, variable, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['variable_id', 'variable', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_variables_id', all_params, local_var_params) - # verify the required parameter 'variable_id' is set - if ('variable_id' not in local_var_params or - local_var_params['variable_id'] is None): - raise ValueError("Missing the required parameter `variable_id` when calling `patch_variables_id`") # noqa: E501 - # verify the required parameter 'variable' is set - if ('variable' not in local_var_params or - local_var_params['variable'] is None): - raise ValueError("Missing the required parameter `variable` when calling `patch_variables_id`") # noqa: E501 - - path_params = {} - if 'variable_id' in local_var_params: - path_params['variableID'] = local_var_params['variable_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'variable' in local_var_params: - body_params = local_var_params['variable'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_variables(self, variable, **kwargs): # noqa: E501,D401,D403 - """Create a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_variables(variable, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param Variable variable: Variable to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Variable - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_variables_with_http_info(variable, **kwargs) # noqa: E501 - else: - (data) = self.post_variables_with_http_info(variable, **kwargs) # noqa: E501 - return data - - def post_variables_with_http_info(self, variable, **kwargs): # noqa: E501,D401,D403 - """Create a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_variables_with_http_info(variable, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param Variable variable: Variable to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Variable - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_variables_prepare(variable, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/variables', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Variable', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_variables_async(self, variable, **kwargs): # noqa: E501,D401,D403 - """Create a variable. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param Variable variable: Variable to create (required) - :param str zap_trace_span: OpenTracing span context - :return: Variable - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_variables_prepare(variable, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/variables', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Variable', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_variables_prepare(self, variable, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['variable', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_variables', all_params, local_var_params) - # verify the required parameter 'variable' is set - if ('variable' not in local_var_params or - local_var_params['variable'] is None): - raise ValueError("Missing the required parameter `variable` when calling `post_variables`") # noqa: E501 - - path_params = {} - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'variable' in local_var_params: - body_params = local_var_params['variable'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def post_variables_id_labels(self, variable_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_variables_id_labels(variable_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_variables_id_labels_with_http_info(variable_id, label_mapping, **kwargs) # noqa: E501 - else: - (data) = self.post_variables_id_labels_with_http_info(variable_id, label_mapping, **kwargs) # noqa: E501 - return data - - def post_variables_id_labels_with_http_info(self, variable_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_variables_id_labels_with_http_info(variable_id, label_mapping, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_variables_id_labels_prepare(variable_id, label_mapping, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/variables/{variableID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_variables_id_labels_async(self, variable_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - """Add a label to a variable. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param LabelMapping label_mapping: Label to add (required) - :param str zap_trace_span: OpenTracing span context - :return: LabelResponse - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_variables_id_labels_prepare(variable_id, label_mapping, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/variables/{variableID}/labels', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='LabelResponse', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_variables_id_labels_prepare(self, variable_id, label_mapping, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['variable_id', 'label_mapping', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('post_variables_id_labels', all_params, local_var_params) - # verify the required parameter 'variable_id' is set - if ('variable_id' not in local_var_params or - local_var_params['variable_id'] is None): - raise ValueError("Missing the required parameter `variable_id` when calling `post_variables_id_labels`") # noqa: E501 - # verify the required parameter 'label_mapping' is set - if ('label_mapping' not in local_var_params or - local_var_params['label_mapping'] is None): - raise ValueError("Missing the required parameter `label_mapping` when calling `post_variables_id_labels`") # noqa: E501 - - path_params = {} - if 'variable_id' in local_var_params: - path_params['variableID'] = local_var_params['variable_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'label_mapping' in local_var_params: - body_params = local_var_params['label_mapping'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def put_variables_id(self, variable_id, variable, **kwargs): # noqa: E501,D401,D403 - """Replace a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_variables_id(variable_id, variable, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param Variable variable: Variable to replace (required) - :param str zap_trace_span: OpenTracing span context - :return: Variable - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.put_variables_id_with_http_info(variable_id, variable, **kwargs) # noqa: E501 - else: - (data) = self.put_variables_id_with_http_info(variable_id, variable, **kwargs) # noqa: E501 - return data - - def put_variables_id_with_http_info(self, variable_id, variable, **kwargs): # noqa: E501,D401,D403 - """Replace a variable. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.put_variables_id_with_http_info(variable_id, variable, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param Variable variable: Variable to replace (required) - :param str zap_trace_span: OpenTracing span context - :return: Variable - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_variables_id_prepare(variable_id, variable, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/variables/{variableID}', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Variable', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def put_variables_id_async(self, variable_id, variable, **kwargs): # noqa: E501,D401,D403 - """Replace a variable. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str variable_id: The variable ID. (required) - :param Variable variable: Variable to replace (required) - :param str zap_trace_span: OpenTracing span context - :return: Variable - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._put_variables_id_prepare(variable_id, variable, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/variables/{variableID}', 'PUT', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='Variable', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _put_variables_id_prepare(self, variable_id, variable, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['variable_id', 'variable', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('put_variables_id', all_params, local_var_params) - # verify the required parameter 'variable_id' is set - if ('variable_id' not in local_var_params or - local_var_params['variable_id'] is None): - raise ValueError("Missing the required parameter `variable_id` when calling `put_variables_id`") # noqa: E501 - # verify the required parameter 'variable' is set - if ('variable' not in local_var_params or - local_var_params['variable'] is None): - raise ValueError("Missing the required parameter `variable` when calling `put_variables_id`") # noqa: E501 - - path_params = {} - if 'variable_id' in local_var_params: - path_params['variableID'] = local_var_params['variable_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'variable' in local_var_params: - body_params = local_var_params['variable'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/views_service.py b/frogpilot/third_party/influxdb_client/service/views_service.py deleted file mode 100644 index 203f6c640..000000000 --- a/frogpilot/third_party/influxdb_client/service/views_service.py +++ /dev/null @@ -1,293 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class ViewsService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """ViewsService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def get_dashboards_id_cells_id_view(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve the view for a cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id_cells_id_view(dashboard_id, cell_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str cell_id: The cell ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.get_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, **kwargs) # noqa: E501 - else: - (data) = self.get_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, **kwargs) # noqa: E501 - return data - - def get_dashboards_id_cells_id_view_with_http_info(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve the view for a cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.get_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str cell_id: The cell ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_cells_id_view_prepare(dashboard_id, cell_id, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}/view', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='View', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def get_dashboards_id_cells_id_view_async(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - """Retrieve the view for a cell. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The dashboard ID. (required) - :param str cell_id: The cell ID. (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._get_dashboards_id_cells_id_view_prepare(dashboard_id, cell_id, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}/view', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='View', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _get_dashboards_id_cells_id_view_prepare(self, dashboard_id, cell_id, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'cell_id', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('get_dashboards_id_cells_id_view', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `get_dashboards_id_cells_id_view`") # noqa: E501 - # verify the required parameter 'cell_id' is set - if ('cell_id' not in local_var_params or - local_var_params['cell_id'] is None): - raise ValueError("Missing the required parameter `cell_id` when calling `get_dashboards_id_cells_id_view`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - if 'cell_id' in local_var_params: - path_params['cellID'] = local_var_params['cell_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params - - def patch_dashboards_id_cells_id_view(self, dashboard_id, cell_id, view, **kwargs): # noqa: E501,D401,D403 - """Update the view for a cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dashboards_id_cells_id_view(dashboard_id, cell_id, view, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param View view: (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.patch_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, view, **kwargs) # noqa: E501 - else: - (data) = self.patch_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, view, **kwargs) # noqa: E501 - return data - - def patch_dashboards_id_cells_id_view_with_http_info(self, dashboard_id, cell_id, view, **kwargs): # noqa: E501,D401,D403 - """Update the view for a cell. - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.patch_dashboards_id_cells_id_view_with_http_info(dashboard_id, cell_id, view, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param View view: (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dashboards_id_cells_id_view_prepare(dashboard_id, cell_id, view, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}/view', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='View', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def patch_dashboards_id_cells_id_view_async(self, dashboard_id, cell_id, view, **kwargs): # noqa: E501,D401,D403 - """Update the view for a cell. - - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str dashboard_id: The ID of the dashboard to update. (required) - :param str cell_id: The ID of the cell to update. (required) - :param View view: (required) - :param str zap_trace_span: OpenTracing span context - :return: View - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._patch_dashboards_id_cells_id_view_prepare(dashboard_id, cell_id, view, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/dashboards/{dashboardID}/cells/{cellID}/view', 'PATCH', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type='View', # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _patch_dashboards_id_cells_id_view_prepare(self, dashboard_id, cell_id, view, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['dashboard_id', 'cell_id', 'view', 'zap_trace_span'] # noqa: E501 - self._check_operation_params('patch_dashboards_id_cells_id_view', all_params, local_var_params) - # verify the required parameter 'dashboard_id' is set - if ('dashboard_id' not in local_var_params or - local_var_params['dashboard_id'] is None): - raise ValueError("Missing the required parameter `dashboard_id` when calling `patch_dashboards_id_cells_id_view`") # noqa: E501 - # verify the required parameter 'cell_id' is set - if ('cell_id' not in local_var_params or - local_var_params['cell_id'] is None): - raise ValueError("Missing the required parameter `cell_id` when calling `patch_dashboards_id_cells_id_view`") # noqa: E501 - # verify the required parameter 'view' is set - if ('view' not in local_var_params or - local_var_params['view'] is None): - raise ValueError("Missing the required parameter `view` when calling `patch_dashboards_id_cells_id_view`") # noqa: E501 - - path_params = {} - if 'dashboard_id' in local_var_params: - path_params['dashboardID'] = local_var_params['dashboard_id'] # noqa: E501 - if 'cell_id' in local_var_params: - path_params['cellID'] = local_var_params['cell_id'] # noqa: E501 - - query_params = [] - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - - body_params = None - if 'view' in local_var_params: - body_params = local_var_params['view'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/service/write_service.py b/frogpilot/third_party/influxdb_client/service/write_service.py deleted file mode 100644 index bcd970dbb..000000000 --- a/frogpilot/third_party/influxdb_client/service/write_service.py +++ /dev/null @@ -1,201 +0,0 @@ -# coding: utf-8 - -""" -InfluxDB OSS API Service. - -The InfluxDB v2 API provides a programmatic interface for all interactions with InfluxDB. Access the InfluxDB API using the `/api/v2/` endpoint. # noqa: E501 - -OpenAPI spec version: 2.0.0 -Generated by: https://openapi-generator.tech -""" - - -from __future__ import absolute_import - -import re # noqa: F401 - -from influxdb_client.service._base_service import _BaseService - - -class WriteService(_BaseService): - """NOTE: This class is auto generated by OpenAPI Generator. - - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): # noqa: E501,D401,D403 - """WriteService - a operation defined in OpenAPI.""" - super().__init__(api_client) - - def post_write(self, org, bucket, body, **kwargs): # noqa: E501,D401,D403 - """Write data. - - Writes data to a bucket. Use this endpoint to send data in [line protocol](https://docs.influxdata.com/influxdb/latest/reference/syntax/line-protocol/) format to InfluxDB. #### InfluxDB Cloud - Does the following when you send a write request: 1. Validates the request and queues the write. 2. If queued, responds with _success_ (HTTP `2xx` status code); _error_ otherwise. 3. Handles the delete asynchronously and reaches eventual consistency. To ensure that InfluxDB Cloud handles writes and deletes in the order you request them, wait for a success response (HTTP `2xx` status code) before you send the next request. Because writes and deletes are asynchronous, your change might not yet be readable when you receive the response. #### InfluxDB OSS - Validates the request and handles the write synchronously. - If all points were written successfully, responds with HTTP `2xx` status code; otherwise, returns the first line that failed. #### Required permissions - `write-buckets` or `write-bucket BUCKET_ID`. *`BUCKET_ID`* is the ID of the destination bucket. #### Rate limits (with InfluxDB Cloud) `write` rate limits apply. For more information, see [limits and adjustable quotas](https://docs.influxdata.com/influxdb/cloud/account-management/limits/). #### Related guides - [Write data with the InfluxDB API](https://docs.influxdata.com/influxdb/latest/write-data/developer-tools/api) - [Optimize writes to InfluxDB](https://docs.influxdata.com/influxdb/latest/write-data/best-practices/optimize-writes/) - [Troubleshoot issues writing data](https://docs.influxdata.com/influxdb/latest/write-data/troubleshoot/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_write(org, bucket, body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org: An organization name or ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Writes data to the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or the `orgID` parameter. - If you pass both `orgID` and `org`, they must both be valid. - Writes data to the bucket in the specified organization. (required) - :param str bucket: A bucket name or ID. InfluxDB writes all points in the batch to the specified bucket. (required) - :param str body: In the request body, provide data in [line protocol format](https://docs.influxdata.com/influxdb/latest/reference/syntax/line-protocol/). To send compressed data, do the following: 1. Use [GZIP](https://www.gzip.org/) to compress the line protocol data. 2. In your request, send the compressed data and the `Content-Encoding: gzip` header. #### Related guides - [Best practices for optimizing writes](https://docs.influxdata.com/influxdb/latest/write-data/best-practices/optimize-writes/) (required) - :param str zap_trace_span: OpenTracing span context - :param str content_encoding: The compression applied to the line protocol in the request payload. To send a GZIP payload, pass `Content-Encoding: gzip` header. - :param str content_type: The format of the data in the request body. To send a line protocol payload, pass `Content-Type: text/plain; charset=utf-8`. - :param int content_length: The size of the entity-body, in bytes, sent to InfluxDB. If the length is greater than the `max body` configuration option, the server responds with status code `413`. - :param str accept: The content type that the client can understand. Writes only return a response body if they fail--for example, due to a formatting problem or quota limit. #### InfluxDB Cloud - Returns only `application/json` for format and limit errors. - Returns only `text/html` for some quota limit errors. #### InfluxDB OSS - Returns only `application/json` for format and limit errors. #### Related guides - [Troubleshoot issues writing data](https://docs.influxdata.com/influxdb/latest/write-data/troubleshoot/) - :param str org_id: An organization ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Writes data to the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or the `orgID` parameter. - If you pass both `orgID` and `org`, they must both be valid. - Writes data to the bucket in the specified organization. - :param WritePrecision precision: The precision for unix timestamps in the line protocol batch. - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - kwargs['_return_http_data_only'] = True - if kwargs.get('async_req'): - return self.post_write_with_http_info(org, bucket, body, **kwargs) # noqa: E501 - else: - (data) = self.post_write_with_http_info(org, bucket, body, **kwargs) # noqa: E501 - return data - - def post_write_with_http_info(self, org, bucket, body, **kwargs): # noqa: E501,D401,D403 - """Write data. - - Writes data to a bucket. Use this endpoint to send data in [line protocol](https://docs.influxdata.com/influxdb/latest/reference/syntax/line-protocol/) format to InfluxDB. #### InfluxDB Cloud - Does the following when you send a write request: 1. Validates the request and queues the write. 2. If queued, responds with _success_ (HTTP `2xx` status code); _error_ otherwise. 3. Handles the delete asynchronously and reaches eventual consistency. To ensure that InfluxDB Cloud handles writes and deletes in the order you request them, wait for a success response (HTTP `2xx` status code) before you send the next request. Because writes and deletes are asynchronous, your change might not yet be readable when you receive the response. #### InfluxDB OSS - Validates the request and handles the write synchronously. - If all points were written successfully, responds with HTTP `2xx` status code; otherwise, returns the first line that failed. #### Required permissions - `write-buckets` or `write-bucket BUCKET_ID`. *`BUCKET_ID`* is the ID of the destination bucket. #### Rate limits (with InfluxDB Cloud) `write` rate limits apply. For more information, see [limits and adjustable quotas](https://docs.influxdata.com/influxdb/cloud/account-management/limits/). #### Related guides - [Write data with the InfluxDB API](https://docs.influxdata.com/influxdb/latest/write-data/developer-tools/api) - [Optimize writes to InfluxDB](https://docs.influxdata.com/influxdb/latest/write-data/best-practices/optimize-writes/) - [Troubleshoot issues writing data](https://docs.influxdata.com/influxdb/latest/write-data/troubleshoot/) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.post_write_with_http_info(org, bucket, body, async_req=True) - >>> result = thread.get() - - :param async_req bool - :param str org: An organization name or ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Writes data to the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or the `orgID` parameter. - If you pass both `orgID` and `org`, they must both be valid. - Writes data to the bucket in the specified organization. (required) - :param str bucket: A bucket name or ID. InfluxDB writes all points in the batch to the specified bucket. (required) - :param str body: In the request body, provide data in [line protocol format](https://docs.influxdata.com/influxdb/latest/reference/syntax/line-protocol/). To send compressed data, do the following: 1. Use [GZIP](https://www.gzip.org/) to compress the line protocol data. 2. In your request, send the compressed data and the `Content-Encoding: gzip` header. #### Related guides - [Best practices for optimizing writes](https://docs.influxdata.com/influxdb/latest/write-data/best-practices/optimize-writes/) (required) - :param str zap_trace_span: OpenTracing span context - :param str content_encoding: The compression applied to the line protocol in the request payload. To send a GZIP payload, pass `Content-Encoding: gzip` header. - :param str content_type: The format of the data in the request body. To send a line protocol payload, pass `Content-Type: text/plain; charset=utf-8`. - :param int content_length: The size of the entity-body, in bytes, sent to InfluxDB. If the length is greater than the `max body` configuration option, the server responds with status code `413`. - :param str accept: The content type that the client can understand. Writes only return a response body if they fail--for example, due to a formatting problem or quota limit. #### InfluxDB Cloud - Returns only `application/json` for format and limit errors. - Returns only `text/html` for some quota limit errors. #### InfluxDB OSS - Returns only `application/json` for format and limit errors. #### Related guides - [Troubleshoot issues writing data](https://docs.influxdata.com/influxdb/latest/write-data/troubleshoot/) - :param str org_id: An organization ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Writes data to the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or the `orgID` parameter. - If you pass both `orgID` and `org`, they must both be valid. - Writes data to the bucket in the specified organization. - :param WritePrecision precision: The precision for unix timestamps in the line protocol batch. - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_write_prepare(org, bucket, body, **kwargs) # noqa: E501 - - return self.api_client.call_api( - '/api/v2/write', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - async def post_write_async(self, org, bucket, body, **kwargs): # noqa: E501,D401,D403 - """Write data. - - Writes data to a bucket. Use this endpoint to send data in [line protocol](https://docs.influxdata.com/influxdb/latest/reference/syntax/line-protocol/) format to InfluxDB. #### InfluxDB Cloud - Does the following when you send a write request: 1. Validates the request and queues the write. 2. If queued, responds with _success_ (HTTP `2xx` status code); _error_ otherwise. 3. Handles the delete asynchronously and reaches eventual consistency. To ensure that InfluxDB Cloud handles writes and deletes in the order you request them, wait for a success response (HTTP `2xx` status code) before you send the next request. Because writes and deletes are asynchronous, your change might not yet be readable when you receive the response. #### InfluxDB OSS - Validates the request and handles the write synchronously. - If all points were written successfully, responds with HTTP `2xx` status code; otherwise, returns the first line that failed. #### Required permissions - `write-buckets` or `write-bucket BUCKET_ID`. *`BUCKET_ID`* is the ID of the destination bucket. #### Rate limits (with InfluxDB Cloud) `write` rate limits apply. For more information, see [limits and adjustable quotas](https://docs.influxdata.com/influxdb/cloud/account-management/limits/). #### Related guides - [Write data with the InfluxDB API](https://docs.influxdata.com/influxdb/latest/write-data/developer-tools/api) - [Optimize writes to InfluxDB](https://docs.influxdata.com/influxdb/latest/write-data/best-practices/optimize-writes/) - [Troubleshoot issues writing data](https://docs.influxdata.com/influxdb/latest/write-data/troubleshoot/) - This method makes an asynchronous HTTP request. - - :param async_req bool - :param str org: An organization name or ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Writes data to the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or the `orgID` parameter. - If you pass both `orgID` and `org`, they must both be valid. - Writes data to the bucket in the specified organization. (required) - :param str bucket: A bucket name or ID. InfluxDB writes all points in the batch to the specified bucket. (required) - :param str body: In the request body, provide data in [line protocol format](https://docs.influxdata.com/influxdb/latest/reference/syntax/line-protocol/). To send compressed data, do the following: 1. Use [GZIP](https://www.gzip.org/) to compress the line protocol data. 2. In your request, send the compressed data and the `Content-Encoding: gzip` header. #### Related guides - [Best practices for optimizing writes](https://docs.influxdata.com/influxdb/latest/write-data/best-practices/optimize-writes/) (required) - :param str zap_trace_span: OpenTracing span context - :param str content_encoding: The compression applied to the line protocol in the request payload. To send a GZIP payload, pass `Content-Encoding: gzip` header. - :param str content_type: The format of the data in the request body. To send a line protocol payload, pass `Content-Type: text/plain; charset=utf-8`. - :param int content_length: The size of the entity-body, in bytes, sent to InfluxDB. If the length is greater than the `max body` configuration option, the server responds with status code `413`. - :param str accept: The content type that the client can understand. Writes only return a response body if they fail--for example, due to a formatting problem or quota limit. #### InfluxDB Cloud - Returns only `application/json` for format and limit errors. - Returns only `text/html` for some quota limit errors. #### InfluxDB OSS - Returns only `application/json` for format and limit errors. #### Related guides - [Troubleshoot issues writing data](https://docs.influxdata.com/influxdb/latest/write-data/troubleshoot/) - :param str org_id: An organization ID. #### InfluxDB Cloud - Doesn't use the `org` parameter or `orgID` parameter. - Writes data to the bucket in the organization associated with the authorization (API token). #### InfluxDB OSS - Requires either the `org` parameter or the `orgID` parameter. - If you pass both `orgID` and `org`, they must both be valid. - Writes data to the bucket in the specified organization. - :param WritePrecision precision: The precision for unix timestamps in the line protocol batch. - :return: None - If the method is called asynchronously, - returns the request thread. - """ # noqa: E501 - local_var_params, path_params, query_params, header_params, body_params = \ - self._post_write_prepare(org, bucket, body, **kwargs) # noqa: E501 - - return await self.api_client.call_api( - '/api/v2/write', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=[], - files={}, - response_type=None, # noqa: E501 - auth_settings=[], - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats={}, - urlopen_kw=kwargs.get('urlopen_kw', None)) - - def _post_write_prepare(self, org, bucket, body, **kwargs): # noqa: E501,D401,D403 - local_var_params = locals() - - all_params = ['org', 'bucket', 'body', 'zap_trace_span', 'content_encoding', 'content_type', 'content_length', 'accept', 'org_id', 'precision'] # noqa: E501 - self._check_operation_params('post_write', all_params, local_var_params) - # verify the required parameter 'org' is set - if ('org' not in local_var_params or - local_var_params['org'] is None): - raise ValueError("Missing the required parameter `org` when calling `post_write`") # noqa: E501 - # verify the required parameter 'bucket' is set - if ('bucket' not in local_var_params or - local_var_params['bucket'] is None): - raise ValueError("Missing the required parameter `bucket` when calling `post_write`") # noqa: E501 - # verify the required parameter 'body' is set - if ('body' not in local_var_params or - local_var_params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `post_write`") # noqa: E501 - - path_params = {} - - query_params = [] - if 'org' in local_var_params: - query_params.append(('org', local_var_params['org'])) # noqa: E501 - if 'org_id' in local_var_params: - query_params.append(('orgID', local_var_params['org_id'])) # noqa: E501 - if 'bucket' in local_var_params: - query_params.append(('bucket', local_var_params['bucket'])) # noqa: E501 - if 'precision' in local_var_params: - query_params.append(('precision', local_var_params['precision'])) # noqa: E501 - - header_params = {} - if 'zap_trace_span' in local_var_params: - header_params['Zap-Trace-Span'] = local_var_params['zap_trace_span'] # noqa: E501 - if 'content_encoding' in local_var_params: - header_params['Content-Encoding'] = local_var_params['content_encoding'] # noqa: E501 - if 'content_type' in local_var_params: - header_params['Content-Type'] = local_var_params['content_type'] # noqa: E501 - if 'content_length' in local_var_params: - header_params['Content-Length'] = local_var_params['content_length'] # noqa: E501 - if 'accept' in local_var_params: - header_params['Accept'] = local_var_params['accept'] # noqa: E501 - - body_params = None - if 'body' in local_var_params: - body_params = local_var_params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json', 'text/html', ]) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['text/plain']) # noqa: E501 - - return local_var_params, path_params, query_params, header_params, body_params diff --git a/frogpilot/third_party/influxdb_client/version.py b/frogpilot/third_party/influxdb_client/version.py deleted file mode 100644 index 9c626c0c8..000000000 --- a/frogpilot/third_party/influxdb_client/version.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Version of the Client that is used in User-Agent header.""" - -VERSION = '1.49.0' diff --git a/frogpilot/ui/layouts/settings/toggle_metadata.py b/frogpilot/ui/layouts/settings/toggle_metadata.py new file mode 100644 index 000000000..3c270be4d --- /dev/null +++ b/frogpilot/ui/layouts/settings/toggle_metadata.py @@ -0,0 +1,2877 @@ +from dataclasses import dataclass +from enum import Enum + + + +class ToggleType(Enum): + BOOLEAN = "boolean" + BUTTON = "button" + BUTTON_PARAM = "button_param" + BUTTON_TOGGLE = "button_toggle" + LABEL = "label" + MANAGE = "manage" + MULTI_BUTTON = "multi_button" + NUMERIC = "numeric" + NUMERIC_WITH_BUTTON = "numeric_with_button" + + +@dataclass(frozen=True) +class ToggleDefinition: + button_labels: list[str] | None = None + button_options: list[str] | None = None + car_params: list[str] | None = None + depends_on: list[str] | None = None + description: str | None = None + icon: str | None = None + max_value: float | int | None = None + min_value: float | int | None = None + param: str | None = None + parent_param: str | None = None + reboot_required: bool | None = None + step: float | int | None = None + title: str | None = None + toggle_type: ToggleType | None = None + tuning_level: int | None = None + unit: str | None = None + value_map: dict[int, str] | None = None + + +TUNING_LEVEL_TOGGLE = ToggleDefinition( + title=("Tuning Level"), + param="TuningLevel", + description=( + "Choose your tuning level. Lower levels keep it simple; higher levels unlock more toggles for finer control. " + + "Minimal - Ideal for those who prefer simplicity or ease of use " + + "Standard - Recommended for most users for a balanced experience " + + "Advanced - Fine-tuning for experienced users " + + "Developer - Highly customizable settings for seasoned enthusiasts" + ), + icon="../../../frogpilot/assets/toggle_icons/icon_tuning.png", + max_value=3, + min_value=0, + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=0, + value_map={ + 0: "Minimal", + 1: "Standard", + 2: "Advanced", + 3: "Developer", + }, +) + + +STOCK_OPENPILOT_TOGGLES = ( + ToggleDefinition( + title=("Enable openpilot"), + param="OpenpilotEnabledToggle", + description=("Use the openpilot system for adaptive cruise control and lane keep driver assistance. Your attention is required at all times to use this feature. Changing this setting takes effect when the car is powered off."), + icon="../assets/offroad/icon_openpilot.png", + tuning_level=0, + ), + ToggleDefinition( + title=("openpilot Longitudinal Control (Alpha)"), + param="ExperimentalLongitudinalEnabled", + description=("WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).

On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha."), + icon="../assets/offroad/icon_speed_limit.png", + tuning_level=0, + ), + ToggleDefinition( + title=("Experimental Mode"), + param="ExperimentalMode", + description=("openpilot defaults to chill mode. Experimental mode enables alpha-level features that are not ready for chill mode."), + icon="../assets/img_experimental_white.svg", + tuning_level=0, + ), + ToggleDefinition( + title=("Disengage on Accelerator Pedal"), + param="DisengageOnAccelerator", + description=("When enabled, pressing the accelerator pedal will disengage openpilot."), + icon="../assets/offroad/icon_disengage_on_accelerator.svg", + tuning_level=0, + ), + ToggleDefinition( + title=("Driving Personality"), + param="LongitudinalPersonality", + button_labels=["SELECT"], + button_options=["Aggressive", "Standard", "Relaxed"], + description=("Standard is recommended. In aggressive mode, openpilot follows lead cars closer and uses more assertive gas and brake behavior. In relaxed mode, openpilot follows further away."), + icon="../assets/offroad/icon_speed_limit.png", + toggle_type=ToggleType.BUTTON_PARAM, + tuning_level=0, + ), + ToggleDefinition( + title=("Enable Lane Departure Warnings"), + param="IsLdwEnabled", + description=("Receive alerts to steer back into lane when your vehicle drifts over a detected lane line without a turn signal active while driving over 31 mph (50 km/h)."), + icon="../assets/offroad/icon_warning.png", + tuning_level=0, + ), + ToggleDefinition( + title=("Record and Upload Driver Camera"), + param="RecordFront", + description=("Upload data from the driver-facing camera and help improve the driver monitoring algorithm."), + icon="../assets/offroad/icon_monitoring.png", + tuning_level=0, + ), + ToggleDefinition( + title=("Use Metric System"), + param="IsMetric", + description=("Display speed in km/h instead of mph."), + icon="../assets/offroad/icon_metric.png", + tuning_level=0, + ), + ToggleDefinition( + title=("Show ETA in 24h Format"), + param="NavSettingTime24h", + description=("Use 24h format instead of am/pm."), + icon="../assets/offroad/icon_metric.png", + tuning_level=0, + ), + ToggleDefinition( + title=("Show Map on Left Side of UI"), + param="NavSettingLeftSide", + description=("Show map on the left side when in split-screen view."), + icon="../assets/offroad/icon_road.png", + tuning_level=0, + ), +) + + +SOFTWARE_TOGGLES = ( + ToggleDefinition( + title=("Automatically Update FrogPilot"), + param="AutomaticUpdates", + description=("FrogPilot will automatically update itself and its assets when you are offroad with an active internet connection."), + tuning_level=0, + ), +) + + +ALERTS_AND_SOUNDS_TOGGLES = ( + ToggleDefinition( + title=("Alert Volume Controller"), + param="AlertVolumeControl", + description=("Set how loud each type of openpilot alert is to keep routine prompts from becoming distracting."), + icon="../../../frogpilot/assets/toggle_icons/icon_mute.png", + toggle_type=ToggleType.MANAGE, + tuning_level=2, + ), + ToggleDefinition( + title=("Disengage Volume"), + param="DisengageVolume", + button_labels=["Test"], + description=("Set the volume for alerts when openpilot disengages.

Examples include: \"Cruise Fault: Restart the Car\", \"Parking Brake Engaged\", \"Pedal Pressed\"."), + max_value=101, + min_value=0, + parent_param="AlertVolumeControl", + step=1, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=2, + unit="%", + value_map={0: "Muted", 101: "Auto"}, + ), + ToggleDefinition( + title=("Engage Volume"), + param="EngageVolume", + button_labels=["Test"], + description=("Set the volume for the chime when openpilot engages, such as after pressing the \"RESUME\" or \"SET\" steering wheel buttons."), + max_value=101, + min_value=0, + parent_param="AlertVolumeControl", + step=1, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=2, + unit="%", + value_map={0: "Muted", 101: "Auto"}, + ), + ToggleDefinition( + title=("Prompt Volume"), + param="PromptVolume", + button_labels=["Test"], + description=("Set the volume for prompts that need attention.

Examples include: \"Car Detected in Blindspot\", \"Steering Temporarily Unavailable\", \"Turn Exceeds Steering Limit\"."), + max_value=101, + min_value=0, + parent_param="AlertVolumeControl", + step=1, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=2, + unit="%", + value_map={0: "Muted", 101: "Auto"}, + ), + ToggleDefinition( + title=("Prompt Distracted Volume"), + param="PromptDistractedVolume", + button_labels=["Test"], + description=("Set the volume for prompts when openpilot detects driver distraction or unresponsiveness.

Examples include: \"Pay Attention\", \"Touch Steering Wheel\"."), + max_value=101, + min_value=0, + parent_param="AlertVolumeControl", + step=1, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=2, + unit="%", + value_map={0: "Muted", 101: "Auto"}, + ), + ToggleDefinition( + title=("Refuse Volume"), + param="RefuseVolume", + button_labels=["Test"], + description=("Set the volume for alerts when openpilot refuses to engage.

Examples include: \"Brake Hold Active\", \"Door Open\", \"Seatbelt Unlatched\"."), + max_value=101, + min_value=0, + parent_param="AlertVolumeControl", + step=1, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=2, + unit="%", + value_map={0: "Muted", 101: "Auto"}, + ), + ToggleDefinition( + title=("Warning Soft Volume"), + param="WarningSoftVolume", + button_labels=["Test"], + description=("Set the volume for softer warnings about potential risks.

Examples include: \"BRAKE! Risk of Collision\", \"Steering Temporarily Unavailable\"."), + max_value=101, + min_value=25, + parent_param="AlertVolumeControl", + step=1, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=2, + unit="%", + value_map={0: "Muted", 101: "Auto"}, + ), + ToggleDefinition( + title=("Warning Immediate Volume"), + param="WarningImmediateVolume", + button_labels=["Test"], + description=("Set the volume for the loudest warnings that require urgent attention.

Examples include: \"DISENGAGE IMMEDIATELY — Driver Distracted\", \"DISENGAGE IMMEDIATELY — Driver Unresponsive\"."), + max_value=101, + min_value=25, + parent_param="AlertVolumeControl", + step=1, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=2, + unit="%", + value_map={0: "Muted", 101: "Auto"}, + ), + ToggleDefinition( + title=("FrogPilot Alerts"), + param="CustomAlerts", + description=("Optional FrogPilot alerts that highlight driving events in a more noticeable way."), + icon="../../../frogpilot/assets/toggle_icons/icon_green_light.png", + toggle_type=ToggleType.MANAGE, + tuning_level=0, + ), + ToggleDefinition( + title=("Goat Scream"), + param="GoatScream", + description=("Play the infamous \"Goat Scream\" when the steering controller reaches its limit. Based on the \"Turn Exceeds Steering Limit\" event."), + parent_param="CustomAlerts", + tuning_level=1, + ), + ToggleDefinition( + title=("Green Light Alert"), + param="GreenLightAlert", + description=("Play an alert when the model predicts a red light has turned green.

Disclaimer: openpilot does not explicitly detect traffic lights. This alert is based on end-to-end model predictions from camera input and may trigger even when the light has not changed."), + parent_param="CustomAlerts", + tuning_level=0, + ), + ToggleDefinition( + title=("Lead Departing Alert"), + param="LeadDepartingAlert", + description=("Play an alert when the lead vehicle departs from a stop."), + parent_param="CustomAlerts", + tuning_level=0, + ), + ToggleDefinition( + title=("Loud \"Car Detected in Blindspot\" Alert"), + param="LoudBlindspotAlert", + car_params=["blind_spot_monitoring"], + description=("Play a louder alert if a vehicle is in the blind spot when attempting to change lanes. Based on the \"Car Detected in Blindspot\" event."), + parent_param="CustomAlerts", + tuning_level=0, + ), + ToggleDefinition( + title=("Speed Limit Changed Alert"), + param="SpeedLimitChangedAlert", + depends_on=["ShowSpeedLimits", "SpeedLimitController"], + description=("Play an alert when the posted speed limit changes."), + parent_param="CustomAlerts", + tuning_level=0, + ), +) + + +DRIVING_MODEL_TOGGLES = ( + ToggleDefinition( + title=("Automatically Download New Models"), + param="AutomaticallyDownloadModels", + description=("Automatically download new driving models as they become available."), + tuning_level=1, + ), + ToggleDefinition( + title=("Model Randomizer"), + param="ModelRandomizer", + description=("Select a random driving model each drive and use feedback prompts at the end of the drive to help find the model that best suits you!"), + tuning_level=2, + ), + ToggleDefinition( + title=("Update Model Manager"), + param="UpdateTinygrad", + button_labels=["UPDATE"], + description=("Update the \"Model Manager\" to support the latest models."), + toggle_type=ToggleType.MULTI_BUTTON, + tuning_level=0, + ), +) + + +GAS_BRAKE_TOGGLES = ( + ToggleDefinition( + title=("Advanced Longitudinal Tuning"), + param="AdvancedLongitudinalTune", + car_params=["openpilot_longitudinal"], + description=("Advanced acceleration and braking control changes to fine-tune how openpilot drives."), + icon="../../../frogpilot/assets/toggle_icons/icon_advanced_longitudinal_tune.png", + toggle_type=ToggleType.MANAGE, + tuning_level=3, + ), + ToggleDefinition( + title=("Actuator Delay"), + param="LongitudinalActuatorDelay", + description=("The time between openpilot's throttle or brake command and the vehicle's response. Increase if the vehicle feels slow to react; decrease if it feels too eager or overshoots."), + max_value=1, + min_value=0, + parent_param="AdvancedLongitudinalTune", + step=0.01, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="seconds", + ), + ToggleDefinition( + title=("Maximum Acceleration"), + param="MaxDesiredAcceleration", + description=("Limit the strongest acceleration openpilot can command."), + max_value=4.0, + min_value=0.1, + parent_param="AdvancedLongitudinalTune", + step=0.1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="m/s²", + ), + ToggleDefinition( + title=("Start Acceleration"), + param="StartAccel", + depends_on=["!HumanAcceleration", "!LongitudinalTune"], + description=("Extra acceleration applied when starting from a stop. Increase for quicker takeoffs; decrease for smoother, gentler starts."), + max_value=4, + min_value=0, + parent_param="AdvancedLongitudinalTune", + step=0.01, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="m/s²", + ), + ToggleDefinition( + title=("Start Speed"), + param="VEgoStarting", + depends_on=["!ExperimentalGMTune", "!FrogsGoMoosTweak"], + description=("The speed at which openpilot exits the stopped state. Increase to reduce creeping; decrease to move sooner after stopping."), + max_value=1, + min_value=0.01, + parent_param="AdvancedLongitudinalTune", + step=0.01, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="m/s²", + ), + ToggleDefinition( + title=("Stop Acceleration"), + param="StopAccel", + description=("Brake force applied to hold the vehicle at a standstill. Increase to prevent rolling on hills; decrease for smoother, softer stops."), + max_value=0, + min_value=-4, + parent_param="AdvancedLongitudinalTune", + step=0.01, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="m/s²", + ), + ToggleDefinition( + title=("Stopping Rate"), + param="StoppingDecelRate", + depends_on=["!ExperimentalGMTune", "!FrogsGoMoosTweak"], + description=("How quickly braking ramps up when stopping. Increase for shorter, firmer stops; decrease for smoother, longer stops."), + max_value=1, + min_value=0.001, + parent_param="AdvancedLongitudinalTune", + step=0.001, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="m/s²", + ), + ToggleDefinition( + title=("Stop Speed"), + param="VEgoStopping", + depends_on=["!ExperimentalGMTune", "!FrogsGoMoosTweak"], + description=("The speed at which openpilot considers the vehicle stopped. Increase to brake earlier and stop smoothly; decrease to wait longer but risk overshooting."), + max_value=1, + min_value=0.01, + parent_param="AdvancedLongitudinalTune", + step=0.01, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="m/s²", + ), + ToggleDefinition( + title=("Conditional Experimental Mode"), + param="ConditionalExperimental", + car_params=["openpilot_longitudinal"], + description=("Automatically switch to \"Experimental Mode\" when set conditions are met. Allows the model to handle challenging situations with smarter decision making."), + icon="../../../frogpilot/assets/toggle_icons/icon_conditional.png", + toggle_type=ToggleType.MANAGE, + tuning_level=1, + ), + ToggleDefinition( + title=("Below"), + param="CESpeed", + description=("Switch to \"Experimental Mode\" when driving below this speed without a lead to help openpilot handle low-speed situations more smoothly."), + max_value=99, + min_value=0, + parent_param="ConditionalExperimental", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=1, + unit="mph", + value_map={0: "Off"}, + ), + ToggleDefinition( + title=("With Lead"), + param="CESpeedLead", + description=("Switch to \"Experimental Mode\" when driving below this speed with a lead to help openpilot handle low-speed situations more smoothly."), + max_value=99, + min_value=0, + parent_param="ConditionalExperimental", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=1, + unit="mph", + value_map={0: "Off"}, + ), + ToggleDefinition( + title=("Curve Detected Ahead"), + param="CECurves", + button_labels=["With Lead"], + button_options=["CECurvesLead"], + description=("Switch to \"Experimental Mode\" when a curve is detected to allow the model to set an appropriate speed for the curve."), + parent_param="ConditionalExperimental", + toggle_type=ToggleType.BUTTON_TOGGLE, + tuning_level=1, + ), + ToggleDefinition( + title=("With Lead"), + param="CECurvesLead", + description=("Also switch to \"Experimental Mode\" for curve detections when a lead vehicle is present."), + parent_param="CECurves", + tuning_level=1, + ), + ToggleDefinition( + title=("\"Detected\" Stop Lights/Signs"), + param="CEStopLights", + depends_on=["!visible:CEModelStopTime"], + description=("Switch to \"Experimental Mode\" whenever the driving model \"detects\" a red light or stop sign.

Disclaimer: openpilot does not explicitly detect traffic lights or stop signs. In \"Experimental Mode\", openpilot makes end-to-end driving decisions from camera input, which means it may stop even when there's no clear reason!"), + parent_param="ConditionalExperimental", + tuning_level=1, + ), + ToggleDefinition( + title=("Lead Detected Ahead"), + param="CELead", + button_labels=["Slower Lead", "Stopped Lead"], + button_options=["CESlowerLead", "CEStoppedLead"], + description=("Switch to \"Experimental Mode\" when a slower or stopped vehicle is detected. Can make braking smoother and more reliable on some vehicles."), + parent_param="ConditionalExperimental", + toggle_type=ToggleType.BUTTON_TOGGLE, + tuning_level=1, + ), + ToggleDefinition( + title=("Slower Lead"), + param="CESlowerLead", + description=("Switch to \"Experimental Mode\" when a slower lead vehicle is detected."), + parent_param="CELead", + tuning_level=1, + ), + ToggleDefinition( + title=("Stopped Lead"), + param="CEStoppedLead", + description=("Switch to \"Experimental Mode\" when a stopped lead vehicle is detected."), + parent_param="CELead", + tuning_level=1, + ), + ToggleDefinition( + title=("Navigation-Based"), + param="CENavigation", + button_labels=["Intersections", "Turns", "With Lead"], + button_options=["CENavigationIntersections", "CENavigationTurns", "CENavigationLead"], + description=("Switch to \"Experimental Mode\" when approaching intersections or turns on the active route while using \"Navigate on openpilot\" (NOO) to allow the model to set an appropriate speed for upcoming maneuvers."), + parent_param="ConditionalExperimental", + toggle_type=ToggleType.BUTTON_TOGGLE, + tuning_level=2, + ), + ToggleDefinition( + title=("Predicted Stop In"), + param="CEModelStopTime", + description=("Switch to \"Experimental Mode\" when openpilot predicts a stop within the set time. This is usually triggered when the model \"sees\" a red light or stop sign ahead.

Disclaimer: openpilot does not explicitly detect traffic lights or stop signs. In \"Experimental Mode\", openpilot makes end-to-end driving decisions from camera input, which means it may stop even when there's no clear reason!"), + max_value=9, + min_value=0, + parent_param="ConditionalExperimental", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + value_map={0: "Off", 1: "1 second", 2: "2 seconds", 3: "3 seconds", 4: "4 seconds", 5: "5 seconds", 6: "6 seconds", 7: "7 seconds", 8: "8 seconds", 9: "9 seconds"}, + ), + ToggleDefinition( + title=("Turn Signal Below"), + param="CESignalSpeed", + button_labels=["Not For Detected Lanes"], + button_options=["CESignalLaneDetection"], + description=("Switch to \"Experimental Mode\" when using a turn signal below the set speed to allow the model to choose an appropriate speed for smoother left and right turns."), + max_value=99, + min_value=0, + parent_param="ConditionalExperimental", + step=1, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=2, + unit="mph", + value_map={0: "Off"}, + ), + ToggleDefinition( + title=("Not For Detected Lanes"), + param="CESignalLaneDetection", + description=("Ignore the turn-signal condition when a clear lane is detected."), + parent_param="CESignalSpeed", + tuning_level=2, + ), + ToggleDefinition( + title=("Status Widget"), + param="ShowCEMStatus", + description=("Show which condition triggered \"Experimental Mode\" on the driving screen."), + parent_param="ConditionalExperimental", + tuning_level=2, + ), + ToggleDefinition( + title=("Curve Speed Controller"), + param="CurveSpeedController", + car_params=["openpilot_longitudinal"], + description=("Automatically slow down for upcoming curves using data learned from your driving style, adapting to curves as you would."), + icon="../../../frogpilot/assets/toggle_icons/icon_speed_map.png", + toggle_type=ToggleType.MANAGE, + tuning_level=1, + ), + ToggleDefinition( + title=("Calibrated Lateral Acceleration"), + param="CalibratedLateralAcceleration", + description=("The learned lateral acceleration from collected driving data. This sets how fast openpilot will take curves. Higher values allow faster cornering; lower values slow the vehicle for gentler turns."), + parent_param="CurveSpeedController", + toggle_type=ToggleType.LABEL, + tuning_level=2, + ), + ToggleDefinition( + title=("Calibration Progress"), + param="CalibrationProgress", + description=("How much curve data has been collected. This is a progress meter; it is normal for the value to stay low and rarely reach 100%."), + parent_param="CurveSpeedController", + toggle_type=ToggleType.LABEL, + tuning_level=3, + ), + ToggleDefinition( + title=("Status Widget"), + param="ShowCSCStatus", + description=("Show the \"Curve Speed Controller\" target speed on the driving screen."), + parent_param="CurveSpeedController", + tuning_level=2, + ), + ToggleDefinition( + title=("Driving Personalities"), + param="CustomPersonalities", + car_params=["openpilot_longitudinal"], + description=("Customize the \"Driving Personalities\" to better match your driving style."), + icon="../../../frogpilot/assets/toggle_icons/icon_personality.png", + toggle_type=ToggleType.MANAGE, + tuning_level=2, + ), + ToggleDefinition( + title=("Traffic Mode"), + param="TrafficPersonalityProfile", + description=("Customize the \"Traffic Mode\" personality profile. Designed for stop-and-go driving."), + icon="../../../frogpilot/assets/stock_theme/distance_icons/traffic.png", + parent_param="CustomPersonalities", + toggle_type=ToggleType.MANAGE, + tuning_level=2, + ), + ToggleDefinition( + title=("Following Distance"), + param="TrafficFollow", + description=("The minimum following distance to the lead vehicle in \"Traffic Mode\". openpilot blends between this value and the \"Aggressive\" profile as speed increases. Increase for more space; decrease for tighter gaps."), + max_value=3, + min_value=0.5, + parent_param="TrafficPersonalityProfile", + step=0.01, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + ), + ToggleDefinition( + title=("Acceleration Smoothness"), + param="TrafficJerkAcceleration", + description=("How smoothly openpilot accelerates in \"Traffic Mode\". Increase for gentler starts; decrease for faster but more abrupt takeoffs."), + max_value=200, + min_value=25, + parent_param="TrafficPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Braking Smoothness"), + param="TrafficJerkDeceleration", + description=("How smoothly openpilot brakes in \"Traffic Mode\". Increase for gentler stops; decrease for quicker but sharper braking."), + max_value=200, + min_value=25, + parent_param="TrafficPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Safety Gap Bias"), + param="TrafficJerkDanger", + description=("How much extra space openpilot keeps from the vehicle ahead in \"Traffic Mode\". Increase for larger gaps and more cautious following; decrease for tighter gaps and closer following."), + max_value=200, + min_value=25, + parent_param="TrafficPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Slowdown Response"), + param="TrafficJerkSpeedDecrease", + description=("How smoothly openpilot slows down in \"Traffic Mode\". Increase for more gradual deceleration; decrease for faster but sharper slowdowns."), + max_value=200, + min_value=25, + parent_param="TrafficPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Speed-Up Response"), + param="TrafficJerkSpeed", + description=("How smoothly openpilot speeds up in \"Traffic Mode\". Increase for more gradual acceleration; decrease for quicker but more jolting acceleration."), + max_value=200, + min_value=25, + parent_param="TrafficPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Aggressive"), + param="AggressivePersonalityProfile", + description=("Customize the \"Aggressive\" personality profile. Designed for assertive driving with tighter gaps."), + icon="../../../frogpilot/assets/stock_theme/distance_icons/aggressive.png", + parent_param="CustomPersonalities", + toggle_type=ToggleType.MANAGE, + tuning_level=2, + ), + ToggleDefinition( + title=("Following Distance"), + param="AggressiveFollow", + description=("How many seconds openpilot follows behind lead vehicles when using the \"Aggressive\" profile. Increase for more space; decrease for tighter gaps.

Default: 1.25 seconds."), + max_value=3, + min_value=1, + parent_param="AggressivePersonalityProfile", + step=0.01, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + ), + ToggleDefinition( + title=("Acceleration Smoothness"), + param="AggressiveJerkAcceleration", + description=("How smoothly openpilot accelerates with the \"Aggressive\" profile. Increase for gentler starts; decrease for faster but more abrupt takeoffs."), + max_value=200, + min_value=25, + parent_param="AggressivePersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Braking Smoothness"), + param="AggressiveJerkDeceleration", + description=("How smoothly openpilot brakes with the \"Aggressive\" profile. Increase for gentler stops; decrease for quicker but sharper braking."), + max_value=200, + min_value=25, + parent_param="AggressivePersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Safety Gap Bias"), + param="AggressiveJerkDanger", + description=("How much extra space openpilot keeps from the vehicle ahead with the \"Aggressive\" profile. Increase for larger gaps and more cautious following; decrease for tighter gaps and closer following."), + max_value=200, + min_value=25, + parent_param="AggressivePersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Slowdown Response"), + param="AggressiveJerkSpeedDecrease", + description=("How smoothly openpilot slows down with the \"Aggressive\" profile. Increase for more gradual deceleration; decrease for faster but sharper slowdowns."), + max_value=200, + min_value=25, + parent_param="AggressivePersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Speed-Up Response"), + param="AggressiveJerkSpeed", + description=("How smoothly openpilot speeds up with the \"Aggressive\" profile. Increase for more gradual acceleration; decrease for quicker but more jolting acceleration."), + max_value=200, + min_value=25, + parent_param="AggressivePersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Standard"), + param="StandardPersonalityProfile", + description=("Customize the \"Standard\" personality profile. Designed for balanced driving with moderate gaps."), + icon="../../../frogpilot/assets/stock_theme/distance_icons/standard.png", + parent_param="CustomPersonalities", + toggle_type=ToggleType.MANAGE, + tuning_level=2, + ), + ToggleDefinition( + title=("Following Distance"), + param="StandardFollow", + description=("How many seconds openpilot follows behind lead vehicles when using the \"Standard\" profile. Increase for more space; decrease for tighter gaps.

Default: 1.45 seconds."), + max_value=3, + min_value=1, + parent_param="StandardPersonalityProfile", + step=0.01, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + ), + ToggleDefinition( + title=("Acceleration Smoothness"), + param="StandardJerkAcceleration", + description=("How smoothly openpilot accelerates with the \"Standard\" profile. Increase for gentler starts; decrease for faster but more abrupt takeoffs."), + max_value=200, + min_value=25, + parent_param="StandardPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Braking Smoothness"), + param="StandardJerkDeceleration", + description=("How smoothly openpilot brakes with the \"Standard\" profile. Increase for gentler stops; decrease for quicker but sharper braking."), + max_value=200, + min_value=25, + parent_param="StandardPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Safety Gap Bias"), + param="StandardJerkDanger", + description=("How much extra space openpilot keeps from the vehicle ahead with the \"Standard\" profile. Increase for larger gaps and more cautious following; decrease for tighter gaps and closer following."), + max_value=200, + min_value=25, + parent_param="StandardPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Slowdown Response"), + param="StandardJerkSpeedDecrease", + description=("How smoothly openpilot slows down with the \"Standard\" profile. Increase for more gradual deceleration; decrease for faster but sharper slowdowns."), + max_value=200, + min_value=25, + parent_param="StandardPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Speed-Up Response"), + param="StandardJerkSpeed", + description=("How smoothly openpilot speeds up with the \"Standard\" profile. Increase for more gradual acceleration; decrease for quicker but more jolting acceleration."), + max_value=200, + min_value=25, + parent_param="StandardPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Relaxed"), + param="RelaxedPersonalityProfile", + description=("Customize the \"Relaxed\" personality profile. Designed for smoother, more comfortable driving with larger gaps."), + icon="../../../frogpilot/assets/stock_theme/distance_icons/relaxed.png", + parent_param="CustomPersonalities", + toggle_type=ToggleType.MANAGE, + tuning_level=2, + ), + ToggleDefinition( + title=("Following Distance"), + param="RelaxedFollow", + description=("How many seconds openpilot follows behind lead vehicles when using the \"Relaxed\" profile. Increase for more space; decrease for tighter gaps.

Default: 1.75 seconds."), + max_value=3, + min_value=1, + parent_param="RelaxedPersonalityProfile", + step=0.01, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + ), + ToggleDefinition( + title=("Acceleration Smoothness"), + param="RelaxedJerkAcceleration", + description=("How smoothly openpilot accelerates with the \"Relaxed\" profile. Increase for gentler starts; decrease for faster but more abrupt takeoffs."), + max_value=200, + min_value=25, + parent_param="RelaxedPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Braking Smoothness"), + param="RelaxedJerkDeceleration", + description=("How smoothly openpilot brakes with the \"Relaxed\" profile. Increase for gentler stops; decrease for quicker but sharper braking."), + max_value=200, + min_value=25, + parent_param="RelaxedPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Safety Gap Bias"), + param="RelaxedJerkDanger", + description=("How much extra space openpilot keeps from the vehicle ahead with the \"Relaxed\" profile. Increase for larger gaps and more cautious following; decrease for tighter gaps and closer following."), + max_value=200, + min_value=25, + parent_param="RelaxedPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Slowdown Response"), + param="RelaxedJerkSpeedDecrease", + description=("How smoothly openpilot slows down with the \"Relaxed\" profile. Increase for more gradual deceleration; decrease for faster but sharper slowdowns."), + max_value=200, + min_value=25, + parent_param="RelaxedPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Speed-Up Response"), + param="RelaxedJerkSpeed", + description=("How smoothly openpilot speeds up with the \"Relaxed\" profile. Increase for more gradual acceleration; decrease for quicker but more jolting acceleration."), + max_value=200, + min_value=25, + parent_param="RelaxedPersonalityProfile", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("Longitudinal Tuning"), + param="LongitudinalTune", + car_params=["openpilot_longitudinal"], + description=("Acceleration and braking control changes to fine-tune how openpilot drives."), + icon="../../../frogpilot/assets/toggle_icons/icon_longitudinal_tune.png", + toggle_type=ToggleType.MANAGE, + tuning_level=0, + ), + ToggleDefinition( + title=("Acceleration Profile"), + param="AccelerationProfile", + button_labels=["SELECT"], + button_options=["Standard", "Eco", "Sport", "Sport+"], + description=("How quickly openpilot speeds up. \"Eco\" is gentle and efficient, \"Sport\" is firmer and more responsive, and \"Sport+\" accelerates at the maximum rate allowed."), + parent_param="LongitudinalTune", + toggle_type=ToggleType.BUTTON_PARAM, + tuning_level=0, + ), + ToggleDefinition( + title=("Deceleration Profile"), + param="DecelerationProfile", + button_labels=["SELECT"], + button_options=["Standard", "Eco", "Sport"], + description=("How firmly openpilot slows down. \"Eco\" favors coasting, \"Sport\" applies stronger braking."), + parent_param="LongitudinalTune", + toggle_type=ToggleType.BUTTON_PARAM, + tuning_level=2, + ), + ToggleDefinition( + title=("Human-Like Acceleration"), + param="HumanAcceleration", + description=("Acceleration that mimics human behavior by easing the throttle at low speeds and adding extra power when taking off from a stop."), + parent_param="LongitudinalTune", + tuning_level=2, + ), + ToggleDefinition( + title=("Human-Like Following"), + param="HumanFollowing", + description=("Following behavior that mimics human drivers by closing gaps behind faster vehicles for quicker takeoffs and dynamically adjusting the desired following distance for gentler, more efficient braking."), + parent_param="LongitudinalTune", + tuning_level=2, + ), + ToggleDefinition( + title=("Human-Like Lane Changes"), + param="HumanLaneChanges", + car_params=["radar_support"], + description=("Lane-change behavior that mimics human drivers by anticipating and tracking adjacent vehicles during lane changes."), + parent_param="LongitudinalTune", + tuning_level=2, + ), + ToggleDefinition( + title=("Lead Detection Sensitivity"), + param="LeadDetectionThreshold", + description=("How sensitive openpilot is to detecting vehicles. Higher sensitivity allows quicker detection at longer distances but may react to non-vehicle objects; lower sensitivity is more conservative and reduces false detections."), + max_value=50, + min_value=25, + parent_param="LongitudinalTune", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="%", + ), + ToggleDefinition( + title=("\"Taco Bell Run\" Turn Speed Hack"), + param="TacoTune", + description=("The turn-speed hack from comma's 2022 \"Taco Bell Run\". Designed to slow down for left and right turns."), + parent_param="LongitudinalTune", + tuning_level=2, + ), + ToggleDefinition( + title=("Quality of Life"), + param="QOLLongitudinal", + car_params=["openpilot_longitudinal"], + description=("Miscellaneous acceleration and braking control changes to fine-tune how openpilot drives."), + icon="../../../frogpilot/assets/toggle_icons/icon_quality_of_life.png", + toggle_type=ToggleType.MANAGE, + tuning_level=1, + ), + ToggleDefinition( + title=("Cruise Interval"), + param="CustomCruise", + car_params=["!pcm_cruise", "openpilot_longitudinal"], + description=("How much the set speed increases or decreases for each + or – cruise control button press."), + max_value=99, + min_value=1, + parent_param="QOLLongitudinal", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="mph", + ), + ToggleDefinition( + title=("Cruise Interval (Hold)"), + param="CustomCruiseLong", + car_params=["!pcm_cruise", "openpilot_longitudinal"], + description=("How much the set speed increases or decreases while holding the + or – cruise control buttons."), + max_value=99, + min_value=1, + parent_param="QOLLongitudinal", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="mph", + ), + ToggleDefinition( + title=("Force Stop at \"Detected\" Stop Lights/Signs"), + param="ForceStops", + description=("Force openpilot to stop whenever the driving model \"detects\" a red light or stop sign.

Disclaimer: openpilot does not explicitly detect traffic lights or stop signs. In \"Experimental Mode\", openpilot makes end-to-end driving decisions from camera input, which means it may stop even when there's no clear reason!"), + parent_param="QOLLongitudinal", + tuning_level=2, + ), + ToggleDefinition( + title=("Increase Stopped Distance by:"), + param="IncreasedStoppedDistance", + description=("Add extra space when stopped behind vehicles. Increase for more room; decrease for shorter gaps."), + max_value=10, + min_value=0, + parent_param="QOLLongitudinal", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=1, + unit="feet", + ), + ToggleDefinition( + title=("Map Accel/Decel to Gears"), + param="MapGears", + button_labels=["Acceleration", "Deceleration"], + button_options=["MapAcceleration", "MapDeceleration"], + car_params=["toyota_brand"], + description=("Map the Acceleration or Deceleration profiles to the vehicle's \"Eco\" and \"Sport\" gear modes."), + parent_param="QOLLongitudinal", + toggle_type=ToggleType.BUTTON_TOGGLE, + tuning_level=2, + ), + ToggleDefinition( + title=("Acceleration"), + param="MapAcceleration", + car_params=["toyota_brand"], + description=("Apply acceleration profile mapping to gear changes."), + parent_param="MapGears", + tuning_level=1, + ), + ToggleDefinition( + title=("Deceleration"), + param="MapDeceleration", + car_params=["toyota_brand"], + description=("Apply deceleration profile mapping to gear changes."), + parent_param="MapGears", + tuning_level=1, + ), + ToggleDefinition( + title=("Offset Set Speed by:"), + param="SetSpeedOffset", + car_params=["!pcm_cruise", "openpilot_longitudinal"], + description=("Increase the set speed by the chosen offset. For example, set +5 if you usually drive 5 over the limit."), + max_value=99, + min_value=0, + parent_param="QOLLongitudinal", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="mph", + ), + ToggleDefinition( + title=("Reverse Cruise Increase"), + param="ReverseCruise", + car_params=["toyota_brand", "openpilot_longitudinal", "pcm_cruise"], + description=("Reverse the cruise control button behavior so a short press increases the set speed by 5 instead of 1."), + parent_param="QOLLongitudinal", + tuning_level=1, + ), + ToggleDefinition( + title=("Weather Condition Offsets"), + param="WeatherPresets", + description=("Automatically adjust driving behavior based on real-time weather. Helps maintain comfort and safety in low visibility, rain, or snow."), + parent_param="QOLLongitudinal", + toggle_type=ToggleType.MANAGE, + tuning_level=2, + ), + ToggleDefinition( + title=("Low Visibility"), + param="LowVisibilityOffsets", + button_labels=["MANAGE"], + description=("Driving adjustments for fog, haze, or other low-visibility conditions."), + parent_param="WeatherPresets", + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Increase Following Distance by:"), + param="IncreaseFollowingLowVisibility", + description=("Add extra space behind lead vehicles in low visibility. Increase for more space; decrease for tighter gaps."), + max_value=3, + min_value=0, + parent_param="LowVisibilityOffsets", + step=0.01, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + ), + ToggleDefinition( + title=("Increase Stopped Distance by:"), + param="IncreasedStoppedDistanceLowVisibility", + description=("Add extra buffer when stopped behind vehicles in low visibility. Increase for more room; decrease for shorter gaps."), + max_value=10, + min_value=0, + parent_param="LowVisibilityOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="feet", + ), + ToggleDefinition( + title=("Reduce Acceleration by:"), + param="ReduceAccelerationLowVisibility", + description=("Lower the maximum acceleration in low visibility. Increase for softer takeoffs; decrease for quicker but less stable takeoffs."), + max_value=99, + min_value=0, + parent_param="LowVisibilityOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="%", + ), + ToggleDefinition( + title=("Reduce Speed in Curves by:"), + param="ReduceLateralAccelerationLowVisibility", + description=("Lower the desired speed while driving through curves in low visibility. Increase for safer, gentler turns; decrease for more aggressive driving in curves."), + max_value=99, + min_value=0, + parent_param="LowVisibilityOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="%", + ), + ToggleDefinition( + title=("Rain"), + param="RainOffsets", + button_labels=["MANAGE"], + description=("Driving adjustments for rainy conditions."), + parent_param="WeatherPresets", + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Increase Following Distance by:"), + param="IncreaseFollowingRain", + description=("Add extra space behind lead vehicles in rain. Increase for more space; decrease for tighter gaps."), + max_value=3, + min_value=0, + parent_param="RainOffsets", + step=0.01, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + ), + ToggleDefinition( + title=("Increase Stopped Distance by:"), + param="IncreasedStoppedDistanceRain", + description=("Add extra buffer when stopped behind vehicles in rain. Increase for more room; decrease for shorter gaps."), + max_value=10, + min_value=0, + parent_param="RainOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="feet", + ), + ToggleDefinition( + title=("Reduce Acceleration by:"), + param="ReduceAccelerationRain", + description=("Lower the maximum acceleration in rain. Increase for softer takeoffs; decrease for quicker but less stable takeoffs."), + max_value=99, + min_value=0, + parent_param="RainOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="%", + ), + ToggleDefinition( + title=("Reduce Speed in Curves by:"), + param="ReduceLateralAccelerationRain", + description=("Lower the desired speed while driving through curves in rain. Increase for safer, gentler turns; decrease for more aggressive driving in curves."), + max_value=99, + min_value=0, + parent_param="RainOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="%", + ), + ToggleDefinition( + title=("Rainstorms"), + param="RainStormOffsets", + button_labels=["MANAGE"], + description=("Driving adjustments for rainstorms."), + parent_param="WeatherPresets", + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Increase Following Distance by:"), + param="IncreaseFollowingRainStorm", + description=("Add extra space behind lead vehicles in a rainstorm. Increase for more space; decrease for tighter gaps."), + max_value=3, + min_value=0, + parent_param="RainStormOffsets", + step=0.01, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + ), + ToggleDefinition( + title=("Increase Stopped Distance by:"), + param="IncreasedStoppedDistanceRainStorm", + description=("Add extra buffer when stopped behind vehicles in a rainstorm. Increase for more room; decrease for shorter gaps."), + max_value=10, + min_value=0, + parent_param="RainStormOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="feet", + ), + ToggleDefinition( + title=("Reduce Acceleration by:"), + param="ReduceAccelerationRainStorm", + description=("Lower the maximum acceleration in a rainstorm. Increase for softer takeoffs; decrease for quicker but less stable takeoffs."), + max_value=99, + min_value=0, + parent_param="RainStormOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="%", + ), + ToggleDefinition( + title=("Reduce Speed in Curves by:"), + param="ReduceLateralAccelerationRainStorm", + description=("Lower the desired speed while driving through curves in a rainstorm. Increase for safer, gentler turns; decrease for more aggressive driving in curves."), + max_value=99, + min_value=0, + parent_param="RainStormOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="%", + ), + ToggleDefinition( + title=("Snow"), + param="SnowOffsets", + button_labels=["MANAGE"], + description=("Driving adjustments for snowy conditions."), + parent_param="WeatherPresets", + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Increase Following Distance by:"), + param="IncreaseFollowingSnow", + description=("Add extra space behind lead vehicles in snow. Increase for more space; decrease for tighter gaps."), + max_value=3, + min_value=0, + parent_param="SnowOffsets", + step=0.01, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + ), + ToggleDefinition( + title=("Increase Stopped Distance by:"), + param="IncreasedStoppedDistanceSnow", + description=("Add extra buffer when stopped behind vehicles in snow. Increase for more room; decrease for shorter gaps."), + max_value=10, + min_value=0, + parent_param="SnowOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="feet", + ), + ToggleDefinition( + title=("Reduce Acceleration by:"), + param="ReduceAccelerationSnow", + description=("Lower the maximum acceleration in snow. Increase for softer takeoffs; decrease for quicker but less stable takeoffs."), + max_value=99, + min_value=0, + parent_param="SnowOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="%", + ), + ToggleDefinition( + title=("Reduce Speed in Curves by:"), + param="ReduceLateralAccelerationSnow", + description=("Lower the desired speed while driving through curves in snow. Increase for safer, gentler turns; decrease for more aggressive driving in curves."), + max_value=99, + min_value=0, + parent_param="SnowOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="%", + ), + ToggleDefinition( + title=("Speed Limit Controller"), + param="SpeedLimitController", + car_params=["openpilot_longitudinal"], + description=("Limit openpilot's maximum driving speed to the current speed limit obtained from downloaded maps, Mapbox, or the dashboard for supported vehicles (Ford, Genesis, Hyundai, Kia, Lexus, Toyota)."), + icon="../../../frogpilot/assets/toggle_icons/icon_speed_limit.png", + toggle_type=ToggleType.MANAGE, + tuning_level=0, + ), + ToggleDefinition( + title=("Fallback Speed"), + param="SLCFallback", + button_labels=["SELECT"], + button_options=["Set Speed", "Experimental Mode", "Previous Limit"], + description=("The speed used by \"Speed Limit Controller\" when no speed limit is found.

- Set Speed: Use the cruise set speed
- Experimental Mode: Estimate the limit using the driving model
- Previous Limit: Keep using the last confirmed limit"), + parent_param="SpeedLimitController", + toggle_type=ToggleType.BUTTON_PARAM, + tuning_level=1, + ), + ToggleDefinition( + title=("Override Speed"), + param="SLCOverride", + button_labels=["SELECT"], + button_options=["None", "Set With Gas Pedal", "Max Set Speed"], + description=("The speed used by \"Speed Limit Controller\" after you manually drive faster than the posted limit.

- Set with Gas Pedal: Use the highest speed reached while pressing the gas
- Max Set Speed: Use the cruise set speed

Overrides clear when openpilot disengages."), + parent_param="SpeedLimitController", + toggle_type=ToggleType.BUTTON_PARAM, + tuning_level=1, + ), + ToggleDefinition( + title=("Quality of Life"), + param="SLCQOL", + button_labels=["MANAGE"], + description=("Miscellaneous \"Speed Limit Controller\" changes to fine-tune how openpilot drives."), + parent_param="SpeedLimitController", + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Confirm New Speed Limits"), + param="SLCConfirmation", + button_labels=["Lower Limits", "Higher Limits"], + button_options=["SLCConfirmationLower", "SLCConfirmationHigher"], + description=("Ask before changing to a new speed limit. To accept, tap the flashing on-screen widget or press the Cruise Increase button. To deny, press the Cruise Decrease button or ignore the prompt for 30 seconds."), + parent_param="SLCQOL", + toggle_type=ToggleType.BUTTON_TOGGLE, + tuning_level=0, + ), + ToggleDefinition( + title=("Lower Limits"), + param="SLCConfirmationLower", + description=("Request confirmation when the detected speed limit decreases."), + parent_param="SLCConfirmation", + tuning_level=0, + ), + ToggleDefinition( + title=("Higher Limits"), + param="SLCConfirmationHigher", + description=("Request confirmation when the detected speed limit increases."), + parent_param="SLCConfirmation", + tuning_level=0, + ), + ToggleDefinition( + title=("Force MPH from Dashboard"), + param="ForceMPHDashboard", + description=("Always read dashboard speed limit signs in mph. Turn this on if the cluster shows mph but the limit is interpreted as km/h."), + parent_param="SLCQOL", + tuning_level=3, + ), + ToggleDefinition( + title=("Higher Limit Lookahead Time"), + param="SLCLookaheadHigher", + description=("How far ahead openpilot anticipates upcoming higher speed limits from downloaded map data."), + max_value=30, + min_value=0, + parent_param="SLCQOL", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="seconds", + ), + ToggleDefinition( + title=("Lower Limit Lookahead Time"), + param="SLCLookaheadLower", + description=("How far ahead openpilot anticipates upcoming lower speed limits from downloaded map data."), + max_value=30, + min_value=0, + parent_param="SLCQOL", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="seconds", + ), + ToggleDefinition( + title=("Match Speed Limit on Engage"), + param="SetSpeedLimit", + car_params=["!pcm_cruise"], + description=("When openpilot is first enabled, automatically set the max speed to the current posted limit."), + parent_param="SLCQOL", + tuning_level=1, + ), + ToggleDefinition( + title=("Use Mapbox as Fallback"), + param="SLCMapboxFiller", + depends_on=["MapboxSecretKey"], + description=("Use Mapbox speed-limit data when no other source is available."), + parent_param="SLCQOL", + tuning_level=1, + ), + ToggleDefinition( + title=("Speed Limit Source Priority"), + param="SLCPriority", + button_labels=["SELECT"], + description=("The source order for speed limits when more than one is available."), + parent_param="SpeedLimitController", + toggle_type=ToggleType.BUTTON, + tuning_level=2, + ), + ToggleDefinition( + title=("Speed Limit Offsets"), + param="SLCOffsets", + button_labels=["MANAGE"], + description=("Add an offset to the posted speed limit to better match your driving style."), + parent_param="SpeedLimitController", + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Speed Offset (0–24 mph)"), + param="Offset1", + description=("How much to offset posted speed-limits between 0 and 24 mph."), + max_value=99, + min_value=-99, + parent_param="SLCOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=0, + unit="mph", + ), + ToggleDefinition( + title=("Speed Offset (25–34 mph)"), + param="Offset2", + description=("How much to offset posted speed-limits between 25 and 34 mph."), + max_value=99, + min_value=-99, + parent_param="SLCOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=0, + unit="mph", + ), + ToggleDefinition( + title=("Speed Offset (35–44 mph)"), + param="Offset3", + description=("How much to offset posted speed-limits between 35 and 44 mph."), + max_value=99, + min_value=-99, + parent_param="SLCOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=0, + unit="mph", + ), + ToggleDefinition( + title=("Speed Offset (45–54 mph)"), + param="Offset4", + description=("How much to offset posted speed-limits between 45 and 54 mph."), + max_value=99, + min_value=-99, + parent_param="SLCOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=0, + unit="mph", + ), + ToggleDefinition( + title=("Speed Offset (55–64 mph)"), + param="Offset5", + description=("How much to offset posted speed-limits between 55 and 64 mph."), + max_value=99, + min_value=-99, + parent_param="SLCOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=0, + unit="mph", + ), + ToggleDefinition( + title=("Speed Offset (65–74 mph)"), + param="Offset6", + description=("How much to offset posted speed-limits between 65 and 74 mph."), + max_value=99, + min_value=-99, + parent_param="SLCOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=0, + unit="mph", + ), + ToggleDefinition( + title=("Speed Offset (75–99 mph)"), + param="Offset7", + description=("How much to offset posted speed-limits between 75 and 99 mph."), + max_value=99, + min_value=-99, + parent_param="SLCOffsets", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=0, + unit="mph", + ), + ToggleDefinition( + title=("Visual Settings"), + param="SLCVisuals", + button_labels=["MANAGE"], + description=("Visual \"Speed Limit Controller\" changes to fine-tune how the driving screen looks."), + parent_param="SpeedLimitController", + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Show Speed Limit Offset"), + param="ShowSLCOffset", + description=("Show the current offset from the posted limit on the driving screen."), + parent_param="SLCVisuals", + tuning_level=0, + ), + ToggleDefinition( + title=("Show Speed Limit Sources"), + param="SpeedLimitSources", + description=("Display the speed-limit sources and their current values on the driving screen."), + parent_param="SLCVisuals", + tuning_level=3, + ), +) + + +STEERING_TOGGLES = ( + ToggleDefinition( + title=("Advanced Lateral Tuning"), + param="AdvancedLateralTune", + description=("Advanced steering control changes to fine-tune how openpilot drives."), + icon="../../../frogpilot/assets/toggle_icons/icon_advanced_lateral_tune.png", + toggle_type=ToggleType.MANAGE, + tuning_level=3, + ), + ToggleDefinition( + title=("Actuator Delay"), + param="SteerDelay", + button_labels=["Reset"], + description=("The time between openpilot's steering command and the vehicle's response. Increase if the vehicle reacts late; decrease if it feels jumpy. Auto-learned by default."), + max_value=1, + min_value=0.01, + parent_param="AdvancedLateralTune", + step=0.01, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=3, + ), + ToggleDefinition( + title=("Friction"), + param="SteerFriction", + button_labels=["Reset"], + depends_on=["!ForceAutoTune", "!LateralTune", "!NNFF", "ForceAutoTuneOff", "ForceTorqueController"], + description=("Compensates for steering friction. Increase if the wheel sticks near center; decrease if it jitters. Auto-learned by default."), + max_value=1, + min_value=0, + parent_param="AdvancedLateralTune", + step=0.01, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=3, + ), + ToggleDefinition( + title=("Kp Factor"), + param="SteerKP", + car_params=["torque_lateral_tuning"], + button_labels=["Reset"], + depends_on=["ForceTorqueController", "LateralTune", "NNFF"], + description=("How strongly openpilot corrects lane position. Higher is tighter but twitchier; lower is smoother but slower. Auto-learned by default."), + parent_param="AdvancedLateralTune", + step=0.01, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=3, + ), + ToggleDefinition( + title=("Lateral Acceleration"), + param="SteerLatAccel", + button_labels=["Reset"], + depends_on=["!ForceAutoTune", "!LateralTune", "!NNFF", "ForceAutoTuneOff", "ForceTorqueController"], + description=("Maps steering torque to turning response. Increase for sharper turns; decrease for gentler steering. Auto-learned by default."), + parent_param="AdvancedLateralTune", + step=0.01, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=3, + ), + ToggleDefinition( + title=("Steer Ratio"), + param="SteerRatio", + button_labels=["Reset"], + depends_on=["!ForceAutoTune", "ForceAutoTuneOff"], + description=("The relationship between steering wheel rotation and road wheel angle. Increase if steering feels too quick or twitchy; decrease if it feels too slow or weak. Auto-learned by default."), + parent_param="AdvancedLateralTune", + step=0.01, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=3, + ), + ToggleDefinition( + title=("Force Auto-Tune On"), + param="ForceAutoTune", + car_params=["torque_lateral_tuning", "!has_auto_lateral_tune"], + depends_on=["ForceTorqueController", "LateralTune", "NNFF"], + description=("Force-enable openpilot's live auto-tuning for \"Friction\" and \"Lateral Acceleration\"."), + parent_param="AdvancedLateralTune", + tuning_level=3, + ), + ToggleDefinition( + title=("Force Auto-Tune Off"), + param="ForceAutoTuneOff", + car_params=["torque_lateral_tuning", "has_auto_lateral_tune"], + description=("Force-disable openpilot's live auto-tuning for \"Friction\" and \"Lateral Acceleration\" and use the set value instead."), + parent_param="AdvancedLateralTune", + tuning_level=3, + ), + ToggleDefinition( + title=("Force Torque Controller"), + param="ForceTorqueController", + car_params=["!torque_lateral_tuning"], + description=("Use torque-based steering control instead of angle-based control for smoother lane keeping, especially in curves."), + parent_param="AdvancedLateralTune", + reboot_required=True, + tuning_level=3, + ), + ToggleDefinition( + title=("Always On Lateral"), + param="AlwaysOnLateral", + description=("openpilot's steering remains active even when the accelerator or brake pedals are pressed."), + icon="../../../frogpilot/assets/toggle_icons/icon_always_on_lateral.png", + reboot_required=True, + toggle_type=ToggleType.MANAGE, + tuning_level=0, + ), + ToggleDefinition( + title=("Enable With Cruise Control"), + param="AlwaysOnLateralMain", + description=("Enable \"Always On Lateral\" whenever \"Cruise Control\" is on, even when openpilot is not engaged."), + parent_param="AlwaysOnLateral", + tuning_level=2, + ), + ToggleDefinition( + title=("Enable With LKAS"), + param="AlwaysOnLateralLKAS", + description=("Enable \"Always On Lateral\" whenever \"LKAS\" is on, even when openpilot is not engaged."), + parent_param="AlwaysOnLateral", + tuning_level=2, + ), + ToggleDefinition( + title=("Pause on Brake Press Below"), + param="PauseAOLOnBrake", + description=("Pause \"Always On Lateral\" below the set speed while the brake pedal is pressed."), + max_value=99, + min_value=0, + parent_param="AlwaysOnLateral", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=1, + ), + ToggleDefinition( + title=("Lane Changes"), + param="LaneChanges", + description=("Allow openpilot to change lanes."), + icon="../../../frogpilot/assets/toggle_icons/icon_lane.png", + toggle_type=ToggleType.MANAGE, + tuning_level=0, + ), + ToggleDefinition( + title=("Automatic Lane Changes"), + param="NudgelessLaneChange", + description=("When the turn signal is on, openpilot will automatically change lanes. No steering-wheel nudge required!"), + parent_param="LaneChanges", + tuning_level=0, + ), + ToggleDefinition( + title=("Lane Change Delay"), + param="LaneChangeTime", + depends_on=["LaneChanges", "NudgelessLaneChange"], + description=("Delay between turn signal activation and the start of an automatic lane change."), + max_value=5, + min_value=0, + parent_param="LaneChanges", + step=0.1, + toggle_type=ToggleType.NUMERIC, + tuning_level=1, + value_map={0: "Instant"}, + ), + ToggleDefinition( + title=("Minimum Lane Change Speed"), + param="MinimumLaneChangeSpeed", + description=("Lowest speed at which openpilot will change lanes."), + max_value=99, + min_value=0, + parent_param="LaneChanges", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + ), + ToggleDefinition( + title=("Minimum Lane Width"), + param="LaneDetectionWidth", + depends_on=["LaneChanges", "NudgelessLaneChange"], + description=("Prevent automatic lane changes into lanes narrower than the set width."), + max_value=15, + min_value=0, + parent_param="LaneChanges", + step=0.1, + toggle_type=ToggleType.NUMERIC, + tuning_level=1, + ), + ToggleDefinition( + title=("One Lane Change Per Signal"), + param="OneLaneChange", + description=("Limit automatic lane changes to one per turn-signal activation."), + parent_param="LaneChanges", + tuning_level=2, + ), + ToggleDefinition( + title=("Lateral Tuning"), + param="LateralTune", + description=("Miscellaneous steering control changes to fine-tune how openpilot drives."), + icon="../../../frogpilot/assets/toggle_icons/icon_lateral_tune.png", + toggle_type=ToggleType.MANAGE, + tuning_level=1, + ), + ToggleDefinition( + title=("Force Turn Desires Below Lane Change Speed"), + param="TurnDesires", + description=("While driving below the minimum lane change speed with an active turn signal, instruct openpilot to turn left/right."), + parent_param="LateralTune", + tuning_level=2, + ), + ToggleDefinition( + title=("Neural Network Feedforward (NNFF)"), + param="NNFF", + description=("Twilsonco's \"Neural Network FeedForward\" controller. Uses a trained neural network model to predict steering torque based on vehicle speed, roll, and past/future planned path data for smoother, model-based steering."), + parent_param="LateralTune", + reboot_required=True, + tuning_level=2, + ), + ToggleDefinition( + title=("Neural Network Feedforward (NNFF) Lite"), + param="NNFFLite", + depends_on=["!LateralTune", "!NNFF"], + description=("A lightweight version of Twilsonco's \"Neural Network FeedForward\" controller. Uses the \"look-ahead\" planned lateral jerk logic from the full model to help smoothen steering adjustments in curves, but does not use the full neural network for torque calculation."), + parent_param="LateralTune", + reboot_required=True, + tuning_level=2, + ), + ToggleDefinition( + title=("Quality of Life"), + param="QOLLateral", + description=("Steering control changes to fine-tune how openpilot drives."), + icon="../../../frogpilot/assets/toggle_icons/icon_quality_of_life.png", + toggle_type=ToggleType.MANAGE, + tuning_level=1, + ), + ToggleDefinition( + title=("Pause Steering Below"), + param="PauseLateralSpeed", + button_labels=["Turn Signal Only"], + description=("Pause steering below the set speed."), + max_value=99, + min_value=0, + parent_param="QOLLateral", + step=1, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=1, + ), + ToggleDefinition( + title=("Turn Signal Only"), + param="PauseLateralOnSignal", + description=("Only pause steering below the set speed while a turn signal is active."), + parent_param="PauseLateralSpeed", + tuning_level=1, + ), +) + + +DEVICE_CONTROLS_TOGGLES = ( + ToggleDefinition( + title=("Device Settings"), + param="DeviceManagement", + description=("Settings that control how the device runs, powers off, and manages driving data."), + icon="../../../frogpilot/assets/toggle_icons/icon_device.png", + toggle_type=ToggleType.MANAGE, + tuning_level=1, + ), + ToggleDefinition( + title=("Device Shutdown Timer"), + param="DeviceShutdown", + description=("Keep the device on for the set amount of time after a drive before it shuts down automatically."), + max_value=33, + min_value=0, + parent_param="DeviceManagement", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=1, + value_map={0: "5 mins", 1: "15 mins", 2: "30 mins", 3: "45 mins", 4: "1 hour", 5: "2 hours", 6: "3 hours", 7: "4 hours", 8: "5 hours", 9: "6 hours", 10: "7 hours", 11: "8 hours", 12: "9 hours", 13: "10 hours", 14: "11 hours", 15: "12 hours", 16: "13 hours", 17: "14 hours", 18: "15 hours", 19: "16 hours", 20: "17 hours", 21: "18 hours", 22: "19 hours", 23: "20 hours", 24: "21 hours", 25: "22 hours", 26: "23 hours", 27: "24 hours", 28: "25 hours", 29: "26 hours", 30: "27 hours", 31: "28 hours", 32: "29 hours", 33: "30 hours"}, + ), + ToggleDefinition( + title=("Disable Logging"), + param="NoLogging", + description=("WARNING: This will prevent your drives from being recorded and all data will be unobtainable!

Prevent the device from saving driving data."), + parent_param="DeviceManagement", + tuning_level=2, + ), + ToggleDefinition( + title=("Disable Uploads"), + param="NoUploads", + button_labels=["Disable Onroad Only"], + button_options=["DisableOnroadUploads"], + description=("WARNING: This will prevent your drives from being uploaded to comma connect which will impact debugging and official support from comma!

Prevent the device from uploading driving data."), + parent_param="DeviceManagement", + toggle_type=ToggleType.BUTTON_TOGGLE, + tuning_level=2, + ), + ToggleDefinition( + title=("Disable Onroad Only"), + param="DisableOnroadUploads", + description=("Disable uploads only while driving. Offroad uploads remain enabled."), + parent_param="NoUploads", + tuning_level=2, + ), + ToggleDefinition( + title=("High-Quality Recording"), + param="HigherBitrate", + depends_on=["!DisableOnroadUploads", "DeviceManagement", "NoUploads"], + description=("Save drive footage in higher video quality."), + parent_param="DeviceManagement", + reboot_required=True, + tuning_level=2, + ), + ToggleDefinition( + title=("Low-Voltage Cutoff"), + param="LowVoltageShutdown", + description=("While parked, if the battery voltage falls below the set level, the device shuts down to prevent excessive battery drain."), + max_value=12.5, + min_value=11.8, + parent_param="DeviceManagement", + step=0.1, + toggle_type=ToggleType.NUMERIC, + tuning_level=3, + unit="volts", + ), + ToggleDefinition( + title=("Raise Temperature Limits"), + param="IncreaseThermalLimits", + description=("WARNING: Running at higher temperatures may damage your device!

Allow the device to run at higher temperatures before throttling or shutting down. Use only if you understand the risks!"), + parent_param="DeviceManagement", + tuning_level=2, + ), + ToggleDefinition( + title=("Use Konik Server"), + param="UseKonikServer", + description=("Upload driving data to \"stable.konik.ai\" instead of \"connect.comma.ai\"."), + parent_param="DeviceManagement", + reboot_required=True, + tuning_level=2, + ), + ToggleDefinition( + title=("Screen Settings"), + param="ScreenManagement", + description=("Settings that control screen brightness, screen recording, and timeout duration."), + icon="../../../frogpilot/assets/toggle_icons/icon_light.png", + toggle_type=ToggleType.MANAGE, + tuning_level=1, + ), + ToggleDefinition( + title=("Screen Brightness (Offroad)"), + param="ScreenBrightness", + description=("The screen brightness while not driving."), + max_value=101, + min_value=1, + parent_param="ScreenManagement", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + value_map={0: "Screen Off", 101: "Auto"}, + ), + ToggleDefinition( + title=("Screen Brightness (Onroad)"), + param="ScreenBrightnessOnroad", + description=("The screen brightness while driving."), + max_value=101, + min_value=0, + parent_param="ScreenManagement", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + value_map={0: "Screen Off", 101: "Auto"}, + ), + ToggleDefinition( + title=("Screen Recorder"), + param="ScreenRecorder", + description=("Add a button to the driving screen to record the display."), + parent_param="ScreenManagement", + tuning_level=2, + ), + ToggleDefinition( + title=("Screen Timeout (Offroad)"), + param="ScreenTimeout", + description=("How long the screen stays on after being tapped while not driving."), + max_value=60, + min_value=5, + parent_param="ScreenManagement", + step=5, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="seconds", + ), + ToggleDefinition( + title=("Screen Timeout (Onroad)"), + param="ScreenTimeoutOnroad", + description=("How long the screen stays on after being tapped while driving."), + max_value=60, + min_value=5, + parent_param="ScreenManagement", + step=5, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="seconds", + ), + ToggleDefinition( + title=("Standby Mode"), + param="StandbyMode", + description=("Turn the screen off while driving and automatically wake it up for alerts or engagement state changes."), + parent_param="ScreenManagement", + tuning_level=1, + ), +) + + +THEME_TOGGLES = ( + ToggleDefinition( + title=("Custom Themes"), + param="PersonalizeOpenpilot", + description=("The overall look and feel of openpilot. Use the \"Theme Maker\" in \"The Pond\" to create and share your own themes!"), + icon="../../../frogpilot/assets/toggle_icons/icon_frog.png", + toggle_type=ToggleType.MANAGE, + tuning_level=0, + ), + ToggleDefinition( + title=("Color Scheme"), + param="CustomColors", + button_labels=["DELETE", "DOWNLOAD", "SELECT"], + description=("The color scheme used throughout openpilot. Use the \"Theme Maker\" in \"The Pond\" to create and share your own themes!"), + parent_param="PersonalizeOpenpilot", + toggle_type=ToggleType.MULTI_BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Distance Button"), + param="CustomDistanceIcons", + button_labels=["DELETE", "DOWNLOAD", "SELECT"], + depends_on=["OnroadDistanceButton", "QOLVisuals"], + description=("The distance button icons shown on the driving screen. Use the \"Theme Maker\" in \"The Pond\" to create and share your own themes!"), + parent_param="PersonalizeOpenpilot", + toggle_type=ToggleType.MULTI_BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Icon Pack"), + param="CustomIcons", + button_labels=["DELETE", "DOWNLOAD", "SELECT"], + description=("The icon style used across openpilot. Use the \"Theme Maker\" in \"The Pond\" to create and share your own themes!"), + parent_param="PersonalizeOpenpilot", + toggle_type=ToggleType.MULTI_BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Sound Pack"), + param="CustomSounds", + button_labels=["DELETE", "DOWNLOAD", "SELECT"], + description=("The sound pack used by openpilot. Use the \"Theme Maker\" in \"The Pond\" to create and share your own themes!"), + parent_param="PersonalizeOpenpilot", + toggle_type=ToggleType.MULTI_BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Steering Wheel"), + param="WheelIcon", + button_labels=["DELETE", "DOWNLOAD", "SELECT"], + description=("The steering-wheel icon shown at the top-right of the driving screen. Use the \"Theme Maker\" in \"The Pond\" to create and share your own themes!"), + parent_param="PersonalizeOpenpilot", + toggle_type=ToggleType.MULTI_BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Turn Signal"), + param="CustomSignals", + button_labels=["DELETE", "DOWNLOAD", "SELECT"], + description=("Themed turn-signal animations. Use the \"Theme Maker\" in \"The Pond\" to create and share your own themes!"), + parent_param="PersonalizeOpenpilot", + toggle_type=ToggleType.MULTI_BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Holiday Themes"), + param="HolidayThemes", + description=("Themes based on U.S. holidays. Minor holidays last one day; major holidays (Christmas, Easter, Halloween) run for a full week."), + icon="../../../frogpilot/assets/toggle_icons/icon_calendar.png", + tuning_level=0, + ), + ToggleDefinition( + title=("Rainbow Path"), + param="RainbowPath", + description=("Color the driving path like a Mario Kart–style \"Rainbow Road\"."), + icon="../../../frogpilot/assets/toggle_icons/icon_rainbow.png", + tuning_level=1, + ), + ToggleDefinition( + title=("Random Events"), + param="RandomEvents", + description=("Occasional on-screen effects triggered by driving conditions. These are purely a visual and don't impact how openpilot drives!"), + icon="../../../frogpilot/assets/toggle_icons/icon_random.png", + tuning_level=1, + ), + ToggleDefinition( + title=("Random Themes"), + param="RandomThemes", + depends_on=["PersonalizeOpenpilot"], + description=("Pick a random theme between each drive from the themes you have downloaded. Great for variety without changing settings while driving."), + icon="../../../frogpilot/assets/toggle_icons/icon_random_themes.png", + tuning_level=1, + ), +) + + +VEHICLE_SETTINGS_TOGGLES = ( + ToggleDefinition( + title=("Disable Automatic Fingerprint Detection"), + param="ForceFingerprint", + description=("Force the selected fingerprint and prevent it from ever changing."), + tuning_level=2, + ), + ToggleDefinition( + title=("Disable openpilot Longitudinal Control"), + param="DisableOpenpilotLongitudinal", + description=("Disable openpilot longitudinal and use the car's stock ACC instead."), + reboot_required=True, + tuning_level=0, + ), + ToggleDefinition( + title=("General Motors Settings"), + param="GMToggles", + button_labels=["MANAGE"], + car_params=["gm_brand"], + description=("FrogPilot features for General Motors vehicles."), + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("FrogsGoMoo's Experimental Tune"), + param="ExperimentalGMTune", + car_params=["gm_brand", "openpilot_longitudinal"], + description=("Experimental GM tune by FrogsGoMoo that attempts to smoothen stopping and takeoff control. Use at your own risk!"), + parent_param="GMToggles", + tuning_level=2, + ), + ToggleDefinition( + title=("Smooth Pedal Response on Hills"), + param="LongPitch", + car_params=["gm_brand", "openpilot_longitudinal"], + description=("Smoothen acceleration and braking when driving downhill/uphill."), + parent_param="GMToggles", + tuning_level=2, + ), + ToggleDefinition( + title=("Stop-and-Go Hack"), + param="VoltSNG", + car_params=["gm_brand", "chevrolet_volt_model"], + description=("Force stop-and-go on the 2017 Chevy Volt."), + parent_param="GMToggles", + tuning_level=2, + ), + ToggleDefinition( + title=("Hyundai/Kia/Genesis Settings"), + param="HKGToggles", + button_labels=["MANAGE"], + car_params=["hyundai_brand"], + description=("FrogPilot features for Genesis, Hyundai, and Kia vehicles."), + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("comma's New Longitudinal API"), + param="NewLongAPI", + car_params=["hyundai_brand", "openpilot_longitudinal"], + description=("comma's new gas and brake control system that improves acceleration and braking but may cause issues on some Genesis/Hyundai/Kia vehicles."), + parent_param="HKGToggles", + tuning_level=3, + ), + ToggleDefinition( + title=("\"Taco Bell Run\" Torque Hack"), + param="TacoTuneHacks", + car_params=["hyundai_brand", "hyundai_canfd_platform"], + description=("The steering torque hack from comma's 2022 \"Taco Bell Run\". Designed to increase steering torque at low speeds for left and right turns."), + parent_param="HKGToggles", + reboot_required=True, + tuning_level=2, + ), + ToggleDefinition( + title=("Acura/Honda Settings"), + param="HondaToggles", + button_labels=["MANAGE"], + car_params=["honda_brand"], + description=("FrogPilot features for Acura and Honda vehicles."), + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Gentle Following"), + param="HondaAltTune", + car_params=["honda_brand", "openpilot_longitudinal", "honda_nidec_platform"], + description=("Reduces jerky acceleration and braking when following a lead vehicle. Ideal for stop-and-go traffic."), + parent_param="HondaToggles", + tuning_level=2, + ), + ToggleDefinition( + title=("Increased Braking Force"), + param="HondaMaxBrake", + car_params=["honda_brand", "openpilot_longitudinal", "honda_nidec_platform"], + description=("Increases the maximum braking force for improved stopping performance."), + parent_param="HondaToggles", + tuning_level=2, + ), + ToggleDefinition( + title=("Responsive Pedal at Low Speeds"), + param="HondaLowSpeedPedal", + car_params=["honda_brand", "openpilot_longitudinal", "gas_interceptor"], + description=("Improves acceleration from a standstill for a more responsive throttle feel in city driving."), + parent_param="HondaToggles", + tuning_level=2, + ), + ToggleDefinition( + title=("Subaru Settings"), + param="SubaruToggles", + button_labels=["MANAGE"], + car_params=["subaru_brand"], + description=("FrogPilot features for Subaru vehicles."), + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Stop and Go"), + param="SubaruSNG", + car_params=["subaru_brand", "!subaru_global_gen2", "!subaru_hybrid"], + description=("Stop and go for supported Subaru vehicles."), + parent_param="SubaruToggles", + tuning_level=2, + ), + ToggleDefinition( + title=("Toyota/Lexus Settings"), + param="ToyotaToggles", + button_labels=["MANAGE"], + car_params=["toyota_brand"], + description=("FrogPilot features for Lexus and Toyota vehicles."), + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Automatically Lock/Unlock Doors"), + param="ToyotaDoors", + button_labels=["Lock", "Unlock"], + button_options=["LockDoors", "UnlockDoors"], + car_params=["toyota_brand"], + description=("Automatically lock/unlock doors when shifting in and out of drive."), + parent_param="ToyotaToggles", + toggle_type=ToggleType.BUTTON_TOGGLE, + tuning_level=0, + ), + ToggleDefinition( + title=("Lock"), + param="LockDoors", + car_params=["toyota_brand"], + description=("Automatically lock doors when shifting into drive."), + parent_param="ToyotaDoors", + tuning_level=0, + ), + ToggleDefinition( + title=("Unlock"), + param="UnlockDoors", + car_params=["toyota_brand"], + description=("Automatically unlock doors when shifting out of drive."), + parent_param="ToyotaDoors", + tuning_level=0, + ), + ToggleDefinition( + title=("Dashboard Speed Offset"), + param="ClusterOffset", + button_labels=["Reset"], + car_params=["toyota_brand"], + description=("The speed offset openpilot uses to match the speed on the dashboard display."), + max_value=1.050, + min_value=1.000, + parent_param="ToyotaToggles", + step=0.001, + toggle_type=ToggleType.NUMERIC_WITH_BUTTON, + tuning_level=2, + unit="x", + ), + ToggleDefinition( + title=("FrogsGoMoo's Personal Tweaks"), + param="FrogsGoMoosTweak", + car_params=["toyota_brand", "openpilot_longitudinal"], + description=("Personal tweaks by FrogsGoMoo for quicker acceleration and smoother braking."), + parent_param="ToyotaToggles", + tuning_level=2, + ), + ToggleDefinition( + title=("Lock Doors On Ignition Off After"), + param="LockDoorsTimer", + car_params=["toyota_brand"], + description=("Automatically lock the doors on ignition off when no one is detected in the front seats."), + max_value=300, + min_value=0, + parent_param="ToyotaToggles", + step=5, + toggle_type=ToggleType.NUMERIC, + tuning_level=0, + unit="seconds", + value_map={0: "Never"}, + ), + ToggleDefinition( + title=("Stop-and-Go Hack"), + param="SNGHack", + car_params=["toyota_brand", "openpilot_longitudinal", "!gas_interceptor", "!stock_sng"], + description=("Force stop-and-go on Lexus/Toyota vehicles without stock stop-and-go functionality."), + parent_param="ToyotaToggles", + tuning_level=2, + ), +) + + +APPEARANCE_TOGGLES = ( + ToggleDefinition( + title=("Advanced UI Controls"), + param="AdvancedCustomUI", + description=("Advanced visual changes to fine-tune how the driving screen looks."), + icon="../../../frogpilot/assets/toggle_icons/icon_advanced_device.png", + toggle_type=ToggleType.MANAGE, + tuning_level=2, + ), + ToggleDefinition( + title=("Hide Current Speed"), + param="HideSpeed", + description=("Hide the current speed from the driving screen."), + parent_param="AdvancedCustomUI", + tuning_level=2, + ), + ToggleDefinition( + title=("Hide Lead Marker"), + param="HideLeadMarker", + car_params=["openpilot_longitudinal"], + description=("Hide the lead-vehicle marker from the driving screen."), + parent_param="AdvancedCustomUI", + tuning_level=2, + ), + ToggleDefinition( + title=("Hide Map Settings Button"), + param="HideMapIcon", + button_labels=["Hide Map"], + button_options=["HideMap"], + description=("Hide the map settings button or map from the driving screen."), + parent_param="AdvancedCustomUI", + toggle_type=ToggleType.BUTTON_TOGGLE, + tuning_level=2, + ), + ToggleDefinition( + title=("Hide Max Speed"), + param="HideMaxSpeed", + description=("Hide the max speed from the driving screen."), + parent_param="AdvancedCustomUI", + tuning_level=2, + ), + ToggleDefinition( + title=("Hide Non-Critical Alerts"), + param="HideAlerts", + description=("Hide non-critical alerts from the driving screen."), + parent_param="AdvancedCustomUI", + tuning_level=2, + ), + ToggleDefinition( + title=("Hide Speed Limits"), + param="HideSpeedLimit", + car_params=["openpilot_longitudinal"], + depends_on=["SpeedLimitController"], + description=("Hide posted speed limits from the driving screen."), + parent_param="AdvancedCustomUI", + tuning_level=2, + ), + ToggleDefinition( + title=("Use Wheel Speed"), + param="WheelSpeed", + description=("Use the vehicle's wheel speed instead of the cluster speed. This is purely a visual change and doesn't impact how openpilot drives!"), + parent_param="AdvancedCustomUI", + tuning_level=2, + ), + ToggleDefinition( + title=("Developer UI"), + param="DeveloperUI", + description=("Detailed information about openpilot's internal operations."), + icon="../../../frogpilot/assets/toggle_icons/icon_advanced_device.png", + toggle_type=ToggleType.MANAGE, + tuning_level=3, + ), + ToggleDefinition( + title=("Developer Metrics"), + param="DeveloperMetrics", + description=("Performance data, sensor readings, and system metrics for debugging and optimizing openpilot."), + parent_param="DeveloperUI", + toggle_type=ToggleType.MANAGE, + tuning_level=3, + ), + ToggleDefinition( + title=("Adjacent Lane Metrics"), + param="AdjacentPathMetrics", + description=("Show the width of the adjacent lanes."), + parent_param="DeveloperMetrics", + tuning_level=3, + ), + ToggleDefinition( + title=("Border Metrics"), + param="BorderMetrics", + button_labels=["Blind Spot", "Steering Torque", "Turn Signal"], + button_options=["BlindSpotMetrics", "ShowSteering", "SignalMetrics"], + description=("Show statuses along the border of the driving screen.

Blind Spot: The border turns red when a vehicle is in a blind spot
Steering Torque: The border goes from green to red according to how much steering torque is being used
Turn Signal: The border flashes yellow when a turn signal is on"), + parent_param="DeveloperMetrics", + toggle_type=ToggleType.BUTTON_TOGGLE, + tuning_level=3, + ), + ToggleDefinition( + title=("Blind Spot"), + param="BlindSpotMetrics", + car_params=["blind_spot_monitoring"], + description=("Turn the border red when a vehicle is in a blind spot."), + parent_param="BorderMetrics", + tuning_level=3, + ), + ToggleDefinition( + title=("Steering Torque"), + param="ShowSteering", + description=("Color the border from green to red based on steering torque usage."), + parent_param="BorderMetrics", + tuning_level=3, + ), + ToggleDefinition( + title=("Turn Signal"), + param="SignalMetrics", + description=("Flash the border yellow when the turn signal is on."), + parent_param="BorderMetrics", + tuning_level=3, + ), + ToggleDefinition( + title=("Lead Info"), + param="LeadInfo", + description=("Show each tracked vehicle's distance and speed below its marker."), + parent_param="DeveloperMetrics", + tuning_level=3, + ), + ToggleDefinition( + title=("FPS Display"), + param="FPSCounter", + description=("Show the frames per second (FPS) at the bottom of the driving screen."), + parent_param="DeveloperMetrics", + tuning_level=3, + ), + ToggleDefinition( + title=("Numerical Temperature Gauge"), + param="NumericalTemp", + button_labels=["Fahrenheit"], + button_options=["Fahrenheit"], + description=("Show a numerical temperature in the sidebar instead of the status labels."), + parent_param="DeveloperMetrics", + toggle_type=ToggleType.BUTTON_TOGGLE, + tuning_level=3, + ), + ToggleDefinition( + title=("Sidebar Metrics"), + param="SidebarMetrics", + button_labels=["CPU", "GPU", "IP", "RAM", "SSD Left", "SSD Used"], + button_options=["ShowCPU", "ShowGPU", "ShowIP", "ShowMemoryUsage", "ShowStorageLeft", "ShowStorageUsed"], + description=("Display system information (CPU, GPU, RAM usage, IP address, device storage) in the sidebar."), + parent_param="DeveloperMetrics", + toggle_type=ToggleType.MULTI_BUTTON, + tuning_level=3, + ), + ToggleDefinition( + title=("Use International System of Units"), + param="UseSI", + description=("Display measurements using the \"International System of Units\" (SI) standard."), + parent_param="DeveloperMetrics", + tuning_level=3, + ), + ToggleDefinition( + title=("Developer Sidebar"), + param="DeveloperSidebar", + description=("Display debugging info and metrics in a dedicated sidebar on the right side of the screen."), + parent_param="DeveloperUI", + toggle_type=ToggleType.MANAGE, + tuning_level=3, + ), + ToggleDefinition( + title=("Metric #1"), + param="DeveloperSidebarMetric1", + button_labels=["SELECT"], + description=("Select the metric shown in the first \"Developer Sidebar\" widget."), + parent_param="DeveloperSidebar", + toggle_type=ToggleType.BUTTON, + tuning_level=3, + ), + ToggleDefinition( + title=("Metric #2"), + param="DeveloperSidebarMetric2", + button_labels=["SELECT"], + description=("Select the metric shown in the second \"Developer Sidebar\" widget."), + parent_param="DeveloperSidebar", + toggle_type=ToggleType.BUTTON, + tuning_level=3, + ), + ToggleDefinition( + title=("Metric #3"), + param="DeveloperSidebarMetric3", + button_labels=["SELECT"], + description=("Select the metric shown in the third \"Developer Sidebar\" widget."), + parent_param="DeveloperSidebar", + toggle_type=ToggleType.BUTTON, + tuning_level=3, + ), + ToggleDefinition( + title=("Metric #4"), + param="DeveloperSidebarMetric4", + button_labels=["SELECT"], + description=("Select the metric shown in the fourth \"Developer Sidebar\" widget."), + parent_param="DeveloperSidebar", + toggle_type=ToggleType.BUTTON, + tuning_level=3, + ), + ToggleDefinition( + title=("Metric #5"), + param="DeveloperSidebarMetric5", + button_labels=["SELECT"], + description=("Select the metric shown in the fifth \"Developer Sidebar\" widget."), + parent_param="DeveloperSidebar", + toggle_type=ToggleType.BUTTON, + tuning_level=3, + ), + ToggleDefinition( + title=("Metric #6"), + param="DeveloperSidebarMetric6", + button_labels=["SELECT"], + description=("Select the metric shown in the sixth \"Developer Sidebar\" widget."), + parent_param="DeveloperSidebar", + toggle_type=ToggleType.BUTTON, + tuning_level=3, + ), + ToggleDefinition( + title=("Metric #7"), + param="DeveloperSidebarMetric7", + button_labels=["SELECT"], + description=("Select the metric shown in the seventh \"Developer Sidebar\" widget."), + parent_param="DeveloperSidebar", + toggle_type=ToggleType.BUTTON, + tuning_level=3, + ), + ToggleDefinition( + title=("Developer Widgets"), + param="DeveloperWidgets", + description=("Overlays for debugging visuals, internal states, and model predictions on the driving screen."), + parent_param="DeveloperUI", + toggle_type=ToggleType.MANAGE, + tuning_level=3, + ), + ToggleDefinition( + title=("Adjacent Leads Tracking"), + param="AdjacentLeadsUI", + description=("Display adjacent leads detected by the car's radar to the left and right of the current driving path."), + parent_param="DeveloperWidgets", + tuning_level=3, + ), + ToggleDefinition( + title=("Model Stopping Point"), + param="ShowStoppingPoint", + car_params=["openpilot_longitudinal"], + button_labels=["Show Distance"], + button_options=["ShowStoppingPointMetrics"], + description=("Show a stop-sign marker where the model intends to stop."), + parent_param="DeveloperWidgets", + toggle_type=ToggleType.BUTTON_TOGGLE, + tuning_level=3, + ), + ToggleDefinition( + title=("Radar Tracks"), + param="RadarTracksUI", + description=("Display all radar points produced by the car's radar."), + parent_param="DeveloperWidgets", + tuning_level=3, + ), + ToggleDefinition( + title=("Driving Screen Widgets"), + param="CustomUI", + description=("Custom FrogPilot widgets for the driving screen."), + icon="../assets/icons/calibration.png", + toggle_type=ToggleType.MANAGE, + tuning_level=1, + ), + ToggleDefinition( + title=("Acceleration Path"), + param="AccelerationPath", + car_params=["openpilot_longitudinal"], + description=("Color the driving path by planned acceleration and braking."), + parent_param="CustomUI", + tuning_level=2, + ), + ToggleDefinition( + title=("Adjacent Lanes"), + param="AdjacentPath", + description=("Show the driving paths for the left and right lanes."), + parent_param="CustomUI", + tuning_level=3, + ), + ToggleDefinition( + title=("Blind Spot Path"), + param="BlindSpotPath", + car_params=["blind_spot_monitoring"], + description=("Show a red path when a vehicle is in that lane's blind spot."), + parent_param="CustomUI", + tuning_level=1, + ), + ToggleDefinition( + title=("Compass"), + param="Compass", + description=("Show the current driving direction with a simple on-screen compass."), + parent_param="CustomUI", + tuning_level=1, + ), + ToggleDefinition( + title=("Driving Personality Button"), + param="OnroadDistanceButton", + car_params=["openpilot_longitudinal"], + description=("Control and view the current driving personality via a driving screen widget."), + parent_param="CustomUI", + tuning_level=0, + ), + ToggleDefinition( + title=("Gas / Brake Pedal Indicators"), + param="PedalsOnUI", + button_labels=["Dynamic", "Static"], + button_options=["DynamicPedalsOnUI", "StaticPedalsOnUI"], + car_params=["openpilot_longitudinal"], + description=("On-screen gas and brake indicators.

Dynamic: Opacity changes according to how much openpilot is accelerating or braking
Static: Full when active, dim when not"), + parent_param="CustomUI", + toggle_type=ToggleType.BUTTON_TOGGLE, + tuning_level=1, + ), + ToggleDefinition( + title=("Dynamic"), + param="DynamicPedalsOnUI", + car_params=["openpilot_longitudinal"], + description=("Show dynamic pedal indicator intensity based on acceleration/braking amount."), + parent_param="PedalsOnUI", + tuning_level=1, + ), + ToggleDefinition( + title=("Static"), + param="StaticPedalsOnUI", + car_params=["openpilot_longitudinal"], + description=("Show static pedal indicators that are full when active and dim when inactive."), + parent_param="PedalsOnUI", + tuning_level=1, + ), + ToggleDefinition( + title=("Rotating Steering Wheel"), + param="RotatingWheel", + description=("Rotate the driving screen wheel with the physical steering wheel."), + parent_param="CustomUI", + tuning_level=1, + ), + ToggleDefinition( + title=("Model UI"), + param="ModelUI", + description=("Model visualizations for the driving path, lane lines, path edges, and road edges."), + icon="../../../frogpilot/assets/toggle_icons/icon_road.png", + toggle_type=ToggleType.MANAGE, + tuning_level=2, + ), + ToggleDefinition( + title=("Dynamic Path Width"), + param="DynamicPathWidth", + description=("Change the path width based on engagement.

Fully Engaged: 100%
Always On Lateral: 75%
Disengaged: 50%"), + parent_param="ModelUI", + tuning_level=2, + ), + ToggleDefinition( + title=("Lane Lines Width"), + param="LaneLinesWidth", + description=("Set the lane-line thickness.

Default matches the MUTCD lane-line width standard of 4 inches."), + max_value=24, + min_value=0, + parent_param="ModelUI", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="inches", + ), + ToggleDefinition( + title=("Path Edges Width"), + param="PathEdgeWidth", + description=("Set the driving-path edge width that represents different driving modes and statuses.

Default is 20% of the total path width.

Color Guide:

- Light Blue: Always On Lateral
- Green: Default
- Orange: Experimental Mode
- Red: Traffic Mode
- Yellow: Conditional Experimental Mode overridden"), + max_value=100, + min_value=0, + parent_param="ModelUI", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="%", + value_map={0: "Off"}, + ), + ToggleDefinition( + title=("Path Width"), + param="PathWidth", + description=("Set the driving-path width.

Default (6.1 feet) matches the width of a 2019 Lexus ES 350."), + max_value=10, + min_value=0, + parent_param="ModelUI", + step=0.1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="feet", + value_map={0: "Off"}, + ), + ToggleDefinition( + title=("Road Edges Width"), + param="RoadEdgesWidth", + description=("Set the road-edge thickness.

Default matches half of the MUTCD lane-line width standard of 4 inches."), + max_value=24, + min_value=0, + parent_param="ModelUI", + step=1, + toggle_type=ToggleType.NUMERIC, + tuning_level=2, + unit="inches", + ), + ToggleDefinition( + title=("\"Unlimited\" Road UI"), + param="UnlimitedLength", + description=("Extend the length of the driving path, lane lines, and road edges for as far as the model can see."), + parent_param="ModelUI", + tuning_level=2, + ), + ToggleDefinition( + title=("Navigation Widgets"), + param="NavigationUI", + description=("Speed limits, and other navigation widgets."), + icon="../../../frogpilot/assets/toggle_icons/icon_map.png", + toggle_type=ToggleType.MANAGE, + tuning_level=1, + ), + ToggleDefinition( + title=("Larger Map Display"), + param="BigMap", + button_labels=["Full Map"], + button_options=["FullMap"], + description=("Increase the map size for easier navigation readings."), + parent_param="NavigationUI", + toggle_type=ToggleType.BUTTON_TOGGLE, + tuning_level=2, + ), + ToggleDefinition( + title=("Map Style"), + param="MapStyle", + description=("Select the map style for \"Navigate on openpilot\" (NOO):

Stock openpilot: Default comma.ai style
FrogPilot: Official FrogPilot map style
Mapbox Streets: Standard street-focused view
Mapbox Outdoors: Emphasizes outdoor and terrain features
Mapbox Light: Minimalist, bright theme
Mapbox Dark: Minimalist, dark theme
Mapbox Navigation Day: Optimized for daytime navigation
Mapbox Navigation Night: Optimized for nighttime navigation
Mapbox Satellite: Satellite imagery only
Mapbox Satellite Streets: Hybrid satellite imagery with street labels
Mapbox Traffic Night: Dark theme emphasizing traffic conditions
Mike's Personalized Style: Customized hybrid satellite view"), + parent_param="NavigationUI", + tuning_level=2, + ), + ToggleDefinition( + title=("Road Name"), + param="RoadNameUI", + description=("Display the road name at the bottom of the driving screen using data from \"OpenStreetMap (OSM)\"."), + parent_param="NavigationUI", + tuning_level=1, + ), + ToggleDefinition( + title=("Show Speed Limits"), + param="ShowSpeedLimits", + depends_on=["!SpeedLimitController"], + description=("Show speed limits in the top-left corner of the driving screen. Uses data from the car's dashboard (if supported) and \"OpenStreetMap (OSM)\"."), + parent_param="NavigationUI", + tuning_level=1, + ), + ToggleDefinition( + title=("Show Speed Limits from Mapbox"), + param="SLCMapboxFiller", + depends_on=["!SpeedLimitController", "MapboxSecretKey", "ShowSpeedLimits"], + description=("Use Mapbox speed-limit data when no other source is available."), + parent_param="NavigationUI", + tuning_level=1, + ), + ToggleDefinition( + title=("Use Vienna-Style Speed Signs"), + param="UseVienna", + depends_on=["ShowSpeedLimits", "SpeedLimitController"], + description=("Show Vienna-style (EU) speed-limit signs instead of MUTCD (US)."), + parent_param="NavigationUI", + tuning_level=1, + ), + ToggleDefinition( + title=("Quality of Life"), + param="QOLVisuals", + description=("Miscellaneous visual changes to fine-tune how the driving screen looks."), + icon="../../../frogpilot/assets/toggle_icons/icon_quality_of_life.png", + toggle_type=ToggleType.MANAGE, + tuning_level=0, + ), + ToggleDefinition( + title=("Camera View"), + param="CameraView", + button_labels=["SELECT"], + button_options=["Auto", "Driver", "Standard", "Wide"], + description=("Select the active camera view. This is purely a visual change and doesn't impact how openpilot drives!"), + parent_param="QOLVisuals", + toggle_type=ToggleType.BUTTON_PARAM, + tuning_level=2, + ), + ToggleDefinition( + title=("Show Driver Camera When In Reverse"), + param="DriverCamera", + description=("Show the driver camera feed when the vehicle is in reverse."), + parent_param="QOLVisuals", + tuning_level=1, + ), + ToggleDefinition( + title=("Stopped Timer"), + param="StoppedTimer", + description=("Show a timer when stopped in place of the current speed to indicate how long the vehicle has been stopped."), + parent_param="QOLVisuals", + tuning_level=1, + ), +) + + +WHEEL_CONTROLS_TOGGLES = ( + ToggleDefinition( + title=("Distance Button"), + param="DistanceButtonControl", + button_labels=["SELECT"], + description=("Action performed when the \"Distance\" button is pressed."), + icon="../../../frogpilot/assets/toggle_icons/icon_mute.png", + toggle_type=ToggleType.BUTTON, + tuning_level=2, + ), + ToggleDefinition( + title=("Distance Button (Long Press)"), + param="LongDistanceButtonControl", + button_labels=["SELECT"], + description=("Action performed when the \"Distance\" button is pressed for more than 0.5 seconds."), + icon="../../../frogpilot/assets/toggle_icons/icon_mute.png", + toggle_type=ToggleType.BUTTON, + tuning_level=2, + ), + ToggleDefinition( + title=("Distance Button (Very Long Press)"), + param="VeryLongDistanceButtonControl", + button_labels=["SELECT"], + description=("Action performed when the \"Distance\" button is pressed for more than 2.5 seconds."), + icon="../../../frogpilot/assets/toggle_icons/icon_mute.png", + toggle_type=ToggleType.BUTTON, + tuning_level=2, + ), + ToggleDefinition( + title=("LKAS Button"), + param="LKASButtonControl", + button_labels=["SELECT"], + car_params=["!subaru_brand"], + depends_on=["!AlwaysOnLateral", "!AlwaysOnLateralLKAS"], + description=("Action performed when the \"LKAS\" button is pressed."), + icon="../../../frogpilot/assets/toggle_icons/icon_mute.png", + toggle_type=ToggleType.BUTTON, + tuning_level=2, + ), +) + + +NAVIGATION_TOGGLES = ( + ToggleDefinition( + title=("Public Mapbox Key"), + param="MapboxPublicKey", + button_labels=["ADD", "TEST"], + description=("Manage your Public Mapbox Key."), + toggle_type=ToggleType.MULTI_BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Secret Mapbox Key"), + param="MapboxSecretKey", + button_labels=["ADD", "TEST"], + description=("Manage your Secret Mapbox Key."), + toggle_type=ToggleType.MULTI_BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Automatically Update Maps"), + param="PreferredSchedule", + button_labels=["SELECT"], + button_options=["Never", "Weekly", "Monthly"], + description=("How often maps update from \"OpenStreetMap (OSM)\" with the latest speed limit information. Weekly updates run every Sunday; monthly updates run on the 1st."), + toggle_type=ToggleType.BUTTON_PARAM, + tuning_level=0, + ), + ToggleDefinition( + title=("Speed Limit Filler"), + param="SpeedLimitFiller", + description=("Automatically collect missing or incorrect speed limits while you drive using speeds limits sourced from your dashboard (if supported), Mapbox, and \"Navigate on openpilot\".

When you're parked and connected to Wi-Fi, FrogPilot will automatically processes this data into a file to be used with the tool located at \"SpeedLimitFiller.frogpilot.com\".

You can download this file from \"The Pond\" in the \"Download Speed Limits\" menu.

Need a step-by-step guide? Visit #speed-limit-filler in the FrogPilot Discord!"), + tuning_level=0, + ), +) + + +UTILITIES_TOGGLES = ( + ToggleDefinition( + title=("Debug Mode"), + param="DebugMode", + description=("Use all of FrogPilot's developer metrics on your next drive to diagnose issues and improve bug reports."), + tuning_level=0, + ), + ToggleDefinition( + title=("Reset Toggles to Default"), + param="DoToggleReset", + button_labels=["RESET"], + description=("Reset all toggles to their default values."), + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), + ToggleDefinition( + title=("Reset Toggles to Stock openpilot"), + param="DoToggleResetStock", + button_labels=["RESET"], + description=("Reset all toggles to match stock openpilot."), + toggle_type=ToggleType.BUTTON, + tuning_level=0, + ), +) + diff --git a/frogpilot/ui/qt/offroad/data_settings.cc b/frogpilot/ui/qt/offroad/data_settings.cc index 4b4e82dc4..27e8d731e 100644 --- a/frogpilot/ui/qt/offroad/data_settings.cc +++ b/frogpilot/ui/qt/offroad/data_settings.cc @@ -650,10 +650,10 @@ void FrogPilotDataPanel::updateStatsLabels(FrogPilotListWidget *labelsList) { {"FrogPilotSeconds", {tr("Total Driving Time"), "time"}}, {"FrogSqueaks", {tr("Total Frog Squeaks"), "count"}}, {"GoatScreams", {tr("Total Goat Screams"), "count"}}, - {"HighestAcceleration", {tr("Highest Acceleration Rate"), "accel"}}, {"LateralTime", {tr("Time Using Lateral Control"), "timePercent"}}, {"LongestDistanceWithoutOverride", {tr("Longest Distance Without an Override"), "distance"}}, {"LongitudinalTime", {tr("Time Using Longitudinal Control"), "timePercent"}}, + {"MaxAcceleration", {tr("Highest Acceleration Rate"), "accel"}}, {"ModelTimes", {tr("Driving Models:"), "parent"}}, {"Month", {tr("Month"), "other"}}, {"NightTime", {tr("Time Driving (Nighttime)"), "timePercent"}}, diff --git a/frogpilot/ui/qt/offroad/device_settings.cc b/frogpilot/ui/qt/offroad/device_settings.cc index 40a147dce..c7a9ecf67 100644 --- a/frogpilot/ui/qt/offroad/device_settings.cc +++ b/frogpilot/ui/qt/offroad/device_settings.cc @@ -48,13 +48,7 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent) : Fr {"ScreenRecorder", tr("Screen Recorder"), tr("Add a button to the driving screen to record the display."), ""}, {"ScreenTimeout", tr("Screen Timeout (Offroad)"), tr("How long the screen stays on after being tapped while not driving."), ""}, {"ScreenTimeoutOnroad", tr("Screen Timeout (Onroad)"), tr("How long the screen stays on after being tapped while driving."), ""}, - {"StandbyMode", tr("Standby Mode"), tr("Turn the screen off while driving and automatically wake it up for alerts or engagement state changes."), ""}, - - {"IgnoreMe", "Ignore Me", "This is simply used to fix the layout when the user opens the descriptions and the menu gets wonky. No idea why it happens, but I can't be asked to properly fix it so whatever. Sue me.", ""}, - {"IgnoreMe2", "Ignore Me", "This is simply used to fix the layout when the user opens the descriptions and the menu gets wonky. No idea why it happens, but I can't be asked to properly fix it so whatever. Sue me.", ""}, - {"IgnoreMe3", "Ignore Me", "This is simply used to fix the layout when the user opens the descriptions and the menu gets wonky. No idea why it happens, but I can't be asked to properly fix it so whatever. Sue me.", ""}, - {"IgnoreMe4", "Ignore Me", "This is simply used to fix the layout when the user opens the descriptions and the menu gets wonky. No idea why it happens, but I can't be asked to properly fix it so whatever. Sue me.", ""}, - {"IgnoreMe5", "Ignore Me", "This is simply used to fix the layout when the user opens the descriptions and the menu gets wonky. No idea why it happens, but I can't be asked to properly fix it so whatever. Sue me.", ""} + {"StandbyMode", tr("Standby Mode"), tr("Turn the screen off while driving and automatically wake it up for alerts or engagement state changes."), ""} }; for (const auto &[param, title, desc, icon] : deviceToggles) { diff --git a/frogpilot/ui/qt/offroad/frogpilot_settings.cc b/frogpilot/ui/qt/offroad/frogpilot_settings.cc index 19300498d..4c3171fe6 100644 --- a/frogpilot/ui/qt/offroad/frogpilot_settings.cc +++ b/frogpilot/ui/qt/offroad/frogpilot_settings.cc @@ -231,6 +231,8 @@ void FrogPilotSettingsWindow::updateTuningLevel() { } void FrogPilotSettingsWindow::showEvent(QShowEvent *event) { + updateTuningLevel(); + static bool alertShown = false; if (forceOpenDescriptions) { diff --git a/frogpilot/ui/qt/offroad/lateral_settings.cc b/frogpilot/ui/qt/offroad/lateral_settings.cc index aa7a9c8c6..dcf154394 100644 --- a/frogpilot/ui/qt/offroad/lateral_settings.cc +++ b/frogpilot/ui/qt/offroad/lateral_settings.cc @@ -66,10 +66,7 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent) : {"NNFFLite", tr("Neural Network Feedforward (NNFF) Lite"), tr("A lightweight version of Twilsonco's \"Neural Network FeedForward\" controller. Uses the \"look-ahead\" planned lateral jerk logic from the full model to help smoothen steering adjustments in curves, but does not use the full neural network for torque calculation."), ""}, {"QOLLateral", tr("Quality of Life"), tr("Steering control changes to fine-tune how openpilot drives."), "../../frogpilot/assets/toggle_icons/icon_quality_of_life.png"}, - {"PauseLateralSpeed", tr("Pause Steering Below"), tr("Pause steering below the set speed."), ""}, - - {"IgnoreMe", "Ignore Me", "This is simply used to fix the layout when the user opens the descriptions and the menu gets wonky. No idea why it happens, but I can't be asked to properly fix it so whatever. Sue me.", ""}, - {"IgnoreMe2", "Ignore Me", "This is simply used to fix the layout when the user opens the descriptions and the menu gets wonky. No idea why it happens, but I can't be asked to properly fix it so whatever. Sue me.", ""} + {"PauseLateralSpeed", tr("Pause Steering Below"), tr("Pause steering below the set speed."), ""} }; for (const auto &[param, title, desc, icon] : lateralToggles) { diff --git a/frogpilot/ui/qt/offroad/theme_settings.cc b/frogpilot/ui/qt/offroad/theme_settings.cc index 04063c708..cfb56cecf 100644 --- a/frogpilot/ui/qt/offroad/theme_settings.cc +++ b/frogpilot/ui/qt/offroad/theme_settings.cc @@ -67,6 +67,7 @@ void deleteThemeAsset(QDir &directory, const QString &subFolder, const QString & void downloadThemeAsset(const QString &input, const std::string ¶mKey, const QString &assetParam, Params ¶ms, Params ¶ms_memory) { QString output = input; + output.replace(" - by: ", "~"); int tilde = output.indexOf("~"); if (tilde >= 0) { output = output.left(tilde).toLower() + "~" + output.mid(tilde + 1); @@ -140,7 +141,7 @@ QStringList getThemeList(const bool &randomThemes, const QDir &themePacksDirecto if (userCreated) { displayName = parts.join(" "); } else { - displayName = (parts.size() <= 1 || useFiles) ? parts.join(" ") : QString("%1 (%2)").arg(parts[0], parts.mid(1).join(" ")); + displayName = (parts.size() <= 1 || useFiles || !baseName.contains("-")) ? parts.join(" ") : QString("%1 (%2)").arg(parts[0], parts.mid(1).join(" ")); } if (userCreated) { diff --git a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc index 40c75d730..ae004cecb 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc +++ b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc @@ -1008,15 +1008,13 @@ void FrogPilotAnnotatedCameraWidget::paintWeather(QPainter &p, const cereal::Fro p.setPen(QPen(blackColor(), 10)); p.drawRoundedRect(weatherRect, 24, 24); - QSharedPointer icon = weatherClearDay; + QSharedPointer icon = frogpilotPlan.getWeatherDaytime() ? weatherClearDay : weatherClearNight; if ((weatherId >= 200 && weatherId <= 232) || (weatherId >= 300 && weatherId <= 321) || (weatherId >= 500 && weatherId <= 531)) { icon = weatherRain; } else if (weatherId >= 600 && weatherId <= 622) { icon = weatherSnow; } else if (weatherId >= 701 && weatherId <= 762) { icon = weatherLowVisibility; - } else if (weatherId == 800) { - icon = frogpilotPlan.getWeatherDaytime() ? weatherClearDay : weatherClearNight; } p.drawPixmap(weatherRect, icon->currentPixmap()); diff --git a/frogpilot/ui/qt/widgets/frogpilot_controls.h b/frogpilot/ui/qt/widgets/frogpilot_controls.h index 8c9baa78b..93725e581 100644 --- a/frogpilot/ui/qt/widgets/frogpilot_controls.h +++ b/frogpilot/ui/qt/widgets/frogpilot_controls.h @@ -67,7 +67,7 @@ class FrogPilotListWidget : public QWidget { outer_layout.addStretch(); } inline void addItem(QWidget *w, bool expanding = false) { - w->setSizePolicy(QSizePolicy::Preferred, expanding ? QSizePolicy::Expanding : QSizePolicy::Fixed); + w->setSizePolicy(QSizePolicy::Preferred, expanding ? QSizePolicy::Expanding : QSizePolicy::Maximum); inner_layout.addWidget(w); } inline void addItem(QLayout *layout) { inner_layout.addLayout(layout); } diff --git a/launch_env.sh b/launch_env.sh index 87f3376a7..81578aff0 100755 --- a/launch_env.sh +++ b/launch_env.sh @@ -11,5 +11,3 @@ if [ -z "$AGNOS_VERSION" ]; then fi export STAGING_ROOT="/data/safe_staging" - -eval "$(/data/openpilot/frogpilot/system/environment_variables)" diff --git a/system/sentry.py b/system/sentry.py index b40f02c4c..5093f0c5a 100644 --- a/system/sentry.py +++ b/system/sentry.py @@ -1,5 +1,4 @@ """Install exception handler for process crash.""" -import os import sentry_sdk import subprocess import traceback @@ -16,9 +15,9 @@ from openpilot.frogpilot.common.frogpilot_variables import ERROR_LOGS_PATH, para class SentryProject(Enum): # python project - SELFDRIVE = os.environ.get("SENTRY_DSN", "") + SELFDRIVE = "https://7ba43fba4cfcf1a6c0eff83d40374e43@o4505034923769856.ingest.us.sentry.io/4505034930651136" # native project - SELFDRIVE_NATIVE = os.environ.get("SENTRY_DSN", "") + SELFDRIVE_NATIVE = "https://7ba43fba4cfcf1a6c0eff83d40374e43@o4505034923769856.ingest.us.sentry.io/4505034930651136" def report_tombstone(fn: str, message: str, contents: str) -> None: @@ -119,7 +118,7 @@ def init(project: SentryProject) -> bool: short_branch = build_metadata.channel if short_branch in ["COMMA", "HEAD"]: - return + return False elif short_branch == "FrogPilot-Development": env = "Development" elif build_metadata.release_channel: diff --git a/system/updated/updated.py b/system/updated/updated.py index a3a842fbc..e18ce1577 100644 --- a/system/updated/updated.py +++ b/system/updated/updated.py @@ -196,15 +196,6 @@ def finalize_update() -> None: run(["git", "reset", "--hard"], FINALIZED) run(["git", "submodule", "foreach", "--recursive", "git", "reset", "--hard"], FINALIZED) - cloudlog.info("Starting git cleanup in finalized update") - t = time.monotonic() - try: - run(["git", "gc"], FINALIZED) - run(["git", "lfs", "prune"], FINALIZED) - cloudlog.event("Done git cleanup", duration=time.monotonic() - t) - except subprocess.CalledProcessError: - cloudlog.exception(f"Failed git cleanup, took {time.monotonic() - t:.3f} s") - if os.path.isfile(BACKUP_PATH): os.remove(BACKUP_PATH)

5d5(w0T1z3|= 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 literal 1032529 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%0DVRZ$s?+ILq29b%q)R-#$s7h*zXS?-uqh zJ>jr7%vISKDhJKFwq#eolwhf(*>f zRtdC&#-}0mEF-Na*H9KNET550VOv`n=tzSuPhRc0G*K$SrtIzM8iQ=8X$&|o(J|kc zw7Pb*PIOGB!DJaDh8>yz#cpaJ@&8bD4$hG_K(~)=bFy(Zwry{0+qO2w#^%JfZQHhu zjlFxb?{~kdd;fr`ntGDo5sXET?B+fQzeE>SLudH()jqitxB>z{H`gPC{@uLLcp9xah8j-N}B zt+(r#Un?c1_ex88=>pevi~DnJkHCnLABf(8g%D1hj88ukL_sWh}Tlc^6=@b9zX3*Xr&NnPz z&-DND4ui+>0wJW@|E$(uW=)ksp>-AXiCLm;_+i8nI&0!=Ch|ofu((SBax5+9v)LQy zk-5>agnJV!V>NT4W5$Xn+P36Y?#NPQ>hiSW1-wxoxJWKYh^qV5(9$~?W@Mc}?VL@4 zMlZF+m^f%>s%y*)xVtqwh<25Y0Sr-~-a3~!-hEhR`5dyw0C{6bGcz@`cLqIdf9;u& zjif2gv%4ynv^u&uq11X%0Lm-jP>6Bz2IvGFsp5mS(avPWy?UHjJ51@A8#r3huLaI7Zh&0Pc z7`4Tj&Bo%%ugRuVNRHc>GN+D**Zdb{>L21z(M<{R@x3o^oT}U?K~Jo%Q)EwFG>yH^ z(9#P1!SIE8t@jb!@y3SF;YQZ9i~eHT3S{!G3 z;=w24wx}B|P{2D>OsB$ypK~voOauCf?uvejj$dQH08788ev-mI4Rj!p zF~g}EeH;2 zzj*+Y_45vwK>M#@)JivY>0g-fyYF^PiB4NE%zH4wT9zr~IabeWSQDk0vSvT%;xEj^ z;P7W#M=qSrpWpIHj1fo}VU0!FM;>&2NDN%J*6IH6QHeW_%HpyVh_(x1s^PoOcCMKq z#vj;5P(`ARp2S|nn~NxoMrb4%%d&GgJUqZ=z0QhozUQ%U`W=(8|H$fnizv_#5HEj) z68}1(&&^q2amY%fF3HfIo|X;i?2k=#Z7kBdf|e*~<{hr9DT`12?H#R;7iCM4OlW?Z zzLsTQUcTxqt2nu(s;(!^kFwg;$XMV2TQ!b7;s7 zar@K64_8$cx(w$z8I@}d<=r9YXr^TI+2njJVgc?+t*|d5&B;Oixar2%(}kmS$HjeW z5b+Aced4nIpmU4pY3PdHSh3qZPPT4!e5J6{+a8`?y6_QycTxE6zNtA(;+KsO%l;!|3XaKnYS z&yAnb=CL!blxzN?2?E!`)w;3jweUTN7kg1VV7*yKZ@}UAGm}0bSMLw4-_3J#$Hfo7 zB>BJMvWE^R5xDzY&Ek)M5(qZ>eUKJKw6{-7+EJUc3vNfoM{iu_ zg`T9iaaMvao%&jNN;N}Xx7A)_eL#I6zr|gHFIgkuUMk)!TNfe9Egel^THRV2Iz^S( zJ2<;*cSBdUx4Z_G?ofCzU5*F-tHaix_!A*4%}&Dk1Fby2 z3qhs?2V+JQ*96-fW&YTG`LI!)AX|>HqG|?a7a_VbI~Obt4}9dWY0^57(WttD{zKniK(maR+i{;7RF52CFr5{oglUHR4h~y> zGY{(sGIVR@Ivynl8TNJpAvtUW?X(@kX_yg|0>O)R+pcK4ak{w_Z3y^#4HN{MnDP7m zk>s-j3fz5FSCd$W2^2uV-y$TQdink^e3f-`8j)hp3&8bAR~b;o=wl}ANFc?m zQwix@kp_#e=IFh3%%gQAm}hB~*Om{d{p{OD!L19~pjBkm|XNZEp_vs zqKitft4H!618YZ}e&s;B8CkLyv(ZS$6GF6_tLsY}<)F$(7Cd!ZI=E-=u3ypduJU?o zAFj0L>P(rsgWFd#dq=7Fn&9RmN^Kr6q^Y7R5=|IhHwC$@V#Qj%ulhp;dPyBOIM zrT99+h!@S5$cf%o8|e(m)T)v}<7LxYW7CccPo0@){Y;J&oKgeNv<;lfv$aTMuG((R za8se#`f!{(E?+}~*t!Mi)!3R|1fgYfqV^sW>yc#5wT+k~Q=*jhvkc zGbLJT9nZ;P6hB@LkPjZh0R0illy!A&5vV{eehS|#UZ+%zMR=9SUsBjY66Sn~G(3q| zeABW|GgTRqHRK#X3V2enc^i0w^4x+wI4}Ge+Wxw^0yhvbkroph>4>Bk$0%p-%y5%( zjr-T-fUtJ7Yg@JX#z6PfPB$cSWFN(9xV7TMf>Dh*wdNUHR&~oE`u4*XF{!_7{eDY` zI$NJZA-afg;w|6@&l;{b_|f2|iT1BQWd|vbG!Z)E4bz|J<-MWSWv{SArs=AO!bxKj zQwnZR;&UZtz}$V^k2H-s_$E4Ia){B0rWPUjzkV&7IfQ$x**QGWOV69Pd5uvK1gf}M z(5{8ww``PXD!>CPo&2}6QjXivWwnL-+&ONnnO-OsKO{0KQu17Ur0*u8vHBHw825Ph zul#mf?I9JZ)%)i(*p3HZBb4tgwOh^B;1zJ=%UzB1goLF*f7F(gW<_!inc)QDzJoNO zWIh#pxU$mRyw&A**ZkzNyjGe|BlN>Pi$9gb@>)}Yhv~cH=hfIXAj;57R`{7_s(inh zEDt>@g70RJJ@bwi%c?T}rg-gx#-jYEfBp-?*Ea}G)yqFvyX*N+wE0^4zHkq=B5Cmd zdRDhBM7G}>%tjP&RE`)It>=#Y?a?u%wOs^IS}U;j&TSoMhjsW!UKb$8 z4*x!I4Yin*gVbPs)RENtF5c9jyo5FMY!tHh=|P}z8O9j(jj3fYkl}zt(yicNX3*8Q zRwv&EFKU8#d08AMmQsVq4?+8D&^`>C-k)q^@i@J-B;fJ{vzBOK+|DrKBy7lJE-TC$ zj8yp zm=a*8+N%1~eb*ehQeASPR$>VmF;SNdXU#M4w)3d)xWBbAvzUE(iJ=o68PHiJU+-Vs zW^e5;fj~~5)$3TGfOHpd@ zo!B93akyP%%2NPpaxI#DnOnTu`d~fM_OdYIhShSkv3J?LJIg+o)k}u2-)@wLSk~N` z_n?zod}$XI7GV7?a%iR(<%x%^c%4Xr!>gGyA#tzEvwemLuHp9_+IlGA8^;=<9$d=6 zgg|f32&3;+g*kayp~H4?PDFptW;$Q8MsMw$Fur-VM?sT^9wg`|*4cEs`>$OCp4_f? zkC!rA@7~CDJg*R^QF`1Tp^jVJm^Lzve>V4amem%X4GGo^nJ(qgqJuB3iF<(;SMZ#)04sQ<*}nT7ux>^CT!Km8CF zETeB9N|*@#oTNp4@rBaziE}37KB^j8E;Ng6M8tF?6YM%05&oE3p?oe!8@eFJ zwonWOe>zt*ih}!BFf$FaP%#7Vu7&4456+`%O-1|;)p$$_<2W!R_%n@bH4HR3F4=j$ z?&_rG^81rtMYcBr7#<6g-&-A1Ugh>Az#nO0+|m-^0^|`3>#b-k%c#hONXMqt7g~!F z@Bz|i@YGWsPOaSBh+Pthx7J|o_bYzI&@H6dvL)eA9vZUE$!SJ^uXG~F z*ghFl0KG8rxT!_53-UBhTfZpGIXGQ<+(0jhXbQ-*O&_64#WIJ)_J%QkZ}v3(taD2@ zudRK3lH`2mjC-X_pAdV)4v?=?`9|W14ymPE)KqoMy=^9iO$v_~M{d_Zy6f_AD9POb z>k>t@Z~1LdVDJpj(^Mp&v{QZ*$BM5zdaM|OHddq}7v2#WcFgBjWWpKa`K>MQ125EZ z`F8ojm5Fsje`0EI#}Li2%LgvL8HO{*y2sArreh=_GBn}prYfx7yEUu!aTZQ=((1*k zA~5AXAc%YOWj5jG1vA<-i{$WY}ylYJKX&ryLax^A#zZ|BRc z^`Spc>`!)I*|j%B9lrx=J?}G;>TWmGj+N?y^{#;#Z{4KQG0ljCDaQ|PO~y$~0Y*K_ zxn?S88DaD2`Y`hC3wYOkzC+|{FJK&bp>ZAzF|Sd%1!Z_O^D&p{FnBdPng9LDu`T96 z@@2$4_v6|H9`?Lnu|CuxP*CDRaZ+Gtd(m0t5paB8lV|w{?)=TYu6cR4AxF25BM<$aITL8ZY0)W>gfqXVkq_O#ry_YX7@o-X6mSdTTT7pXR zHLqcWW-^tH$a^?_S#w$qsh_KEl6VC}lqW-W45s5OW2B^&q~pClfz%y(iFDG0b0|4W ziihUXu{PKMl4(r}HPHm%%r&C3Kfggb%N-9Zj0i0AQD!oN`rMtY@VRk9UPrX=}VdfW43a<^9=qzZKqNR*~-DJHEz zHxppOV4+*|nZ|8tBNNpo9F4hLXRI_`_(M)&{ngHoneE$<1TU??q8|Q_*bwCE3)#-C z>wkHu~M68>uzB$3+vZckARjeviy*_fa0b{Ec@zC2#&XS|3#+$&Ce zb&6(J7sMM^;5fX={reb15Pt!`F_jz6Sj=2P4>1V{d;s_7KZjR(?(m=gs5{#ke%)0a z{$F3jJ7NH34)3qALk2_N185K*hF|+8alqhkHw=Ug+s8rZ;tmFPSC<{jwtjYh-z+{= zt3YE*1F5{?R;h+))6HFSlOB6;JkCzSHL{VxI)P?(4SQBoNm#TM`Aidju;?Tw>8Ivi z0}TUTXF`cDEhv6r#PQ+MGRt#c#N+U6#PL`pc6aoaG)ew;>>0u6bLKT8h=N#j?9;$&jCnDtbn_(Ill zP}iY0k8bQM%{_LA@bx*(2;0SnEeCk$B}1Q`rPEjfv{z`Uwlc*O=UH8p*DvKy8PqjC zBxaoUJVXe@n`drs88}pS-RI3WqJs$o5db^hEsO_`OM{bEt}7>*Swchdh!lQ#>I99; zWe_1>V-|TF{MSW^AAGbJ-oDG5D26qUfahNpR|I!b9)6l^YN~op>9CfmZ5wi{X3p}{ z-&0RyI*EkQxR3{G8?LJ!>9FKeYd`NK{<%z<_ z_|L76RI}V`7k#y}ulY&J%A}*4G+`qAh5>#sRc33s6sa$32puhUd*jw$C;rTuy*HVf zz2l2ihl4xS%}z)7cW)NhCMpS#wt3}AZo)J1nlZxdO?m$&N+HJw5_?{-vETU)YI zN9=Wp--MEM9OTdKqJ{d1{PC3^Ntc;SY%w`Ma|T^07xAkG%m$sU^Qq6x94j+@FWoJKbM@`@PCSG<5txS=;@jxcEpU#PkyPg3vM^ zcbOZV99$?oZIBfYk#FX`KWZjiX>>WI3+qLV9NP7j6Vt`sQG1Pu+JI?qZgMVGtDn1w z+mTKWr}C+qsAvwt=q=x$yeLdUPQe^6@3UY%B%N-a&hB3;AsTp%<&Tia=8aW0mp8mP zMUCPprV=MdPqO-6*jaoqLrrq1`rPS2+B3;wB%q~4N(X|En! zR*`8$tk6%hR*@3cAD-Jv+mOlHgQ=su^~h)T)?7Rh_NOR?D)T8lPHdSnk+17%p+q$@ zj8*$VC$nbXlwM**kupmHC%~L`5=P{_M`=w^7)Kq5uE=yGAKXR*6)K6LWi@!jEV@^$ z!iHdMU5kgBWIoU7Co^oy{yymfwx;ChInhq4YGLLx;Q^T8;Behen86);hB(>R-1{rs z3U)EZE^uk%HidC>zW`%I6)Uh%8Hv2w82;0 zEWy*IR*p2T+fBTAPY;%N)lEJnjjlxM-Z4^$}FFT_WovqaLI66STt zVdUsfkc4N=&hY9C`h6|*ol&VhABZ}i>oTid9wEjX*mBY2d|{%ql*(N0Ko!?)8>_V6 z%?m`tc@jSQT_ipUkJVSp7Y0IFT*)Mc$98o0Woz=1Kh-XAWA3FV92wHFZmU~TwilSb z1&7Uc@%J+u&G7$C;mVI(qeJ+m-}m(NH*%vzAev)))!V(>#kuUOuKvI1`!yznJkSg0 z1n|j^5Sat=`v508#%Z5JT2DM6LE5c-;~mg4qK0K7m0|ysg#=ZcKyM!4;Pv6SIcbUO zxO39E!Tzf`U8e8I#&R9Igla1i4At3u$J;JVt1YH@!aJt$s1P0F?rqfXA%!fEs z4V7^WCg9y6wLACoW9u?azm|Jh(WJmAn=+em9𝔑^tR3^|4u(BGn#{q*{e3rfxn) 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