symphony_bdk_python 2.10.dev0__py3-none-any.whl → 2.11.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- symphony/bdk/core/__init__.py +1 -0
- symphony/bdk/core/activity/__init__.py +1 -2
- symphony/bdk/core/activity/api.py +4 -4
- symphony/bdk/core/activity/command.py +17 -9
- symphony/bdk/core/activity/exception.py +2 -4
- symphony/bdk/core/activity/help_command.py +3 -2
- symphony/bdk/core/activity/parsing/arguments.py +1 -1
- symphony/bdk/core/activity/parsing/command_token.py +5 -4
- symphony/bdk/core/activity/parsing/input_tokenizer.py +13 -5
- symphony/bdk/core/activity/parsing/match_result.py +5 -3
- symphony/bdk/core/activity/parsing/message_entities.py +7 -6
- symphony/bdk/core/activity/parsing/slash_command_pattern.py +22 -7
- symphony/bdk/core/activity/registry.py +17 -7
- symphony/bdk/core/auth/__init__.py +1 -2
- symphony/bdk/core/auth/auth_session.py +33 -14
- symphony/bdk/core/auth/authenticator_factory.py +41 -21
- symphony/bdk/core/auth/bot_authenticator.py +33 -21
- symphony/bdk/core/auth/exception.py +3 -6
- symphony/bdk/core/auth/ext_app_authenticator.py +40 -30
- symphony/bdk/core/auth/jwt_helper.py +36 -15
- symphony/bdk/core/auth/obo_authenticator.py +27 -18
- symphony/bdk/core/auth/tokens_repository.py +5 -6
- symphony/bdk/core/client/__init__.py +2 -2
- symphony/bdk/core/client/api_client_factory.py +40 -22
- symphony/bdk/core/client/trace_id.py +3 -4
- symphony/bdk/core/config/__init__.py +1 -2
- symphony/bdk/core/config/exception.py +2 -4
- symphony/bdk/core/config/loader.py +2 -2
- symphony/bdk/core/config/model/bdk_app_config.py +5 -3
- symphony/bdk/core/config/model/bdk_authentication_config.py +13 -7
- symphony/bdk/core/config/model/bdk_bot_config.py +6 -3
- symphony/bdk/core/config/model/bdk_client_config.py +1 -1
- symphony/bdk/core/config/model/bdk_config.py +12 -7
- symphony/bdk/core/config/model/bdk_datafeed_config.py +7 -6
- symphony/bdk/core/config/model/bdk_datahose_config.py +1 -2
- symphony/bdk/core/config/model/bdk_retry_config.py +7 -3
- symphony/bdk/core/config/model/bdk_rsa_key_config.py +4 -5
- symphony/bdk/core/config/model/bdk_server_config.py +7 -2
- symphony/bdk/core/extension.py +15 -13
- symphony/bdk/core/retry/__init__.py +13 -9
- symphony/bdk/core/retry/_asyncio.py +10 -7
- symphony/bdk/core/retry/strategy.py +5 -2
- symphony/bdk/core/service/__init__.py +1 -2
- symphony/bdk/core/service/application/application_service.py +51 -41
- symphony/bdk/core/service/connection/connection_service.py +14 -23
- symphony/bdk/core/service/connection/model/connection_status.py +1 -0
- symphony/bdk/core/service/datafeed/abstract_ackId_event_loop.py +24 -14
- symphony/bdk/core/service/datafeed/abstract_datafeed_loop.py +16 -7
- symphony/bdk/core/service/datafeed/abstract_datahose_loop.py +2 -2
- symphony/bdk/core/service/datafeed/datafeed_loop_v1.py +18 -10
- symphony/bdk/core/service/datafeed/datafeed_loop_v2.py +31 -21
- symphony/bdk/core/service/datafeed/datahose_loop.py +22 -11
- symphony/bdk/core/service/datafeed/on_disk_datafeed_id_repository.py +10 -4
- symphony/bdk/core/service/datafeed/real_time_event_listener.py +32 -18
- symphony/bdk/core/service/exception.py +3 -6
- symphony/bdk/core/service/health/health_service.py +5 -4
- symphony/bdk/core/service/message/message_parser.py +10 -8
- symphony/bdk/core/service/message/message_service.py +196 -161
- symphony/bdk/core/service/message/messageml_util.py +6 -6
- symphony/bdk/core/service/message/model.py +15 -5
- symphony/bdk/core/service/message/multi_attachments_messages_api.py +134 -219
- symphony/bdk/core/service/obo_services.py +5 -4
- symphony/bdk/core/service/pagination.py +9 -6
- symphony/bdk/core/service/presence/presence_service.py +40 -28
- symphony/bdk/core/service/session/session_service.py +7 -13
- symphony/bdk/core/service/signal/signal_service.py +66 -33
- symphony/bdk/core/service/stream/stream_service.py +186 -69
- symphony/bdk/core/service/stream/stream_util.py +1 -0
- symphony/bdk/core/service/user/model/delegate_action_enum.py +1 -0
- symphony/bdk/core/service/user/model/role_id.py +1 -0
- symphony/bdk/core/service/user/user_service.py +225 -313
- symphony/bdk/core/service/user/user_util.py +4 -6
- symphony/bdk/core/service/version/__init__.py +0 -0
- symphony/bdk/core/service/version/agent_version_service.py +62 -0
- symphony/bdk/core/service_factory.py +50 -53
- symphony/bdk/core/symphony_bdk.py +34 -18
- symphony/bdk/ext/group.py +52 -37
- symphony/bdk/gen/agent_api/attachments_api.py +10 -18
- symphony/bdk/gen/agent_api/audit_trail_api.py +8 -12
- symphony/bdk/gen/agent_api/datafeed_api.py +34 -219
- symphony/bdk/gen/agent_api/datahose_api.py +184 -0
- symphony/bdk/gen/agent_api/dlp_policies_and_dictionary_management_api.py +130 -214
- symphony/bdk/gen/agent_api/messages_api.py +99 -119
- symphony/bdk/gen/agent_api/share_api.py +7 -11
- symphony/bdk/gen/agent_api/signals_api.py +1 -1
- symphony/bdk/gen/agent_api/system_api.py +1 -1
- symphony/bdk/gen/agent_api/util_api.py +13 -21
- symphony/bdk/gen/agent_api/violations_api.py +45 -73
- symphony/bdk/gen/agent_model/ack_id.py +1 -1
- symphony/bdk/gen/agent_model/agent_info.py +1 -1
- symphony/bdk/gen/agent_model/attachment_info.py +1 -1
- symphony/bdk/gen/agent_model/base_message.py +1 -1
- symphony/bdk/gen/agent_model/base_signal.py +1 -1
- symphony/bdk/gen/agent_model/channel_subscriber.py +1 -1
- symphony/bdk/gen/agent_model/channel_subscriber_response.py +1 -1
- symphony/bdk/gen/agent_model/channel_subscription_error.py +1 -1
- symphony/bdk/gen/agent_model/channel_subscription_response.py +1 -1
- symphony/bdk/gen/agent_model/connection_request_message.py +1 -1
- symphony/bdk/gen/agent_model/connection_request_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/datafeed.py +1 -1
- symphony/bdk/gen/agent_model/error.py +1 -1
- symphony/bdk/gen/agent_model/import_response.py +1 -1
- symphony/bdk/gen/agent_model/import_response_list.py +1 -1
- symphony/bdk/gen/agent_model/imported_message.py +1 -1
- symphony/bdk/gen/agent_model/ingestion_error.py +266 -0
- symphony/bdk/gen/agent_model/message.py +1 -1
- symphony/bdk/gen/agent_model/message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/message_import_list.py +1 -1
- symphony/bdk/gen/agent_model/message_list.py +1 -1
- symphony/bdk/gen/agent_model/message_search_query.py +1 -1
- symphony/bdk/gen/agent_model/message_submission.py +1 -1
- symphony/bdk/gen/agent_model/pagination.py +1 -1
- symphony/bdk/gen/agent_model/pagination_cursors.py +1 -1
- symphony/bdk/gen/agent_model/room_created_message.py +1 -1
- symphony/bdk/gen/agent_model/room_created_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/room_deactivated_message.py +1 -1
- symphony/bdk/gen/agent_model/room_deactivated_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/room_member_demoted_from_owner_message.py +1 -1
- symphony/bdk/gen/agent_model/room_member_demoted_from_owner_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/room_member_promoted_to_owner_message.py +1 -1
- symphony/bdk/gen/agent_model/room_member_promoted_to_owner_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/room_reactivated_message.py +1 -1
- symphony/bdk/gen/agent_model/room_reactivated_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/room_tag.py +1 -1
- symphony/bdk/gen/agent_model/room_updated_message.py +1 -1
- symphony/bdk/gen/agent_model/room_updated_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/share_article.py +1 -1
- symphony/bdk/gen/agent_model/share_content.py +1 -1
- symphony/bdk/gen/agent_model/signal.py +1 -1
- symphony/bdk/gen/agent_model/signal_all_of.py +1 -6
- symphony/bdk/gen/agent_model/signal_list.py +1 -1
- symphony/bdk/gen/agent_model/simple_message.py +1 -1
- symphony/bdk/gen/agent_model/success_response.py +1 -1
- symphony/bdk/gen/agent_model/user_joined_room_message.py +1 -1
- symphony/bdk/gen/agent_model/user_joined_room_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/user_left_room_message.py +1 -1
- symphony/bdk/gen/agent_model/user_left_room_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/v1_audit_trail_initiator_list.py +1 -1
- symphony/bdk/gen/agent_model/v1_audit_trail_initiator_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_content_type.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_content.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_collection_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_create_request.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_update_request.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_dictionary_ref.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_matched_policy.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_matched_policy_list.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_outcome.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_policies_collection_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_policy.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_policy_request.py +9 -8
- symphony/bdk/gen/agent_model/v1_dlp_policy_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_signal.py +6 -1
- symphony/bdk/gen/agent_model/v1_dlp_stream.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation_message.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation_message_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation_signal.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation_signal_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation_stream.py +1 -1
- symphony/bdk/gen/agent_model/v1_dlp_violation_stream_response.py +1 -1
- symphony/bdk/gen/agent_model/v1_health_check_response.py +1 -1
- symphony/bdk/gen/agent_model/v2_base_message.py +1 -1
- symphony/bdk/gen/agent_model/v2_error.py +1 -1
- symphony/bdk/gen/agent_model/v2_health_check_response.py +1 -1
- symphony/bdk/gen/agent_model/v2_import_response.py +1 -1
- symphony/bdk/gen/agent_model/v2_import_response_list.py +1 -1
- symphony/bdk/gen/agent_model/v2_imported_message.py +1 -1
- symphony/bdk/gen/agent_model/v2_message.py +1 -1
- symphony/bdk/gen/agent_model/v2_message_all_of.py +1 -1
- symphony/bdk/gen/agent_model/v2_message_import_list.py +1 -1
- symphony/bdk/gen/agent_model/v2_message_list.py +1 -1
- symphony/bdk/gen/agent_model/v2_message_submission.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_dictionary_meta.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_file_classifier_config.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_file_extension_config.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_file_password_config.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_file_size_config.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_policies_collection_response.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_policy.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_policy_applies_to.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_policy_request.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_policy_response.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_rule.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_text_match_config.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation_message.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation_message_response.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation_signal.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation_signal_response.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation_stream.py +1 -1
- symphony/bdk/gen/agent_model/v3_dlp_violation_stream_response.py +1 -1
- symphony/bdk/gen/agent_model/v3_health.py +1 -1
- symphony/bdk/gen/agent_model/v3_health_auth_type.py +1 -1
- symphony/bdk/gen/agent_model/v3_health_component.py +1 -1
- symphony/bdk/gen/agent_model/v3_health_status.py +1 -1
- symphony/bdk/gen/agent_model/v4_attachment_info.py +1 -1
- symphony/bdk/gen/agent_model/v4_connection_accepted.py +1 -1
- symphony/bdk/gen/agent_model/v4_connection_requested.py +1 -1
- symphony/bdk/gen/agent_model/v4_event.py +3 -3
- symphony/bdk/gen/agent_model/v4_event_list.py +1 -1
- symphony/bdk/gen/agent_model/v4_generic_system_event.py +279 -0
- symphony/bdk/gen/agent_model/v4_import_response.py +1 -1
- symphony/bdk/gen/agent_model/v4_import_response_list.py +1 -1
- symphony/bdk/gen/agent_model/v4_imported_message.py +1 -1
- symphony/bdk/gen/agent_model/v4_imported_message_attachment.py +1 -1
- symphony/bdk/gen/agent_model/v4_initiator.py +1 -1
- symphony/bdk/gen/agent_model/v4_instant_message_created.py +1 -1
- symphony/bdk/gen/agent_model/v4_key_value_pair.py +1 -1
- symphony/bdk/gen/agent_model/v4_message.py +1 -1
- symphony/bdk/gen/agent_model/v4_message_blast_response.py +1 -1
- symphony/bdk/gen/agent_model/v4_message_import_list.py +1 -1
- symphony/bdk/gen/agent_model/v4_message_list.py +1 -1
- symphony/bdk/gen/agent_model/v4_message_sent.py +1 -1
- symphony/bdk/gen/agent_model/v4_message_suppressed.py +1 -1
- symphony/bdk/gen/agent_model/v4_payload.py +8 -1
- symphony/bdk/gen/agent_model/v4_room_created.py +1 -1
- symphony/bdk/gen/agent_model/v4_room_deactivated.py +1 -1
- symphony/bdk/gen/agent_model/v4_room_member_demoted_from_owner.py +1 -1
- symphony/bdk/gen/agent_model/v4_room_member_promoted_to_owner.py +1 -1
- symphony/bdk/gen/agent_model/v4_room_properties.py +1 -1
- symphony/bdk/gen/agent_model/v4_room_reactivated.py +1 -1
- symphony/bdk/gen/agent_model/v4_room_updated.py +1 -1
- symphony/bdk/gen/agent_model/v4_shared_post.py +1 -1
- symphony/bdk/gen/agent_model/v4_stream.py +6 -1
- symphony/bdk/gen/agent_model/v4_symphony_elements_action.py +1 -1
- symphony/bdk/gen/agent_model/v4_thumbnail_info.py +1 -1
- symphony/bdk/gen/agent_model/v4_user.py +1 -1
- symphony/bdk/gen/agent_model/v4_user_joined_room.py +1 -1
- symphony/bdk/gen/agent_model/v4_user_left_room.py +1 -1
- symphony/bdk/gen/agent_model/v4_user_requested_to_join_room.py +1 -1
- symphony/bdk/gen/agent_model/v5_datafeed.py +3 -3
- symphony/bdk/gen/agent_model/v5_datafeed_create_body.py +1 -1
- symphony/bdk/gen/agent_model/v5_event_list.py +1 -1
- symphony/bdk/gen/agent_model/v5_events_read_body.py +5 -5
- symphony/bdk/gen/pod_api/app_entitlement_api.py +1 -1
- symphony/bdk/gen/pod_api/application_api.py +1 -1
- symphony/bdk/gen/pod_api/connection_api.py +1 -1
- symphony/bdk/gen/pod_api/default_api.py +1 -1
- symphony/bdk/gen/pod_api/disclaimer_api.py +1 -1
- symphony/bdk/gen/pod_api/info_barriers_api.py +1 -1
- symphony/bdk/gen/pod_api/message_api.py +1 -1
- symphony/bdk/gen/pod_api/message_suppression_api.py +1 -1
- symphony/bdk/gen/pod_api/pod_api.py +1 -1
- symphony/bdk/gen/pod_api/presence_api.py +1 -1
- symphony/bdk/gen/pod_api/room_membership_api.py +1 -1
- symphony/bdk/gen/pod_api/security_api.py +1 -1
- symphony/bdk/gen/pod_api/session_api.py +1 -1
- symphony/bdk/gen/pod_api/streams_api.py +162 -1
- symphony/bdk/gen/pod_api/system_api.py +1 -1
- symphony/bdk/gen/pod_api/user_api.py +264 -2
- symphony/bdk/gen/pod_api/users_api.py +421 -1
- symphony/bdk/gen/pod_model/admin_justified_action.py +1 -1
- symphony/bdk/gen/pod_model/admin_justified_user_action.py +1 -1
- symphony/bdk/gen/pod_model/app_authentication_key.py +1 -1
- symphony/bdk/gen/pod_model/app_authentication_keys.py +1 -1
- symphony/bdk/gen/pod_model/app_notification.py +1 -1
- symphony/bdk/gen/pod_model/app_properties.py +1 -1
- symphony/bdk/gen/pod_model/app_property.py +1 -1
- symphony/bdk/gen/pod_model/application_detail.py +1 -1
- symphony/bdk/gen/pod_model/application_info.py +1 -1
- symphony/bdk/gen/pod_model/assignee_candidate.py +1 -1
- symphony/bdk/gen/pod_model/assignee_candidates.py +1 -1
- symphony/bdk/gen/pod_model/attachment_preview.py +1 -1
- symphony/bdk/gen/pod_model/avatar.py +1 -1
- symphony/bdk/gen/pod_model/avatar_list.py +1 -1
- symphony/bdk/gen/pod_model/avatar_update.py +1 -1
- symphony/bdk/gen/pod_model/bulk_action_result.py +1 -1
- symphony/bdk/gen/pod_model/cert_info.py +1 -1
- symphony/bdk/gen/pod_model/cert_info_item.py +1 -1
- symphony/bdk/gen/pod_model/company_cert.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_attributes.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_detail.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_info.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_info_list.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_status.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_type.py +1 -1
- symphony/bdk/gen/pod_model/company_cert_type_list.py +1 -1
- symphony/bdk/gen/pod_model/conversation_specific_stream_attributes.py +1 -1
- symphony/bdk/gen/pod_model/delegate_action.py +1 -1
- symphony/bdk/gen/pod_model/disclaimer.py +1 -1
- symphony/bdk/gen/pod_model/disclaimer_list.py +1 -1
- symphony/bdk/gen/pod_model/download_receipt_count.py +1 -1
- symphony/bdk/gen/pod_model/error.py +1 -1
- symphony/bdk/gen/pod_model/faceted_match_count.py +1 -1
- symphony/bdk/gen/pod_model/feature.py +1 -1
- symphony/bdk/gen/pod_model/feature_list.py +1 -1
- symphony/bdk/gen/pod_model/file_extension.py +6 -1
- symphony/bdk/gen/pod_model/file_extensions_response.py +1 -1
- symphony/bdk/gen/pod_model/followers_list.py +1 -1
- symphony/bdk/gen/pod_model/followers_list_response.py +1 -1
- symphony/bdk/gen/pod_model/following_list_response.py +1 -1
- symphony/bdk/gen/pod_model/group.py +1 -1
- symphony/bdk/gen/pod_model/group_item.py +1 -1
- symphony/bdk/gen/pod_model/group_list.py +1 -1
- symphony/bdk/gen/pod_model/group_role_scope.py +1 -1
- symphony/bdk/gen/pod_model/im_system_info.py +1 -1
- symphony/bdk/gen/pod_model/immutable_room_attributes.py +1 -1
- symphony/bdk/gen/pod_model/integer_list.py +1 -1
- symphony/bdk/gen/pod_model/languages.py +1 -1
- symphony/bdk/gen/pod_model/member_info.py +1 -1
- symphony/bdk/gen/pod_model/membership_data.py +1 -1
- symphony/bdk/gen/pod_model/membership_list.py +1 -1
- symphony/bdk/gen/pod_model/message_detail.py +1 -1
- symphony/bdk/gen/pod_model/message_details.py +1 -1
- symphony/bdk/gen/pod_model/message_download_receipt_count.py +1 -1
- symphony/bdk/gen/pod_model/message_ids.py +1 -1
- symphony/bdk/gen/pod_model/message_metadata_response.py +1 -1
- symphony/bdk/gen/pod_model/message_metadata_response_parent.py +1 -1
- symphony/bdk/gen/pod_model/message_receipt_detail.py +1 -1
- symphony/bdk/gen/pod_model/message_receipt_detail_response.py +1 -1
- symphony/bdk/gen/pod_model/message_status.py +1 -1
- symphony/bdk/gen/pod_model/message_status_user.py +1 -1
- symphony/bdk/gen/pod_model/message_stream.py +1 -1
- symphony/bdk/gen/pod_model/message_suppression_response.py +1 -1
- symphony/bdk/gen/pod_model/message_user.py +1 -1
- symphony/bdk/gen/pod_model/name_value_pair.py +1 -1
- symphony/bdk/gen/pod_model/pagination.py +1 -1
- symphony/bdk/gen/pod_model/pagination_cursors.py +1 -1
- symphony/bdk/gen/pod_model/password.py +1 -1
- symphony/bdk/gen/pod_model/password_reset.py +1 -1
- symphony/bdk/gen/pod_model/pod_app_entitlement.py +1 -1
- symphony/bdk/gen/pod_model/pod_app_entitlement_list.py +1 -1
- symphony/bdk/gen/pod_model/pod_certificate.py +1 -1
- symphony/bdk/gen/pod_model/policy.py +1 -1
- symphony/bdk/gen/pod_model/policy_list.py +1 -1
- symphony/bdk/gen/pod_model/product.py +1 -1
- symphony/bdk/gen/pod_model/product_list.py +1 -1
- symphony/bdk/gen/pod_model/protocol.py +1 -1
- symphony/bdk/gen/pod_model/role.py +1 -1
- symphony/bdk/gen/pod_model/role_detail.py +1 -1
- symphony/bdk/gen/pod_model/role_detail_list.py +1 -1
- symphony/bdk/gen/pod_model/role_list.py +1 -1
- symphony/bdk/gen/pod_model/room_attributes.py +1 -1
- symphony/bdk/gen/pod_model/room_detail.py +1 -1
- symphony/bdk/gen/pod_model/room_search_criteria.py +1 -1
- symphony/bdk/gen/pod_model/room_specific_stream_attributes.py +1 -1
- symphony/bdk/gen/pod_model/room_system_info.py +1 -1
- symphony/bdk/gen/pod_model/room_tag.py +1 -1
- symphony/bdk/gen/pod_model/service_account_manifest.py +264 -0
- symphony/bdk/gen/pod_model/stream.py +1 -1
- symphony/bdk/gen/pod_model/stream_attachment_item.py +1 -1
- symphony/bdk/gen/pod_model/stream_attachment_response.py +1 -1
- symphony/bdk/gen/pod_model/stream_attributes.py +1 -1
- symphony/bdk/gen/pod_model/stream_filter.py +1 -1
- symphony/bdk/gen/pod_model/stream_list.py +1 -1
- symphony/bdk/gen/pod_model/stream_type.py +1 -1
- symphony/bdk/gen/pod_model/string_id.py +1 -1
- symphony/bdk/gen/pod_model/string_list.py +1 -1
- symphony/bdk/gen/pod_model/success_response.py +1 -1
- symphony/bdk/gen/pod_model/user_app_entitlement.py +1 -1
- symphony/bdk/gen/pod_model/user_app_entitlement_list.py +1 -1
- symphony/bdk/gen/pod_model/user_app_entitlement_patch.py +1 -1
- symphony/bdk/gen/pod_model/user_app_entitlement_patch_enum.py +1 -1
- symphony/bdk/gen/pod_model/user_app_entitlements_patch_list.py +1 -1
- symphony/bdk/gen/pod_model/user_attributes.py +1 -1
- symphony/bdk/gen/pod_model/user_compp.py +1 -1
- symphony/bdk/gen/pod_model/user_connection.py +1 -1
- symphony/bdk/gen/pod_model/user_connection_list.py +1 -1
- symphony/bdk/gen/pod_model/user_connection_request.py +1 -1
- symphony/bdk/gen/pod_model/user_data.py +1 -1
- symphony/bdk/gen/pod_model/user_detail.py +1 -1
- symphony/bdk/gen/pod_model/user_detail_list.py +1 -1
- symphony/bdk/gen/pod_model/user_error.py +1 -1
- symphony/bdk/gen/pod_model/user_filter.py +1 -1
- symphony/bdk/gen/pod_model/user_group_assignee.py +1 -1
- symphony/bdk/gen/pod_model/user_group_assignee_response.py +1 -1
- symphony/bdk/gen/pod_model/user_group_assignee_update.py +1 -1
- symphony/bdk/gen/pod_model/user_group_assignment_response.py +1 -1
- symphony/bdk/gen/pod_model/user_group_create.py +1 -1
- symphony/bdk/gen/pod_model/user_group_data.py +1 -1
- symphony/bdk/gen/pod_model/user_group_membership_data.py +1 -1
- symphony/bdk/gen/pod_model/user_group_membership_request.py +1 -1
- symphony/bdk/gen/pod_model/user_group_membership_response.py +1 -1
- symphony/bdk/gen/pod_model/user_group_membership_response_data.py +1 -1
- symphony/bdk/gen/pod_model/user_group_membership_update.py +1 -1
- symphony/bdk/gen/pod_model/user_group_response.py +1 -1
- symphony/bdk/gen/pod_model/user_group_response_list.py +1 -1
- symphony/bdk/gen/pod_model/user_group_update.py +1 -1
- symphony/bdk/gen/pod_model/user_id.py +1 -1
- symphony/bdk/gen/pod_model/user_id_list.py +1 -1
- symphony/bdk/gen/pod_model/user_info.py +1 -1
- symphony/bdk/gen/pod_model/user_name.py +1 -1
- symphony/bdk/gen/pod_model/user_name_list.py +1 -1
- symphony/bdk/gen/pod_model/user_search_filter.py +1 -1
- symphony/bdk/gen/pod_model/user_search_query.py +1 -1
- symphony/bdk/gen/pod_model/user_search_results.py +1 -1
- symphony/bdk/gen/pod_model/user_status.py +1 -1
- symphony/bdk/gen/pod_model/user_suspension.py +1 -1
- symphony/bdk/gen/pod_model/user_system_info.py +1 -1
- symphony/bdk/gen/pod_model/user_v2.py +1 -1
- symphony/bdk/gen/pod_model/v1_im_attributes.py +1 -1
- symphony/bdk/gen/pod_model/v1_im_detail.py +1 -1
- symphony/bdk/gen/pod_model/v1_session.py +301 -0
- symphony/bdk/gen/pod_model/v1_user_sessions.py +259 -0
- symphony/bdk/gen/pod_model/v2_admin_stream_attributes.py +6 -1
- symphony/bdk/gen/pod_model/v2_admin_stream_filter.py +1 -1
- symphony/bdk/gen/pod_model/v2_admin_stream_info.py +1 -1
- symphony/bdk/gen/pod_model/v2_admin_stream_info_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_admin_stream_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_admin_stream_type.py +1 -1
- symphony/bdk/gen/pod_model/v2_conversation_specific_stream_attributes.py +1 -1
- symphony/bdk/gen/pod_model/v2_member_info.py +1 -1
- symphony/bdk/gen/pod_model/v2_member_info_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_member_user_detail.py +1 -1
- symphony/bdk/gen/pod_model/v2_membership_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_presence.py +1 -1
- symphony/bdk/gen/pod_model/v2_presence_all_of.py +1 -1
- symphony/bdk/gen/pod_model/v2_presence_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_presence_status.py +1 -1
- symphony/bdk/gen/pod_model/v2_room_search_criteria.py +1 -1
- symphony/bdk/gen/pod_model/v2_room_search_criteria_all_of.py +1 -1
- symphony/bdk/gen/pod_model/v2_room_specific_stream_attributes.py +1 -1
- symphony/bdk/gen/pod_model/v2_stream_attributes.py +1 -1
- symphony/bdk/gen/pod_model/v2_stream_type.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_attributes.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_create.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_detail.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_detail_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_key_request.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_list.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_presence.py +1 -1
- symphony/bdk/gen/pod_model/v2_user_presence_all_of.py +1 -1
- symphony/bdk/gen/pod_model/v3_room_attributes.py +6 -1
- symphony/bdk/gen/pod_model/v3_room_detail.py +1 -1
- symphony/bdk/gen/pod_model/v3_room_search_results.py +1 -1
- {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/METADATA +19 -5
- symphony_bdk_python-2.11.0.dist-info/RECORD +546 -0
- symphony_bdk_python-2.10.dev0.dist-info/RECORD +0 -538
- {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/LICENSE +0 -0
- {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/NOTICE +0 -0
- {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/WHEEL +0 -0
|
@@ -10,19 +10,18 @@ DF_V2 = "v2"
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
def log_dfv1_deprecation(version):
|
|
13
|
-
"""Logs a warning message when datafeed v1 is used in the bot configuration
|
|
14
|
-
"""
|
|
13
|
+
"""Logs a warning message when datafeed v1 is used in the bot configuration"""
|
|
15
14
|
if version is not None and version.lower() == DF_V1:
|
|
16
15
|
logging.warning(
|
|
17
16
|
"The datafeed 1 service will be fully replaced by the datafeed 2 service in the future. "
|
|
18
17
|
"Please consider migrating over to datafeed 2. For more information on the timeline as well as on "
|
|
19
18
|
"the benefits of datafeed 2, please reach out to your Technical Account Manager or to our developer "
|
|
20
|
-
"documentation https://docs.developers.symphony.com/building-bots-on-symphony/datafeed)"
|
|
19
|
+
"documentation https://docs.developers.symphony.com/building-bots-on-symphony/datafeed)"
|
|
20
|
+
)
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class BdkDatafeedConfig:
|
|
24
|
-
"""Class holding datafeed specific configuration.
|
|
25
|
-
"""
|
|
24
|
+
"""Class holding datafeed specific configuration."""
|
|
26
25
|
|
|
27
26
|
def __init__(self, config):
|
|
28
27
|
"""
|
|
@@ -33,7 +32,9 @@ class BdkDatafeedConfig:
|
|
|
33
32
|
self.id_file_path = ""
|
|
34
33
|
self.retry = BdkRetryConfig(dict(maxAttempts=BdkRetryConfig.INFINITE_MAX_ATTEMPTS))
|
|
35
34
|
if config is not None:
|
|
36
|
-
self.id_file_path =
|
|
35
|
+
self.id_file_path = (
|
|
36
|
+
Path(config.get(DF_ID_FILE_PATH)) if DF_ID_FILE_PATH in config else ""
|
|
37
|
+
)
|
|
37
38
|
log_dfv1_deprecation(config.get(VERSION))
|
|
38
39
|
self.version = config.get(VERSION)
|
|
39
40
|
if "retry" in config:
|
|
@@ -4,6 +4,7 @@ from datetime import timedelta
|
|
|
4
4
|
|
|
5
5
|
class BdkRetryConfig:
|
|
6
6
|
"""Class containing the retry configuration"""
|
|
7
|
+
|
|
7
8
|
INFINITE_MAX_ATTEMPTS = -1
|
|
8
9
|
DEFAULT_MAX_ATTEMPTS = 10
|
|
9
10
|
DEFAULT_INITIAL_INTERVAL = 500
|
|
@@ -17,9 +18,12 @@ class BdkRetryConfig:
|
|
|
17
18
|
self.max_attempts = config.get("maxAttempts", self.DEFAULT_MAX_ATTEMPTS)
|
|
18
19
|
if self.max_attempts < 0:
|
|
19
20
|
self.max_attempts = sys.maxsize
|
|
20
|
-
self.initial_interval = timedelta(
|
|
21
|
-
|
|
21
|
+
self.initial_interval = timedelta(
|
|
22
|
+
milliseconds=config.get("initialIntervalMillis", self.DEFAULT_INITIAL_INTERVAL)
|
|
23
|
+
)
|
|
22
24
|
self.multiplier = config.get("multiplier", self.DEFAULT_MULTIPLIER)
|
|
23
25
|
if self.multiplier < 1:
|
|
24
26
|
self.multiplier = self.DEFAULT_MULTIPLIER
|
|
25
|
-
self.max_interval = timedelta(
|
|
27
|
+
self.max_interval = timedelta(
|
|
28
|
+
milliseconds=config.get("maxIntervalMillis", self.DEFAULT_MAX_INTERVAL)
|
|
29
|
+
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
class BdkRsaKeyConfig:
|
|
2
|
-
"""Class containing the bot's RSA Key configuration
|
|
3
|
-
|
|
2
|
+
"""Class containing the bot's RSA Key configuration"""
|
|
3
|
+
|
|
4
4
|
def __init__(self, path=None, content=""):
|
|
5
5
|
self._path = path
|
|
6
6
|
self._content = content
|
|
@@ -33,7 +33,7 @@ class BdkRsaKeyConfig:
|
|
|
33
33
|
self._content = None
|
|
34
34
|
|
|
35
35
|
def is_configured(self) -> bool:
|
|
36
|
-
""""Check if the RSA authentication is configured or not
|
|
36
|
+
""" "Check if the RSA authentication is configured or not
|
|
37
37
|
|
|
38
38
|
:return: true if the RSA authentication is configured
|
|
39
39
|
"""
|
|
@@ -53,8 +53,7 @@ class BdkRsaKeyConfig:
|
|
|
53
53
|
|
|
54
54
|
:return: private key content as string.
|
|
55
55
|
"""
|
|
56
|
-
return self._load_key_from_path()
|
|
57
|
-
if self._path is not None else self._content
|
|
56
|
+
return self._load_key_from_path() if self._path is not None else self._content
|
|
58
57
|
|
|
59
58
|
def _load_key_from_path(self):
|
|
60
59
|
with open(self._path, "r") as file:
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
class BdkServerConfig:
|
|
2
2
|
"""Base class for server and client configurations"""
|
|
3
|
+
|
|
3
4
|
DEFAULT_SCHEME: str = "https"
|
|
4
5
|
DEFAULT_HTTPS_PORT: int = 443
|
|
5
6
|
|
|
6
|
-
def __init__(
|
|
7
|
+
def __init__(
|
|
8
|
+
self, scheme=None, port=None, context="", host=None, proxy=None, default_headers=None
|
|
9
|
+
):
|
|
7
10
|
self.scheme = scheme if scheme is not None else self.DEFAULT_SCHEME
|
|
8
11
|
self.port = port if port is not None else self.DEFAULT_HTTPS_PORT
|
|
9
12
|
self.context = context
|
|
@@ -17,7 +20,9 @@ class BdkServerConfig:
|
|
|
17
20
|
:return: scheme://host:port + formatted_context
|
|
18
21
|
:rtype: str
|
|
19
22
|
"""
|
|
20
|
-
return
|
|
23
|
+
return (
|
|
24
|
+
f"{self.scheme}://{self.host}{self.get_port_as_string()}{self.get_formatted_context()}"
|
|
25
|
+
)
|
|
21
26
|
|
|
22
27
|
def get_formatted_context(self) -> str:
|
|
23
28
|
"""Formats the context field
|
symphony/bdk/core/extension.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"""Module for managing extensions.
|
|
2
|
-
|
|
1
|
+
"""Module for managing extensions."""
|
|
2
|
+
|
|
3
3
|
import logging
|
|
4
4
|
from abc import ABC, abstractmethod
|
|
5
5
|
from typing import Union
|
|
@@ -12,8 +12,8 @@ logger = logging.getLogger(__name__)
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class BdkConfigAware(ABC):
|
|
15
|
-
"""Interface that extensions need to implement to have the config injected
|
|
16
|
-
|
|
15
|
+
"""Interface that extensions need to implement to have the config injected"""
|
|
16
|
+
|
|
17
17
|
@abstractmethod
|
|
18
18
|
def set_config(self, bdk_config: BdkConfig):
|
|
19
19
|
"""Method that is called by the :class:`ExtensionService` to inject the BDK configuration.
|
|
@@ -24,8 +24,8 @@ class BdkConfigAware(ABC):
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
class BdkAuthenticationAware(ABC):
|
|
27
|
-
"""Interface that extensions need to implement to have the bot session injected
|
|
28
|
-
|
|
27
|
+
"""Interface that extensions need to implement to have the bot session injected"""
|
|
28
|
+
|
|
29
29
|
@abstractmethod
|
|
30
30
|
def set_bot_session(self, auth_session: AuthSession):
|
|
31
31
|
"""Method that is called by the :class:`ExtensionService` to inject the BDK auth session.
|
|
@@ -36,8 +36,8 @@ class BdkAuthenticationAware(ABC):
|
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
class BdkApiClientFactoryAware(ABC):
|
|
39
|
-
"""Interface that extensions need to implement to have the api client factory injected
|
|
40
|
-
|
|
39
|
+
"""Interface that extensions need to implement to have the api client factory injected"""
|
|
40
|
+
|
|
41
41
|
@abstractmethod
|
|
42
42
|
def set_api_client_factory(self, api_client_factory: ApiClientFactory):
|
|
43
43
|
"""Method that is called by the :class:`ExtensionService` to inject the BDK api client factory.
|
|
@@ -48,8 +48,8 @@ class BdkApiClientFactoryAware(ABC):
|
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
class BdkExtensionServiceProvider(ABC):
|
|
51
|
-
"""Interface that extensions need to implement to expose a service
|
|
52
|
-
|
|
51
|
+
"""Interface that extensions need to implement to expose a service"""
|
|
52
|
+
|
|
53
53
|
@abstractmethod
|
|
54
54
|
def get_service(self):
|
|
55
55
|
"""Method that is called by the :func:`~ExtensionService.service`
|
|
@@ -59,8 +59,8 @@ class BdkExtensionServiceProvider(ABC):
|
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
class ExtensionService:
|
|
62
|
-
"""Service class for managing extensions
|
|
63
|
-
|
|
62
|
+
"""Service class for managing extensions"""
|
|
63
|
+
|
|
64
64
|
def __init__(self, api_client_factory, bot_session, config):
|
|
65
65
|
self._api_client_factory = api_client_factory
|
|
66
66
|
self._bot_session = bot_session
|
|
@@ -102,7 +102,9 @@ class ExtensionService:
|
|
|
102
102
|
try:
|
|
103
103
|
return extension.get_service()
|
|
104
104
|
except AttributeError:
|
|
105
|
-
raise ValueError(
|
|
105
|
+
raise ValueError(
|
|
106
|
+
f"Extension {str(extension_type)} does not implement the get_service method"
|
|
107
|
+
)
|
|
106
108
|
|
|
107
109
|
def _inject_api_client_factory(self, extension):
|
|
108
110
|
try:
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import Callable
|
|
3
2
|
from functools import wraps
|
|
3
|
+
from typing import Callable
|
|
4
4
|
|
|
5
|
-
from tenacity import stop_after_attempt, wait_exponential
|
|
5
|
+
from tenacity import before_sleep_log, stop_after_attempt, wait_exponential
|
|
6
6
|
|
|
7
7
|
from symphony.bdk.core.config.model.bdk_retry_config import BdkRetryConfig
|
|
8
8
|
from symphony.bdk.core.retry.strategy import refresh_session_if_unauthorized
|
|
@@ -31,17 +31,21 @@ def retry(*dargs, **dkw):
|
|
|
31
31
|
arguments for the AsyncRetrying object.
|
|
32
32
|
"""
|
|
33
33
|
default_kwargs = {}
|
|
34
|
-
retry_config: BdkRetryConfig = getattr(self,
|
|
34
|
+
retry_config: BdkRetryConfig = getattr(self, "_retry_config")
|
|
35
35
|
logger = logging.getLogger(self.__module__)
|
|
36
36
|
_before_sleep = before_sleep_log(logger, logging.INFO)
|
|
37
37
|
default_kwargs.update(dict(before_sleep=_before_sleep))
|
|
38
38
|
if retry_config is not None:
|
|
39
|
-
config_kwargs = dict(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
config_kwargs = dict(
|
|
40
|
+
retry=retry_function,
|
|
41
|
+
wait=wait_exponential(
|
|
42
|
+
multiplier=retry_config.multiplier,
|
|
43
|
+
min=retry_config.initial_interval.total_seconds(),
|
|
44
|
+
max=retry_config.max_interval.total_seconds(),
|
|
45
|
+
),
|
|
46
|
+
stop=stop_after_attempt(retry_config.max_attempts),
|
|
47
|
+
reraise=True,
|
|
48
|
+
)
|
|
45
49
|
default_kwargs.update(config_kwargs)
|
|
46
50
|
# update default arguments by the ones passed as parameters
|
|
47
51
|
default_kwargs.update(**dkw)
|
|
@@ -7,14 +7,16 @@ except ImportError:
|
|
|
7
7
|
|
|
8
8
|
import sys
|
|
9
9
|
|
|
10
|
-
|
|
11
10
|
import six
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
from tenacity import (
|
|
12
|
+
AttemptManager,
|
|
13
|
+
BaseRetrying,
|
|
14
|
+
DoAttempt,
|
|
15
|
+
DoSleep,
|
|
16
|
+
RetryAction,
|
|
17
|
+
RetryCallState,
|
|
18
|
+
TryAgain,
|
|
19
|
+
)
|
|
18
20
|
|
|
19
21
|
|
|
20
22
|
class AsyncRetrying(BaseRetrying):
|
|
@@ -23,6 +25,7 @@ class AsyncRetrying(BaseRetrying):
|
|
|
23
25
|
|
|
24
26
|
There is an open PR for this change on the tenacity repository: https://github.com/jd/tenacity/pull/289
|
|
25
27
|
"""
|
|
28
|
+
|
|
26
29
|
def __init__(self, sleep=asyncio.sleep, **kwargs):
|
|
27
30
|
super().__init__(**kwargs)
|
|
28
31
|
self.sleep = sleep
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
from aiohttp import ClientConnectionError
|
|
2
1
|
from asyncio import TimeoutError
|
|
2
|
+
|
|
3
|
+
from aiohttp import ClientConnectionError
|
|
3
4
|
from tenacity import RetryCallState
|
|
4
5
|
|
|
5
6
|
from symphony.bdk.core.auth.exception import AuthUnauthorizedError
|
|
@@ -111,7 +112,9 @@ async def read_datafeed_retry(retry_state: RetryCallState):
|
|
|
111
112
|
exception = retry_state.outcome.exception()
|
|
112
113
|
if is_network_or_minor_error_or_client(exception):
|
|
113
114
|
if is_client_error(exception):
|
|
114
|
-
datafeed_service = retry_state.args[
|
|
115
|
+
datafeed_service = retry_state.args[
|
|
116
|
+
0
|
|
117
|
+
] # datafeed_service is an AbstractDataFeedLoop instance
|
|
115
118
|
await datafeed_service.recreate_datafeed()
|
|
116
119
|
elif is_unauthorized(exception):
|
|
117
120
|
service_auth_session = retry_state.args[0]._auth_session
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
"""Package containing modules and packages related to services (message, stream, user, etc.)
|
|
2
|
-
"""
|
|
1
|
+
"""Package containing modules and packages related to services (message, stream, user, etc.)"""
|
|
@@ -26,8 +26,13 @@ class ApplicationService:
|
|
|
26
26
|
* Update user applications
|
|
27
27
|
"""
|
|
28
28
|
|
|
29
|
-
def __init__(
|
|
30
|
-
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
application_api: ApplicationApi,
|
|
32
|
+
app_entitlement_api: AppEntitlementApi,
|
|
33
|
+
auth_session: AuthSession,
|
|
34
|
+
retry_config: BdkRetryConfig,
|
|
35
|
+
):
|
|
31
36
|
self._application_api = application_api
|
|
32
37
|
self._app_entitlement_api = app_entitlement_api
|
|
33
38
|
self._auth_session = auth_session
|
|
@@ -50,13 +55,15 @@ class ApplicationService:
|
|
|
50
55
|
|
|
51
56
|
"""
|
|
52
57
|
params = {
|
|
53
|
-
|
|
54
|
-
|
|
58
|
+
"application_detail": application_detail,
|
|
59
|
+
"session_token": await self._auth_session.session_token,
|
|
55
60
|
}
|
|
56
61
|
return await self._application_api.v1_admin_app_create_post(**params)
|
|
57
62
|
|
|
58
63
|
@retry
|
|
59
|
-
async def update_application(
|
|
64
|
+
async def update_application(
|
|
65
|
+
self, app_id: str, application_detail: ApplicationDetail
|
|
66
|
+
) -> ApplicationDetail:
|
|
60
67
|
"""
|
|
61
68
|
Update an existing application.
|
|
62
69
|
|
|
@@ -73,9 +80,9 @@ class ApplicationService:
|
|
|
73
80
|
|
|
74
81
|
"""
|
|
75
82
|
params = {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
83
|
+
"id": app_id,
|
|
84
|
+
"application_detail": application_detail,
|
|
85
|
+
"session_token": await self._auth_session.session_token,
|
|
79
86
|
}
|
|
80
87
|
return await self._application_api.v1_admin_app_id_update_post(**params)
|
|
81
88
|
|
|
@@ -89,10 +96,7 @@ class ApplicationService:
|
|
|
89
96
|
:param app_id: Id of the application needs to be deleted.
|
|
90
97
|
|
|
91
98
|
"""
|
|
92
|
-
params = {
|
|
93
|
-
'id': app_id,
|
|
94
|
-
'session_token': await self._auth_session.session_token
|
|
95
|
-
}
|
|
99
|
+
params = {"id": app_id, "session_token": await self._auth_session.session_token}
|
|
96
100
|
await self._application_api.v1_admin_app_id_delete_post(**params)
|
|
97
101
|
|
|
98
102
|
@retry
|
|
@@ -107,10 +111,7 @@ class ApplicationService:
|
|
|
107
111
|
:return: The detail of the lookup application.
|
|
108
112
|
|
|
109
113
|
"""
|
|
110
|
-
params = {
|
|
111
|
-
'id': app_id,
|
|
112
|
-
'session_token': await self._auth_session.session_token
|
|
113
|
-
}
|
|
114
|
+
params = {"id": app_id, "session_token": await self._auth_session.session_token}
|
|
114
115
|
return await self._application_api.v1_admin_app_id_get_get(**params)
|
|
115
116
|
|
|
116
117
|
@retry
|
|
@@ -123,14 +124,16 @@ class ApplicationService:
|
|
|
123
124
|
:return: The list of application entitlements.
|
|
124
125
|
|
|
125
126
|
"""
|
|
126
|
-
params = {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
127
|
+
params = {"session_token": await self._auth_session.session_token}
|
|
128
|
+
pod_app_entitlement_list = (
|
|
129
|
+
await self._app_entitlement_api.v1_admin_app_entitlement_list_get(**params)
|
|
130
|
+
)
|
|
130
131
|
return pod_app_entitlement_list.value
|
|
131
132
|
|
|
132
133
|
@retry
|
|
133
|
-
async def update_application_entitlements(
|
|
134
|
+
async def update_application_entitlements(
|
|
135
|
+
self, entitlements: [PodAppEntitlement]
|
|
136
|
+
) -> [PodAppEntitlement]:
|
|
134
137
|
"""
|
|
135
138
|
Update the list of application entitlements for the company.
|
|
136
139
|
|
|
@@ -142,10 +145,12 @@ class ApplicationService:
|
|
|
142
145
|
|
|
143
146
|
"""
|
|
144
147
|
params = {
|
|
145
|
-
|
|
146
|
-
|
|
148
|
+
"payload": PodAppEntitlementList(value=entitlements),
|
|
149
|
+
"session_token": await self._auth_session.session_token,
|
|
147
150
|
}
|
|
148
|
-
pod_app_entitlement_list =
|
|
151
|
+
pod_app_entitlement_list = (
|
|
152
|
+
await self._app_entitlement_api.v1_admin_app_entitlement_list_post(**params)
|
|
153
|
+
)
|
|
149
154
|
return pod_app_entitlement_list.value
|
|
150
155
|
|
|
151
156
|
@retry
|
|
@@ -160,15 +165,16 @@ class ApplicationService:
|
|
|
160
165
|
:return: The list of Symphony application entitlements for this user.
|
|
161
166
|
|
|
162
167
|
"""
|
|
163
|
-
params = {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
user_app_entitlement_list = await self._app_entitlement_api.v1_admin_user_uid_app_entitlement_list_get(**params)
|
|
168
|
+
params = {"uid": user_id, "session_token": await self._auth_session.session_token}
|
|
169
|
+
user_app_entitlement_list = (
|
|
170
|
+
await self._app_entitlement_api.v1_admin_user_uid_app_entitlement_list_get(**params)
|
|
171
|
+
)
|
|
168
172
|
return user_app_entitlement_list.value
|
|
169
173
|
|
|
170
174
|
@retry
|
|
171
|
-
async def update_user_applications(
|
|
175
|
+
async def update_user_applications(
|
|
176
|
+
self, user_id: int, user_app_entitlements: [UserAppEntitlement]
|
|
177
|
+
):
|
|
172
178
|
"""
|
|
173
179
|
Update the application entitlements for a particular user.
|
|
174
180
|
|
|
@@ -181,16 +187,19 @@ class ApplicationService:
|
|
|
181
187
|
|
|
182
188
|
"""
|
|
183
189
|
params = {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
190
|
+
"uid": user_id,
|
|
191
|
+
"payload": UserAppEntitlementList(value=user_app_entitlements),
|
|
192
|
+
"session_token": await self._auth_session.session_token,
|
|
187
193
|
}
|
|
188
|
-
user_app_entitlement_list
|
|
189
|
-
|
|
194
|
+
user_app_entitlement_list = (
|
|
195
|
+
await self._app_entitlement_api.v1_admin_user_uid_app_entitlement_list_post(**params)
|
|
196
|
+
)
|
|
190
197
|
return user_app_entitlement_list.value
|
|
191
198
|
|
|
192
199
|
@retry
|
|
193
|
-
async def patch_user_applications(
|
|
200
|
+
async def patch_user_applications(
|
|
201
|
+
self, user_id: int, user_app_entitlements: [UserAppEntitlementPatch]
|
|
202
|
+
):
|
|
194
203
|
"""
|
|
195
204
|
Updates particular app entitlements for a particular user. Supports partial update.
|
|
196
205
|
|
|
@@ -203,10 +212,11 @@ class ApplicationService:
|
|
|
203
212
|
|
|
204
213
|
"""
|
|
205
214
|
params = {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
215
|
+
"uid": user_id,
|
|
216
|
+
"payload": UserAppEntitlementsPatchList(value=user_app_entitlements),
|
|
217
|
+
"session_token": await self._auth_session.session_token,
|
|
209
218
|
}
|
|
210
|
-
user_app_entitlements_list
|
|
211
|
-
|
|
219
|
+
user_app_entitlements_list = (
|
|
220
|
+
await self._app_entitlement_api.v1_admin_user_uid_app_entitlement_list_patch(**params)
|
|
221
|
+
)
|
|
212
222
|
return user_app_entitlements_list.value
|
|
@@ -19,7 +19,9 @@ class OboConnectionService:
|
|
|
19
19
|
* Remove a connection with a user
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
|
-
def __init__(
|
|
22
|
+
def __init__(
|
|
23
|
+
self, connection_api: ConnectionApi, auth_session: AuthSession, retry_config: BdkRetryConfig
|
|
24
|
+
):
|
|
23
25
|
self._connection_api = connection_api
|
|
24
26
|
self._auth_session = auth_session
|
|
25
27
|
self._retry_config = retry_config
|
|
@@ -35,17 +37,12 @@ class OboConnectionService:
|
|
|
35
37
|
:return: Connection status with the specified user.
|
|
36
38
|
|
|
37
39
|
"""
|
|
38
|
-
params = {
|
|
39
|
-
'user_id': str(user_id),
|
|
40
|
-
'session_token': await self._auth_session.session_token
|
|
41
|
-
}
|
|
40
|
+
params = {"user_id": str(user_id), "session_token": await self._auth_session.session_token}
|
|
42
41
|
return await self._connection_api.v1_connection_user_user_id_info_get(**params)
|
|
43
42
|
|
|
44
43
|
@retry
|
|
45
44
|
async def list_connections(
|
|
46
|
-
|
|
47
|
-
status: ConnectionStatus = ConnectionStatus.ALL,
|
|
48
|
-
user_ids: [int] = None
|
|
45
|
+
self, status: ConnectionStatus = ConnectionStatus.ALL, user_ids: [int] = None
|
|
49
46
|
) -> [UserConnection]:
|
|
50
47
|
"""
|
|
51
48
|
List all connection statuses of the requesting user with external or specified users.
|
|
@@ -62,12 +59,9 @@ class OboConnectionService:
|
|
|
62
59
|
:return: List of connection statuses with the specified users and status.
|
|
63
60
|
|
|
64
61
|
"""
|
|
65
|
-
params = {
|
|
66
|
-
'status': status.value,
|
|
67
|
-
'session_token': await self._auth_session.session_token
|
|
68
|
-
}
|
|
62
|
+
params = {"status": status.value, "session_token": await self._auth_session.session_token}
|
|
69
63
|
if user_ids is not None:
|
|
70
|
-
params[
|
|
64
|
+
params["user_ids"] = ",".join(map(str, user_ids))
|
|
71
65
|
|
|
72
66
|
user_connection_list = await self._connection_api.v1_connection_list_get(**params)
|
|
73
67
|
return user_connection_list.value
|
|
@@ -85,8 +79,8 @@ class OboConnectionService:
|
|
|
85
79
|
"""
|
|
86
80
|
user_connection_request = UserConnectionRequest(user_id=user_id)
|
|
87
81
|
params = {
|
|
88
|
-
|
|
89
|
-
|
|
82
|
+
"connection_request": user_connection_request,
|
|
83
|
+
"session_token": await self._auth_session.session_token,
|
|
90
84
|
}
|
|
91
85
|
return await self._connection_api.v1_connection_create_post(**params)
|
|
92
86
|
|
|
@@ -103,8 +97,8 @@ class OboConnectionService:
|
|
|
103
97
|
"""
|
|
104
98
|
user_connection_request = UserConnectionRequest(user_id=user_id)
|
|
105
99
|
params = {
|
|
106
|
-
|
|
107
|
-
|
|
100
|
+
"connection_request": user_connection_request,
|
|
101
|
+
"session_token": await self._auth_session.session_token,
|
|
108
102
|
}
|
|
109
103
|
return await self._connection_api.v1_connection_accept_post(**params)
|
|
110
104
|
|
|
@@ -121,8 +115,8 @@ class OboConnectionService:
|
|
|
121
115
|
"""
|
|
122
116
|
user_connection_request = UserConnectionRequest(user_id=user_id)
|
|
123
117
|
params = {
|
|
124
|
-
|
|
125
|
-
|
|
118
|
+
"connection_request": user_connection_request,
|
|
119
|
+
"session_token": await self._auth_session.session_token,
|
|
126
120
|
}
|
|
127
121
|
return await self._connection_api.v1_connection_reject_post(**params)
|
|
128
122
|
|
|
@@ -135,10 +129,7 @@ class OboConnectionService:
|
|
|
135
129
|
:param user_id: The id of the user with whom we want to remove the connection.
|
|
136
130
|
|
|
137
131
|
"""
|
|
138
|
-
params = {
|
|
139
|
-
'uid': user_id,
|
|
140
|
-
'session_token': await self._auth_session.session_token
|
|
141
|
-
}
|
|
132
|
+
params = {"uid": user_id, "session_token": await self._auth_session.session_token}
|
|
142
133
|
await self._connection_api.v1_connection_user_uid_remove_post(**params)
|
|
143
134
|
|
|
144
135
|
|
|
@@ -5,6 +5,7 @@ class ConnectionStatus(enum.Enum):
|
|
|
5
5
|
"""The list of all possible values for the request listing connection status.
|
|
6
6
|
See: `List Connections <https://developers.symphony.com/restapi/reference/list-connections>`_
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
ALL = "ALL"
|
|
9
10
|
PENDING_INCOMING = "PENDING_INCOMING"
|
|
10
11
|
PENDING_OUTGOING = "PENDING_OUTGOING"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import time
|
|
3
|
-
from abc import
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
4
|
|
|
5
5
|
from symphony.bdk.core.auth.auth_session import AuthSession
|
|
6
6
|
from symphony.bdk.core.config.model.bdk_config import BdkConfig
|
|
@@ -15,11 +15,15 @@ logger = logging.getLogger(__name__)
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class AbstractAckIdEventLoop(AbstractDatafeedLoop, ABC):
|
|
18
|
-
"""Base class for implementing datafeed types that relies on an ackId.
|
|
19
|
-
"""
|
|
18
|
+
"""Base class for implementing datafeed types that relies on an ackId."""
|
|
20
19
|
|
|
21
|
-
def __init__(
|
|
22
|
-
|
|
20
|
+
def __init__(
|
|
21
|
+
self,
|
|
22
|
+
datafeed_api: DatafeedApi,
|
|
23
|
+
session_service: SessionService,
|
|
24
|
+
auth_session: AuthSession,
|
|
25
|
+
config: BdkConfig,
|
|
26
|
+
):
|
|
23
27
|
"""
|
|
24
28
|
|
|
25
29
|
:param datafeed_api: DatafeedApi to request the service
|
|
@@ -45,10 +49,12 @@ class AbstractAckIdEventLoop(AbstractDatafeedLoop, ABC):
|
|
|
45
49
|
elapsed = time.time() - start
|
|
46
50
|
|
|
47
51
|
if elapsed > EVENT_PROCESSING_MAX_DURATION_SECONDS:
|
|
48
|
-
logging.warning(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
+
logging.warning(
|
|
53
|
+
"Events processing took longer than %s seconds, "
|
|
54
|
+
"this might lead to events being re-queued in datafeed and re-dispatched. "
|
|
55
|
+
"You might want to consider processing the event in a separated asyncio task if needed.",
|
|
56
|
+
EVENT_PROCESSING_MAX_DURATION_SECONDS,
|
|
57
|
+
)
|
|
52
58
|
|
|
53
59
|
return await self._are_tasks_successful(done_tasks)
|
|
54
60
|
|
|
@@ -58,13 +64,17 @@ class AbstractAckIdEventLoop(AbstractDatafeedLoop, ABC):
|
|
|
58
64
|
exception = task.exception()
|
|
59
65
|
if exception:
|
|
60
66
|
if isinstance(exception, EventError):
|
|
61
|
-
logger.warning(
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
67
|
+
logger.warning(
|
|
68
|
+
"Failed to process events inside %s, "
|
|
69
|
+
"will not update ack id, events will be re-queued",
|
|
70
|
+
task.get_name(),
|
|
71
|
+
exc_info=exception,
|
|
72
|
+
)
|
|
65
73
|
success = False
|
|
66
74
|
else:
|
|
67
|
-
logging.debug(
|
|
75
|
+
logging.debug(
|
|
76
|
+
"Exception occurred inside %s", task.get_name(), exc_info=exception
|
|
77
|
+
)
|
|
68
78
|
return success
|
|
69
79
|
|
|
70
80
|
@abstractmethod
|