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.
Files changed (435) hide show
  1. symphony/bdk/core/__init__.py +1 -0
  2. symphony/bdk/core/activity/__init__.py +1 -2
  3. symphony/bdk/core/activity/api.py +4 -4
  4. symphony/bdk/core/activity/command.py +17 -9
  5. symphony/bdk/core/activity/exception.py +2 -4
  6. symphony/bdk/core/activity/help_command.py +3 -2
  7. symphony/bdk/core/activity/parsing/arguments.py +1 -1
  8. symphony/bdk/core/activity/parsing/command_token.py +5 -4
  9. symphony/bdk/core/activity/parsing/input_tokenizer.py +13 -5
  10. symphony/bdk/core/activity/parsing/match_result.py +5 -3
  11. symphony/bdk/core/activity/parsing/message_entities.py +7 -6
  12. symphony/bdk/core/activity/parsing/slash_command_pattern.py +22 -7
  13. symphony/bdk/core/activity/registry.py +17 -7
  14. symphony/bdk/core/auth/__init__.py +1 -2
  15. symphony/bdk/core/auth/auth_session.py +33 -14
  16. symphony/bdk/core/auth/authenticator_factory.py +41 -21
  17. symphony/bdk/core/auth/bot_authenticator.py +33 -21
  18. symphony/bdk/core/auth/exception.py +3 -6
  19. symphony/bdk/core/auth/ext_app_authenticator.py +40 -30
  20. symphony/bdk/core/auth/jwt_helper.py +36 -15
  21. symphony/bdk/core/auth/obo_authenticator.py +27 -18
  22. symphony/bdk/core/auth/tokens_repository.py +5 -6
  23. symphony/bdk/core/client/__init__.py +2 -2
  24. symphony/bdk/core/client/api_client_factory.py +40 -22
  25. symphony/bdk/core/client/trace_id.py +3 -4
  26. symphony/bdk/core/config/__init__.py +1 -2
  27. symphony/bdk/core/config/exception.py +2 -4
  28. symphony/bdk/core/config/loader.py +2 -2
  29. symphony/bdk/core/config/model/bdk_app_config.py +5 -3
  30. symphony/bdk/core/config/model/bdk_authentication_config.py +13 -7
  31. symphony/bdk/core/config/model/bdk_bot_config.py +6 -3
  32. symphony/bdk/core/config/model/bdk_client_config.py +1 -1
  33. symphony/bdk/core/config/model/bdk_config.py +12 -7
  34. symphony/bdk/core/config/model/bdk_datafeed_config.py +7 -6
  35. symphony/bdk/core/config/model/bdk_datahose_config.py +1 -2
  36. symphony/bdk/core/config/model/bdk_retry_config.py +7 -3
  37. symphony/bdk/core/config/model/bdk_rsa_key_config.py +4 -5
  38. symphony/bdk/core/config/model/bdk_server_config.py +7 -2
  39. symphony/bdk/core/extension.py +15 -13
  40. symphony/bdk/core/retry/__init__.py +13 -9
  41. symphony/bdk/core/retry/_asyncio.py +10 -7
  42. symphony/bdk/core/retry/strategy.py +5 -2
  43. symphony/bdk/core/service/__init__.py +1 -2
  44. symphony/bdk/core/service/application/application_service.py +51 -41
  45. symphony/bdk/core/service/connection/connection_service.py +14 -23
  46. symphony/bdk/core/service/connection/model/connection_status.py +1 -0
  47. symphony/bdk/core/service/datafeed/abstract_ackId_event_loop.py +24 -14
  48. symphony/bdk/core/service/datafeed/abstract_datafeed_loop.py +16 -7
  49. symphony/bdk/core/service/datafeed/abstract_datahose_loop.py +2 -2
  50. symphony/bdk/core/service/datafeed/datafeed_loop_v1.py +18 -10
  51. symphony/bdk/core/service/datafeed/datafeed_loop_v2.py +31 -21
  52. symphony/bdk/core/service/datafeed/datahose_loop.py +22 -11
  53. symphony/bdk/core/service/datafeed/on_disk_datafeed_id_repository.py +10 -4
  54. symphony/bdk/core/service/datafeed/real_time_event_listener.py +32 -18
  55. symphony/bdk/core/service/exception.py +3 -6
  56. symphony/bdk/core/service/health/health_service.py +5 -4
  57. symphony/bdk/core/service/message/message_parser.py +10 -8
  58. symphony/bdk/core/service/message/message_service.py +196 -161
  59. symphony/bdk/core/service/message/messageml_util.py +6 -6
  60. symphony/bdk/core/service/message/model.py +15 -5
  61. symphony/bdk/core/service/message/multi_attachments_messages_api.py +134 -219
  62. symphony/bdk/core/service/obo_services.py +5 -4
  63. symphony/bdk/core/service/pagination.py +9 -6
  64. symphony/bdk/core/service/presence/presence_service.py +40 -28
  65. symphony/bdk/core/service/session/session_service.py +7 -13
  66. symphony/bdk/core/service/signal/signal_service.py +66 -33
  67. symphony/bdk/core/service/stream/stream_service.py +186 -69
  68. symphony/bdk/core/service/stream/stream_util.py +1 -0
  69. symphony/bdk/core/service/user/model/delegate_action_enum.py +1 -0
  70. symphony/bdk/core/service/user/model/role_id.py +1 -0
  71. symphony/bdk/core/service/user/user_service.py +225 -313
  72. symphony/bdk/core/service/user/user_util.py +4 -6
  73. symphony/bdk/core/service/version/__init__.py +0 -0
  74. symphony/bdk/core/service/version/agent_version_service.py +62 -0
  75. symphony/bdk/core/service_factory.py +50 -53
  76. symphony/bdk/core/symphony_bdk.py +34 -18
  77. symphony/bdk/ext/group.py +52 -37
  78. symphony/bdk/gen/agent_api/attachments_api.py +10 -18
  79. symphony/bdk/gen/agent_api/audit_trail_api.py +8 -12
  80. symphony/bdk/gen/agent_api/datafeed_api.py +34 -219
  81. symphony/bdk/gen/agent_api/datahose_api.py +184 -0
  82. symphony/bdk/gen/agent_api/dlp_policies_and_dictionary_management_api.py +130 -214
  83. symphony/bdk/gen/agent_api/messages_api.py +99 -119
  84. symphony/bdk/gen/agent_api/share_api.py +7 -11
  85. symphony/bdk/gen/agent_api/signals_api.py +1 -1
  86. symphony/bdk/gen/agent_api/system_api.py +1 -1
  87. symphony/bdk/gen/agent_api/util_api.py +13 -21
  88. symphony/bdk/gen/agent_api/violations_api.py +45 -73
  89. symphony/bdk/gen/agent_model/ack_id.py +1 -1
  90. symphony/bdk/gen/agent_model/agent_info.py +1 -1
  91. symphony/bdk/gen/agent_model/attachment_info.py +1 -1
  92. symphony/bdk/gen/agent_model/base_message.py +1 -1
  93. symphony/bdk/gen/agent_model/base_signal.py +1 -1
  94. symphony/bdk/gen/agent_model/channel_subscriber.py +1 -1
  95. symphony/bdk/gen/agent_model/channel_subscriber_response.py +1 -1
  96. symphony/bdk/gen/agent_model/channel_subscription_error.py +1 -1
  97. symphony/bdk/gen/agent_model/channel_subscription_response.py +1 -1
  98. symphony/bdk/gen/agent_model/connection_request_message.py +1 -1
  99. symphony/bdk/gen/agent_model/connection_request_message_all_of.py +1 -1
  100. symphony/bdk/gen/agent_model/datafeed.py +1 -1
  101. symphony/bdk/gen/agent_model/error.py +1 -1
  102. symphony/bdk/gen/agent_model/import_response.py +1 -1
  103. symphony/bdk/gen/agent_model/import_response_list.py +1 -1
  104. symphony/bdk/gen/agent_model/imported_message.py +1 -1
  105. symphony/bdk/gen/agent_model/ingestion_error.py +266 -0
  106. symphony/bdk/gen/agent_model/message.py +1 -1
  107. symphony/bdk/gen/agent_model/message_all_of.py +1 -1
  108. symphony/bdk/gen/agent_model/message_import_list.py +1 -1
  109. symphony/bdk/gen/agent_model/message_list.py +1 -1
  110. symphony/bdk/gen/agent_model/message_search_query.py +1 -1
  111. symphony/bdk/gen/agent_model/message_submission.py +1 -1
  112. symphony/bdk/gen/agent_model/pagination.py +1 -1
  113. symphony/bdk/gen/agent_model/pagination_cursors.py +1 -1
  114. symphony/bdk/gen/agent_model/room_created_message.py +1 -1
  115. symphony/bdk/gen/agent_model/room_created_message_all_of.py +1 -1
  116. symphony/bdk/gen/agent_model/room_deactivated_message.py +1 -1
  117. symphony/bdk/gen/agent_model/room_deactivated_message_all_of.py +1 -1
  118. symphony/bdk/gen/agent_model/room_member_demoted_from_owner_message.py +1 -1
  119. symphony/bdk/gen/agent_model/room_member_demoted_from_owner_message_all_of.py +1 -1
  120. symphony/bdk/gen/agent_model/room_member_promoted_to_owner_message.py +1 -1
  121. symphony/bdk/gen/agent_model/room_member_promoted_to_owner_message_all_of.py +1 -1
  122. symphony/bdk/gen/agent_model/room_reactivated_message.py +1 -1
  123. symphony/bdk/gen/agent_model/room_reactivated_message_all_of.py +1 -1
  124. symphony/bdk/gen/agent_model/room_tag.py +1 -1
  125. symphony/bdk/gen/agent_model/room_updated_message.py +1 -1
  126. symphony/bdk/gen/agent_model/room_updated_message_all_of.py +1 -1
  127. symphony/bdk/gen/agent_model/share_article.py +1 -1
  128. symphony/bdk/gen/agent_model/share_content.py +1 -1
  129. symphony/bdk/gen/agent_model/signal.py +1 -1
  130. symphony/bdk/gen/agent_model/signal_all_of.py +1 -6
  131. symphony/bdk/gen/agent_model/signal_list.py +1 -1
  132. symphony/bdk/gen/agent_model/simple_message.py +1 -1
  133. symphony/bdk/gen/agent_model/success_response.py +1 -1
  134. symphony/bdk/gen/agent_model/user_joined_room_message.py +1 -1
  135. symphony/bdk/gen/agent_model/user_joined_room_message_all_of.py +1 -1
  136. symphony/bdk/gen/agent_model/user_left_room_message.py +1 -1
  137. symphony/bdk/gen/agent_model/user_left_room_message_all_of.py +1 -1
  138. symphony/bdk/gen/agent_model/v1_audit_trail_initiator_list.py +1 -1
  139. symphony/bdk/gen/agent_model/v1_audit_trail_initiator_response.py +1 -1
  140. symphony/bdk/gen/agent_model/v1_dlp_content_type.py +1 -1
  141. symphony/bdk/gen/agent_model/v1_dlp_dictionary.py +1 -1
  142. symphony/bdk/gen/agent_model/v1_dlp_dictionary_content.py +1 -1
  143. symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata.py +1 -1
  144. symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_collection_response.py +1 -1
  145. symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_create_request.py +1 -1
  146. symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_response.py +1 -1
  147. symphony/bdk/gen/agent_model/v1_dlp_dictionary_metadata_update_request.py +1 -1
  148. symphony/bdk/gen/agent_model/v1_dlp_dictionary_ref.py +1 -1
  149. symphony/bdk/gen/agent_model/v1_dlp_matched_policy.py +1 -1
  150. symphony/bdk/gen/agent_model/v1_dlp_matched_policy_list.py +1 -1
  151. symphony/bdk/gen/agent_model/v1_dlp_outcome.py +1 -1
  152. symphony/bdk/gen/agent_model/v1_dlp_policies_collection_response.py +1 -1
  153. symphony/bdk/gen/agent_model/v1_dlp_policy.py +1 -1
  154. symphony/bdk/gen/agent_model/v1_dlp_policy_request.py +9 -8
  155. symphony/bdk/gen/agent_model/v1_dlp_policy_response.py +1 -1
  156. symphony/bdk/gen/agent_model/v1_dlp_signal.py +6 -1
  157. symphony/bdk/gen/agent_model/v1_dlp_stream.py +1 -1
  158. symphony/bdk/gen/agent_model/v1_dlp_violation.py +1 -1
  159. symphony/bdk/gen/agent_model/v1_dlp_violation_message.py +1 -1
  160. symphony/bdk/gen/agent_model/v1_dlp_violation_message_response.py +1 -1
  161. symphony/bdk/gen/agent_model/v1_dlp_violation_signal.py +1 -1
  162. symphony/bdk/gen/agent_model/v1_dlp_violation_signal_response.py +1 -1
  163. symphony/bdk/gen/agent_model/v1_dlp_violation_stream.py +1 -1
  164. symphony/bdk/gen/agent_model/v1_dlp_violation_stream_response.py +1 -1
  165. symphony/bdk/gen/agent_model/v1_health_check_response.py +1 -1
  166. symphony/bdk/gen/agent_model/v2_base_message.py +1 -1
  167. symphony/bdk/gen/agent_model/v2_error.py +1 -1
  168. symphony/bdk/gen/agent_model/v2_health_check_response.py +1 -1
  169. symphony/bdk/gen/agent_model/v2_import_response.py +1 -1
  170. symphony/bdk/gen/agent_model/v2_import_response_list.py +1 -1
  171. symphony/bdk/gen/agent_model/v2_imported_message.py +1 -1
  172. symphony/bdk/gen/agent_model/v2_message.py +1 -1
  173. symphony/bdk/gen/agent_model/v2_message_all_of.py +1 -1
  174. symphony/bdk/gen/agent_model/v2_message_import_list.py +1 -1
  175. symphony/bdk/gen/agent_model/v2_message_list.py +1 -1
  176. symphony/bdk/gen/agent_model/v2_message_submission.py +1 -1
  177. symphony/bdk/gen/agent_model/v3_dlp_dictionary_meta.py +1 -1
  178. symphony/bdk/gen/agent_model/v3_dlp_file_classifier_config.py +1 -1
  179. symphony/bdk/gen/agent_model/v3_dlp_file_extension_config.py +1 -1
  180. symphony/bdk/gen/agent_model/v3_dlp_file_password_config.py +1 -1
  181. symphony/bdk/gen/agent_model/v3_dlp_file_size_config.py +1 -1
  182. symphony/bdk/gen/agent_model/v3_dlp_policies_collection_response.py +1 -1
  183. symphony/bdk/gen/agent_model/v3_dlp_policy.py +1 -1
  184. symphony/bdk/gen/agent_model/v3_dlp_policy_applies_to.py +1 -1
  185. symphony/bdk/gen/agent_model/v3_dlp_policy_request.py +1 -1
  186. symphony/bdk/gen/agent_model/v3_dlp_policy_response.py +1 -1
  187. symphony/bdk/gen/agent_model/v3_dlp_rule.py +1 -1
  188. symphony/bdk/gen/agent_model/v3_dlp_text_match_config.py +1 -1
  189. symphony/bdk/gen/agent_model/v3_dlp_violation.py +1 -1
  190. symphony/bdk/gen/agent_model/v3_dlp_violation_message.py +1 -1
  191. symphony/bdk/gen/agent_model/v3_dlp_violation_message_response.py +1 -1
  192. symphony/bdk/gen/agent_model/v3_dlp_violation_signal.py +1 -1
  193. symphony/bdk/gen/agent_model/v3_dlp_violation_signal_response.py +1 -1
  194. symphony/bdk/gen/agent_model/v3_dlp_violation_stream.py +1 -1
  195. symphony/bdk/gen/agent_model/v3_dlp_violation_stream_response.py +1 -1
  196. symphony/bdk/gen/agent_model/v3_health.py +1 -1
  197. symphony/bdk/gen/agent_model/v3_health_auth_type.py +1 -1
  198. symphony/bdk/gen/agent_model/v3_health_component.py +1 -1
  199. symphony/bdk/gen/agent_model/v3_health_status.py +1 -1
  200. symphony/bdk/gen/agent_model/v4_attachment_info.py +1 -1
  201. symphony/bdk/gen/agent_model/v4_connection_accepted.py +1 -1
  202. symphony/bdk/gen/agent_model/v4_connection_requested.py +1 -1
  203. symphony/bdk/gen/agent_model/v4_event.py +3 -3
  204. symphony/bdk/gen/agent_model/v4_event_list.py +1 -1
  205. symphony/bdk/gen/agent_model/v4_generic_system_event.py +279 -0
  206. symphony/bdk/gen/agent_model/v4_import_response.py +1 -1
  207. symphony/bdk/gen/agent_model/v4_import_response_list.py +1 -1
  208. symphony/bdk/gen/agent_model/v4_imported_message.py +1 -1
  209. symphony/bdk/gen/agent_model/v4_imported_message_attachment.py +1 -1
  210. symphony/bdk/gen/agent_model/v4_initiator.py +1 -1
  211. symphony/bdk/gen/agent_model/v4_instant_message_created.py +1 -1
  212. symphony/bdk/gen/agent_model/v4_key_value_pair.py +1 -1
  213. symphony/bdk/gen/agent_model/v4_message.py +1 -1
  214. symphony/bdk/gen/agent_model/v4_message_blast_response.py +1 -1
  215. symphony/bdk/gen/agent_model/v4_message_import_list.py +1 -1
  216. symphony/bdk/gen/agent_model/v4_message_list.py +1 -1
  217. symphony/bdk/gen/agent_model/v4_message_sent.py +1 -1
  218. symphony/bdk/gen/agent_model/v4_message_suppressed.py +1 -1
  219. symphony/bdk/gen/agent_model/v4_payload.py +8 -1
  220. symphony/bdk/gen/agent_model/v4_room_created.py +1 -1
  221. symphony/bdk/gen/agent_model/v4_room_deactivated.py +1 -1
  222. symphony/bdk/gen/agent_model/v4_room_member_demoted_from_owner.py +1 -1
  223. symphony/bdk/gen/agent_model/v4_room_member_promoted_to_owner.py +1 -1
  224. symphony/bdk/gen/agent_model/v4_room_properties.py +1 -1
  225. symphony/bdk/gen/agent_model/v4_room_reactivated.py +1 -1
  226. symphony/bdk/gen/agent_model/v4_room_updated.py +1 -1
  227. symphony/bdk/gen/agent_model/v4_shared_post.py +1 -1
  228. symphony/bdk/gen/agent_model/v4_stream.py +6 -1
  229. symphony/bdk/gen/agent_model/v4_symphony_elements_action.py +1 -1
  230. symphony/bdk/gen/agent_model/v4_thumbnail_info.py +1 -1
  231. symphony/bdk/gen/agent_model/v4_user.py +1 -1
  232. symphony/bdk/gen/agent_model/v4_user_joined_room.py +1 -1
  233. symphony/bdk/gen/agent_model/v4_user_left_room.py +1 -1
  234. symphony/bdk/gen/agent_model/v4_user_requested_to_join_room.py +1 -1
  235. symphony/bdk/gen/agent_model/v5_datafeed.py +3 -3
  236. symphony/bdk/gen/agent_model/v5_datafeed_create_body.py +1 -1
  237. symphony/bdk/gen/agent_model/v5_event_list.py +1 -1
  238. symphony/bdk/gen/agent_model/v5_events_read_body.py +5 -5
  239. symphony/bdk/gen/pod_api/app_entitlement_api.py +1 -1
  240. symphony/bdk/gen/pod_api/application_api.py +1 -1
  241. symphony/bdk/gen/pod_api/connection_api.py +1 -1
  242. symphony/bdk/gen/pod_api/default_api.py +1 -1
  243. symphony/bdk/gen/pod_api/disclaimer_api.py +1 -1
  244. symphony/bdk/gen/pod_api/info_barriers_api.py +1 -1
  245. symphony/bdk/gen/pod_api/message_api.py +1 -1
  246. symphony/bdk/gen/pod_api/message_suppression_api.py +1 -1
  247. symphony/bdk/gen/pod_api/pod_api.py +1 -1
  248. symphony/bdk/gen/pod_api/presence_api.py +1 -1
  249. symphony/bdk/gen/pod_api/room_membership_api.py +1 -1
  250. symphony/bdk/gen/pod_api/security_api.py +1 -1
  251. symphony/bdk/gen/pod_api/session_api.py +1 -1
  252. symphony/bdk/gen/pod_api/streams_api.py +162 -1
  253. symphony/bdk/gen/pod_api/system_api.py +1 -1
  254. symphony/bdk/gen/pod_api/user_api.py +264 -2
  255. symphony/bdk/gen/pod_api/users_api.py +421 -1
  256. symphony/bdk/gen/pod_model/admin_justified_action.py +1 -1
  257. symphony/bdk/gen/pod_model/admin_justified_user_action.py +1 -1
  258. symphony/bdk/gen/pod_model/app_authentication_key.py +1 -1
  259. symphony/bdk/gen/pod_model/app_authentication_keys.py +1 -1
  260. symphony/bdk/gen/pod_model/app_notification.py +1 -1
  261. symphony/bdk/gen/pod_model/app_properties.py +1 -1
  262. symphony/bdk/gen/pod_model/app_property.py +1 -1
  263. symphony/bdk/gen/pod_model/application_detail.py +1 -1
  264. symphony/bdk/gen/pod_model/application_info.py +1 -1
  265. symphony/bdk/gen/pod_model/assignee_candidate.py +1 -1
  266. symphony/bdk/gen/pod_model/assignee_candidates.py +1 -1
  267. symphony/bdk/gen/pod_model/attachment_preview.py +1 -1
  268. symphony/bdk/gen/pod_model/avatar.py +1 -1
  269. symphony/bdk/gen/pod_model/avatar_list.py +1 -1
  270. symphony/bdk/gen/pod_model/avatar_update.py +1 -1
  271. symphony/bdk/gen/pod_model/bulk_action_result.py +1 -1
  272. symphony/bdk/gen/pod_model/cert_info.py +1 -1
  273. symphony/bdk/gen/pod_model/cert_info_item.py +1 -1
  274. symphony/bdk/gen/pod_model/company_cert.py +1 -1
  275. symphony/bdk/gen/pod_model/company_cert_attributes.py +1 -1
  276. symphony/bdk/gen/pod_model/company_cert_detail.py +1 -1
  277. symphony/bdk/gen/pod_model/company_cert_info.py +1 -1
  278. symphony/bdk/gen/pod_model/company_cert_info_list.py +1 -1
  279. symphony/bdk/gen/pod_model/company_cert_status.py +1 -1
  280. symphony/bdk/gen/pod_model/company_cert_type.py +1 -1
  281. symphony/bdk/gen/pod_model/company_cert_type_list.py +1 -1
  282. symphony/bdk/gen/pod_model/conversation_specific_stream_attributes.py +1 -1
  283. symphony/bdk/gen/pod_model/delegate_action.py +1 -1
  284. symphony/bdk/gen/pod_model/disclaimer.py +1 -1
  285. symphony/bdk/gen/pod_model/disclaimer_list.py +1 -1
  286. symphony/bdk/gen/pod_model/download_receipt_count.py +1 -1
  287. symphony/bdk/gen/pod_model/error.py +1 -1
  288. symphony/bdk/gen/pod_model/faceted_match_count.py +1 -1
  289. symphony/bdk/gen/pod_model/feature.py +1 -1
  290. symphony/bdk/gen/pod_model/feature_list.py +1 -1
  291. symphony/bdk/gen/pod_model/file_extension.py +6 -1
  292. symphony/bdk/gen/pod_model/file_extensions_response.py +1 -1
  293. symphony/bdk/gen/pod_model/followers_list.py +1 -1
  294. symphony/bdk/gen/pod_model/followers_list_response.py +1 -1
  295. symphony/bdk/gen/pod_model/following_list_response.py +1 -1
  296. symphony/bdk/gen/pod_model/group.py +1 -1
  297. symphony/bdk/gen/pod_model/group_item.py +1 -1
  298. symphony/bdk/gen/pod_model/group_list.py +1 -1
  299. symphony/bdk/gen/pod_model/group_role_scope.py +1 -1
  300. symphony/bdk/gen/pod_model/im_system_info.py +1 -1
  301. symphony/bdk/gen/pod_model/immutable_room_attributes.py +1 -1
  302. symphony/bdk/gen/pod_model/integer_list.py +1 -1
  303. symphony/bdk/gen/pod_model/languages.py +1 -1
  304. symphony/bdk/gen/pod_model/member_info.py +1 -1
  305. symphony/bdk/gen/pod_model/membership_data.py +1 -1
  306. symphony/bdk/gen/pod_model/membership_list.py +1 -1
  307. symphony/bdk/gen/pod_model/message_detail.py +1 -1
  308. symphony/bdk/gen/pod_model/message_details.py +1 -1
  309. symphony/bdk/gen/pod_model/message_download_receipt_count.py +1 -1
  310. symphony/bdk/gen/pod_model/message_ids.py +1 -1
  311. symphony/bdk/gen/pod_model/message_metadata_response.py +1 -1
  312. symphony/bdk/gen/pod_model/message_metadata_response_parent.py +1 -1
  313. symphony/bdk/gen/pod_model/message_receipt_detail.py +1 -1
  314. symphony/bdk/gen/pod_model/message_receipt_detail_response.py +1 -1
  315. symphony/bdk/gen/pod_model/message_status.py +1 -1
  316. symphony/bdk/gen/pod_model/message_status_user.py +1 -1
  317. symphony/bdk/gen/pod_model/message_stream.py +1 -1
  318. symphony/bdk/gen/pod_model/message_suppression_response.py +1 -1
  319. symphony/bdk/gen/pod_model/message_user.py +1 -1
  320. symphony/bdk/gen/pod_model/name_value_pair.py +1 -1
  321. symphony/bdk/gen/pod_model/pagination.py +1 -1
  322. symphony/bdk/gen/pod_model/pagination_cursors.py +1 -1
  323. symphony/bdk/gen/pod_model/password.py +1 -1
  324. symphony/bdk/gen/pod_model/password_reset.py +1 -1
  325. symphony/bdk/gen/pod_model/pod_app_entitlement.py +1 -1
  326. symphony/bdk/gen/pod_model/pod_app_entitlement_list.py +1 -1
  327. symphony/bdk/gen/pod_model/pod_certificate.py +1 -1
  328. symphony/bdk/gen/pod_model/policy.py +1 -1
  329. symphony/bdk/gen/pod_model/policy_list.py +1 -1
  330. symphony/bdk/gen/pod_model/product.py +1 -1
  331. symphony/bdk/gen/pod_model/product_list.py +1 -1
  332. symphony/bdk/gen/pod_model/protocol.py +1 -1
  333. symphony/bdk/gen/pod_model/role.py +1 -1
  334. symphony/bdk/gen/pod_model/role_detail.py +1 -1
  335. symphony/bdk/gen/pod_model/role_detail_list.py +1 -1
  336. symphony/bdk/gen/pod_model/role_list.py +1 -1
  337. symphony/bdk/gen/pod_model/room_attributes.py +1 -1
  338. symphony/bdk/gen/pod_model/room_detail.py +1 -1
  339. symphony/bdk/gen/pod_model/room_search_criteria.py +1 -1
  340. symphony/bdk/gen/pod_model/room_specific_stream_attributes.py +1 -1
  341. symphony/bdk/gen/pod_model/room_system_info.py +1 -1
  342. symphony/bdk/gen/pod_model/room_tag.py +1 -1
  343. symphony/bdk/gen/pod_model/service_account_manifest.py +264 -0
  344. symphony/bdk/gen/pod_model/stream.py +1 -1
  345. symphony/bdk/gen/pod_model/stream_attachment_item.py +1 -1
  346. symphony/bdk/gen/pod_model/stream_attachment_response.py +1 -1
  347. symphony/bdk/gen/pod_model/stream_attributes.py +1 -1
  348. symphony/bdk/gen/pod_model/stream_filter.py +1 -1
  349. symphony/bdk/gen/pod_model/stream_list.py +1 -1
  350. symphony/bdk/gen/pod_model/stream_type.py +1 -1
  351. symphony/bdk/gen/pod_model/string_id.py +1 -1
  352. symphony/bdk/gen/pod_model/string_list.py +1 -1
  353. symphony/bdk/gen/pod_model/success_response.py +1 -1
  354. symphony/bdk/gen/pod_model/user_app_entitlement.py +1 -1
  355. symphony/bdk/gen/pod_model/user_app_entitlement_list.py +1 -1
  356. symphony/bdk/gen/pod_model/user_app_entitlement_patch.py +1 -1
  357. symphony/bdk/gen/pod_model/user_app_entitlement_patch_enum.py +1 -1
  358. symphony/bdk/gen/pod_model/user_app_entitlements_patch_list.py +1 -1
  359. symphony/bdk/gen/pod_model/user_attributes.py +1 -1
  360. symphony/bdk/gen/pod_model/user_compp.py +1 -1
  361. symphony/bdk/gen/pod_model/user_connection.py +1 -1
  362. symphony/bdk/gen/pod_model/user_connection_list.py +1 -1
  363. symphony/bdk/gen/pod_model/user_connection_request.py +1 -1
  364. symphony/bdk/gen/pod_model/user_data.py +1 -1
  365. symphony/bdk/gen/pod_model/user_detail.py +1 -1
  366. symphony/bdk/gen/pod_model/user_detail_list.py +1 -1
  367. symphony/bdk/gen/pod_model/user_error.py +1 -1
  368. symphony/bdk/gen/pod_model/user_filter.py +1 -1
  369. symphony/bdk/gen/pod_model/user_group_assignee.py +1 -1
  370. symphony/bdk/gen/pod_model/user_group_assignee_response.py +1 -1
  371. symphony/bdk/gen/pod_model/user_group_assignee_update.py +1 -1
  372. symphony/bdk/gen/pod_model/user_group_assignment_response.py +1 -1
  373. symphony/bdk/gen/pod_model/user_group_create.py +1 -1
  374. symphony/bdk/gen/pod_model/user_group_data.py +1 -1
  375. symphony/bdk/gen/pod_model/user_group_membership_data.py +1 -1
  376. symphony/bdk/gen/pod_model/user_group_membership_request.py +1 -1
  377. symphony/bdk/gen/pod_model/user_group_membership_response.py +1 -1
  378. symphony/bdk/gen/pod_model/user_group_membership_response_data.py +1 -1
  379. symphony/bdk/gen/pod_model/user_group_membership_update.py +1 -1
  380. symphony/bdk/gen/pod_model/user_group_response.py +1 -1
  381. symphony/bdk/gen/pod_model/user_group_response_list.py +1 -1
  382. symphony/bdk/gen/pod_model/user_group_update.py +1 -1
  383. symphony/bdk/gen/pod_model/user_id.py +1 -1
  384. symphony/bdk/gen/pod_model/user_id_list.py +1 -1
  385. symphony/bdk/gen/pod_model/user_info.py +1 -1
  386. symphony/bdk/gen/pod_model/user_name.py +1 -1
  387. symphony/bdk/gen/pod_model/user_name_list.py +1 -1
  388. symphony/bdk/gen/pod_model/user_search_filter.py +1 -1
  389. symphony/bdk/gen/pod_model/user_search_query.py +1 -1
  390. symphony/bdk/gen/pod_model/user_search_results.py +1 -1
  391. symphony/bdk/gen/pod_model/user_status.py +1 -1
  392. symphony/bdk/gen/pod_model/user_suspension.py +1 -1
  393. symphony/bdk/gen/pod_model/user_system_info.py +1 -1
  394. symphony/bdk/gen/pod_model/user_v2.py +1 -1
  395. symphony/bdk/gen/pod_model/v1_im_attributes.py +1 -1
  396. symphony/bdk/gen/pod_model/v1_im_detail.py +1 -1
  397. symphony/bdk/gen/pod_model/v1_session.py +301 -0
  398. symphony/bdk/gen/pod_model/v1_user_sessions.py +259 -0
  399. symphony/bdk/gen/pod_model/v2_admin_stream_attributes.py +6 -1
  400. symphony/bdk/gen/pod_model/v2_admin_stream_filter.py +1 -1
  401. symphony/bdk/gen/pod_model/v2_admin_stream_info.py +1 -1
  402. symphony/bdk/gen/pod_model/v2_admin_stream_info_list.py +1 -1
  403. symphony/bdk/gen/pod_model/v2_admin_stream_list.py +1 -1
  404. symphony/bdk/gen/pod_model/v2_admin_stream_type.py +1 -1
  405. symphony/bdk/gen/pod_model/v2_conversation_specific_stream_attributes.py +1 -1
  406. symphony/bdk/gen/pod_model/v2_member_info.py +1 -1
  407. symphony/bdk/gen/pod_model/v2_member_info_list.py +1 -1
  408. symphony/bdk/gen/pod_model/v2_member_user_detail.py +1 -1
  409. symphony/bdk/gen/pod_model/v2_membership_list.py +1 -1
  410. symphony/bdk/gen/pod_model/v2_presence.py +1 -1
  411. symphony/bdk/gen/pod_model/v2_presence_all_of.py +1 -1
  412. symphony/bdk/gen/pod_model/v2_presence_list.py +1 -1
  413. symphony/bdk/gen/pod_model/v2_presence_status.py +1 -1
  414. symphony/bdk/gen/pod_model/v2_room_search_criteria.py +1 -1
  415. symphony/bdk/gen/pod_model/v2_room_search_criteria_all_of.py +1 -1
  416. symphony/bdk/gen/pod_model/v2_room_specific_stream_attributes.py +1 -1
  417. symphony/bdk/gen/pod_model/v2_stream_attributes.py +1 -1
  418. symphony/bdk/gen/pod_model/v2_stream_type.py +1 -1
  419. symphony/bdk/gen/pod_model/v2_user_attributes.py +1 -1
  420. symphony/bdk/gen/pod_model/v2_user_create.py +1 -1
  421. symphony/bdk/gen/pod_model/v2_user_detail.py +1 -1
  422. symphony/bdk/gen/pod_model/v2_user_detail_list.py +1 -1
  423. symphony/bdk/gen/pod_model/v2_user_key_request.py +1 -1
  424. symphony/bdk/gen/pod_model/v2_user_list.py +1 -1
  425. symphony/bdk/gen/pod_model/v2_user_presence.py +1 -1
  426. symphony/bdk/gen/pod_model/v2_user_presence_all_of.py +1 -1
  427. symphony/bdk/gen/pod_model/v3_room_attributes.py +6 -1
  428. symphony/bdk/gen/pod_model/v3_room_detail.py +1 -1
  429. symphony/bdk/gen/pod_model/v3_room_search_results.py +1 -1
  430. {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/METADATA +19 -5
  431. symphony_bdk_python-2.11.0.dist-info/RECORD +546 -0
  432. symphony_bdk_python-2.10.dev0.dist-info/RECORD +0 -538
  433. {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/LICENSE +0 -0
  434. {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/NOTICE +0 -0
  435. {symphony_bdk_python-2.10.dev0.dist-info → symphony_bdk_python-2.11.0.dist-info}/WHEEL +0 -0
@@ -4,6 +4,7 @@ The tenant ID is stored in the 27 highest bits (minus the sign bit which is unus
4
4
  positive value) which allows for 134 million pods.
5
5
  This leaves 36 lowest bits for the user ID, which allows 68.7 billion users per tenant.
6
6
  """
7
+
7
8
  TENANT_ID_BIT_LENGTH = 27
8
9
  SUBTENANT_ID_BIT_LENGTH = 36
9
10
  TENANT_ID_INDEX = 1
@@ -20,8 +21,7 @@ def extract_tenant_id(user_id: int):
20
21
 
21
22
 
22
23
  class NumberUtil:
23
- """Used to compute the segments bases in the input sizes
24
- """
24
+ """Used to compute the segments bases in the input sizes"""
25
25
 
26
26
  def __init__(self, sizes: []):
27
27
  self._segments = []
@@ -38,15 +38,13 @@ class NumberUtil:
38
38
  raise ValueError("total size is larger than the bit-count of 64")
39
39
 
40
40
  def extract(self, value: int, index: int):
41
- """Extract the tenant_id given the user_id and the index
42
- """
41
+ """Extract the tenant_id given the user_id and the index"""
43
42
  segment = self._segments[index]
44
43
  return value >> segment._shift & segment._mask
45
44
 
46
45
 
47
46
  class Segment:
48
- """Helper class to initialize a Segment
49
- """
47
+ """Helper class to initialize a Segment"""
50
48
 
51
49
  def __init__(self, size: int, shift: int):
52
50
  mask = 0
File without changes
@@ -0,0 +1,62 @@
1
+ import re
2
+ from datetime import datetime, timezone
3
+
4
+ from symphony.bdk.core.auth.jwt_helper import generate_expiration_time
5
+ from symphony.bdk.core.config.model.bdk_retry_config import BdkRetryConfig
6
+ from symphony.bdk.core.retry import retry
7
+ from symphony.bdk.gen.agent_api.signals_api import SignalsApi
8
+ from symphony.bdk.gen.exceptions import ApiException
9
+
10
+ MIN_MAJOR_VERSION = 24
11
+ MIN_MINOR_VERSION = 12
12
+ VERSION_REGEXP = r"Agent-(\d+)\.(\d+)\..*"
13
+
14
+
15
+ class AgentVersionService:
16
+ """Service class has one purpose only. It checks if version of agents supports simplified key delivery mechanism"""
17
+
18
+ def __init__(self, signals_api: SignalsApi, retry_config: BdkRetryConfig):
19
+ self._signals_api = signals_api
20
+ self._retry_config = retry_config
21
+ self._is_skd_supported = None
22
+ self._expire_at = -1
23
+
24
+ async def is_skd_supported(self) -> bool:
25
+ """AgentVersionService stores cached version flag.
26
+ Caching interval is the same as in to session token caching.
27
+ Once cache is expired it calls agent info api to update version.
28
+
29
+ :return: boolean flag if skd supported for agent
30
+ """
31
+ if (
32
+ self._is_skd_supported is not None
33
+ and self._expire_at > datetime.now(timezone.utc).timestamp()
34
+ ):
35
+ return self._is_skd_supported
36
+ self._expire_at = generate_expiration_time()
37
+ self._is_skd_supported = await self._get_agent_skd_support()
38
+ return self._is_skd_supported
39
+
40
+ @retry
41
+ async def _get_agent_skd_support(self) -> bool:
42
+ try:
43
+ agent_info = await self._signals_api.v1_info_get()
44
+ if not agent_info or not agent_info.version:
45
+ return False
46
+ except ApiException:
47
+ return False
48
+ agent_major_version, agent_minor_version = self._parse_version(agent_info.version)
49
+ if not agent_major_version:
50
+ return False
51
+ if agent_major_version == MIN_MAJOR_VERSION:
52
+ return agent_minor_version >= MIN_MINOR_VERSION
53
+ return agent_major_version > MIN_MAJOR_VERSION
54
+
55
+ @staticmethod
56
+ def _parse_version(version_string):
57
+ if not version_string:
58
+ return None, None
59
+ match = re.match(VERSION_REGEXP, version_string)
60
+ if match:
61
+ return int(match.group(1)), int(match.group(2))
62
+ return None, None
@@ -1,23 +1,32 @@
1
1
  """Service factory module"""
2
+
2
3
  from symphony.bdk.core.auth.auth_session import AuthSession
3
4
  from symphony.bdk.core.client.api_client_factory import ApiClientFactory
4
5
  from symphony.bdk.core.config.model.bdk_config import BdkConfig
5
6
  from symphony.bdk.core.service.application.application_service import ApplicationService
6
- from symphony.bdk.core.service.connection.connection_service import ConnectionService, OboConnectionService
7
- from symphony.bdk.core.service.datafeed.abstract_datafeed_loop import DatafeedVersion, AbstractDatafeedLoop
8
- from symphony.bdk.core.service.datafeed.abstract_ackId_event_loop import AbstractAckIdEventLoop
7
+ from symphony.bdk.core.service.connection.connection_service import (
8
+ ConnectionService,
9
+ OboConnectionService,
10
+ )
11
+ from symphony.bdk.core.service.datafeed.abstract_datafeed_loop import (
12
+ AbstractDatafeedLoop,
13
+ DatafeedVersion,
14
+ )
9
15
  from symphony.bdk.core.service.datafeed.abstract_datahose_loop import AbstractDatahoseLoop
10
16
  from symphony.bdk.core.service.datafeed.datafeed_loop_v1 import DatafeedLoopV1
11
17
  from symphony.bdk.core.service.datafeed.datafeed_loop_v2 import DatafeedLoopV2
12
18
  from symphony.bdk.core.service.datafeed.datahose_loop import DatahoseLoop
13
19
  from symphony.bdk.core.service.health.health_service import HealthService
14
20
  from symphony.bdk.core.service.message.message_service import MessageService, OboMessageService
15
- from symphony.bdk.core.service.message.multi_attachments_messages_api import MultiAttachmentsMessagesApi
16
- from symphony.bdk.core.service.presence.presence_service import PresenceService, OboPresenceService
21
+ from symphony.bdk.core.service.message.multi_attachments_messages_api import (
22
+ MultiAttachmentsMessagesApi,
23
+ )
24
+ from symphony.bdk.core.service.presence.presence_service import OboPresenceService, PresenceService
17
25
  from symphony.bdk.core.service.session.session_service import SessionService
18
- from symphony.bdk.core.service.signal.signal_service import SignalService, OboSignalService
19
- from symphony.bdk.core.service.stream.stream_service import StreamService, OboStreamService
20
- from symphony.bdk.core.service.user.user_service import UserService, OboUserService
26
+ from symphony.bdk.core.service.signal.signal_service import OboSignalService, SignalService
27
+ from symphony.bdk.core.service.stream.stream_service import OboStreamService, StreamService
28
+ from symphony.bdk.core.service.user.user_service import OboUserService, UserService
29
+ from symphony.bdk.core.service.version.agent_version_service import AgentVersionService
21
30
  from symphony.bdk.gen.agent_api.attachments_api import AttachmentsApi
22
31
  from symphony.bdk.gen.agent_api.audit_trail_api import AuditTrailApi
23
32
  from symphony.bdk.gen.agent_api.datafeed_api import DatafeedApi
@@ -52,16 +61,15 @@ class ServiceFactory:
52
61
  """
53
62
 
54
63
  def __init__(
55
- self,
56
- api_client_factory: ApiClientFactory,
57
- auth_session: AuthSession,
58
- config: BdkConfig
64
+ self, api_client_factory: ApiClientFactory, auth_session: AuthSession, config: BdkConfig
59
65
  ):
60
66
  self._pod_client = api_client_factory.get_pod_client()
61
67
  self._agent_client = api_client_factory.get_agent_client()
62
68
  self._auth_session = auth_session
63
69
  self._config = config
64
- self._session_service = SessionService(SessionApi(self._pod_client), self._auth_session, self._config.retry)
70
+ self._session_service = SessionService(
71
+ SessionApi(self._pod_client), self._auth_session, self._config.retry
72
+ )
65
73
 
66
74
  def get_user_service(self) -> UserService:
67
75
  """Returns a fully initialized UserService
@@ -74,7 +82,8 @@ class ServiceFactory:
74
82
  AuditTrailApi(self._agent_client),
75
83
  PodSystemApi(self._pod_client),
76
84
  self._auth_session,
77
- self._config.retry
85
+ self._config.retry,
86
+ self._config.manifest,
78
87
  )
79
88
 
80
89
  def get_message_service(self) -> MessageService:
@@ -91,7 +100,7 @@ class ServiceFactory:
91
100
  AttachmentsApi(self._agent_client),
92
101
  DefaultApi(self._pod_client),
93
102
  self._auth_session,
94
- self._config.retry
103
+ self._config.retry,
95
104
  )
96
105
 
97
106
  def get_connection_service(self) -> ConnectionService:
@@ -100,9 +109,7 @@ class ServiceFactory:
100
109
  :return: a new ConnectionService instance.
101
110
  """
102
111
  return ConnectionService(
103
- ConnectionApi(self._pod_client),
104
- self._auth_session,
105
- self._config.retry
112
+ ConnectionApi(self._pod_client), self._auth_session, self._config.retry
106
113
  )
107
114
 
108
115
  def get_stream_service(self) -> StreamService:
@@ -115,7 +122,8 @@ class ServiceFactory:
115
122
  RoomMembershipApi(self._pod_client),
116
123
  ShareApi(self._agent_client),
117
124
  self._auth_session,
118
- self._config.retry)
125
+ self._config.retry,
126
+ )
119
127
 
120
128
  def get_application_service(self) -> ApplicationService:
121
129
  """Returns a fully initialized ApplicationService
@@ -126,7 +134,7 @@ class ServiceFactory:
126
134
  ApplicationApi(self._pod_client),
127
135
  AppEntitlementApi(self._pod_client),
128
136
  self._auth_session,
129
- self._config.retry
137
+ self._config.retry,
130
138
  )
131
139
 
132
140
  def get_signal_service(self) -> SignalService:
@@ -134,11 +142,7 @@ class ServiceFactory:
134
142
 
135
143
  :return: a new SignalService instance
136
144
  """
137
- return SignalService(
138
- SignalsApi(self._agent_client),
139
- self._auth_session,
140
- self._config.retry
141
- )
145
+ return SignalService(SignalsApi(self._agent_client), self._auth_session, self._config.retry)
142
146
 
143
147
  def get_session_service(self) -> SessionService:
144
148
  """Returns a fully initialized SessionService
@@ -158,13 +162,10 @@ class ServiceFactory:
158
162
  DatafeedApi(self._agent_client),
159
163
  self._session_service,
160
164
  self._auth_session,
161
- self._config
165
+ self._config,
162
166
  )
163
167
  return DatafeedLoopV2(
164
- DatafeedApi(self._agent_client),
165
- self._session_service,
166
- self._auth_session,
167
- self._config
168
+ DatafeedApi(self._agent_client), self._session_service, self._auth_session, self._config
168
169
  )
169
170
 
170
171
  def get_datahose_loop(self) -> AbstractDatahoseLoop:
@@ -177,7 +178,7 @@ class ServiceFactory:
177
178
  DatafeedApi(self._agent_client),
178
179
  self._session_service,
179
180
  self._auth_session,
180
- self._config
181
+ self._config,
181
182
  )
182
183
 
183
184
  def get_health_service(self) -> HealthService:
@@ -186,9 +187,7 @@ class ServiceFactory:
186
187
  :return: a new HealthService instance
187
188
  """
188
189
  return HealthService(
189
- AgentSystemApi(self._agent_client),
190
- SignalsApi(self._agent_client),
191
- self._config.retry
190
+ AgentSystemApi(self._agent_client), SignalsApi(self._agent_client), self._config.retry
192
191
  )
193
192
 
194
193
  def get_presence_service(self) -> PresenceService:
@@ -197,11 +196,16 @@ class ServiceFactory:
197
196
  :return: a new PresenceService instance
198
197
  """
199
198
  return PresenceService(
200
- PresenceApi(self._pod_client),
201
- self._auth_session,
202
- self._config.retry
199
+ PresenceApi(self._pod_client), self._auth_session, self._config.retry
203
200
  )
204
201
 
202
+ def get_agent_version_service(self) -> AgentVersionService:
203
+ """Returns a fully initialized AgentVersionService
204
+
205
+ :return: a new AgentVersionService instance
206
+ """
207
+ return AgentVersionService(SignalsApi(self._agent_client), self._config.retry)
208
+
205
209
 
206
210
  class OboServiceFactory:
207
211
  """Factory responsible for creating BDK service instances for OBO-enabled endpoints only:
@@ -215,10 +219,7 @@ class OboServiceFactory:
215
219
  """
216
220
 
217
221
  def __init__(
218
- self,
219
- api_client_factory: ApiClientFactory,
220
- auth_session: AuthSession,
221
- config: BdkConfig
222
+ self, api_client_factory: ApiClientFactory, auth_session: AuthSession, config: BdkConfig
222
223
  ):
223
224
  self._pod_client = api_client_factory.get_pod_client()
224
225
  self._agent_client = api_client_factory.get_agent_client()
@@ -234,7 +235,7 @@ class OboServiceFactory:
234
235
  UserApi(self._pod_client),
235
236
  UsersApi(self._pod_client),
236
237
  self._auth_session,
237
- self._config.retry
238
+ self._config.retry,
238
239
  )
239
240
 
240
241
  def get_message_service(self) -> OboMessageService:
@@ -245,8 +246,9 @@ class OboServiceFactory:
245
246
  return OboMessageService(
246
247
  MultiAttachmentsMessagesApi(self._agent_client),
247
248
  MessageSuppressionApi(self._pod_client),
249
+ self._pod_client,
248
250
  self._auth_session,
249
- self._config.retry
251
+ self._config.retry,
250
252
  )
251
253
 
252
254
  def get_connection_service(self) -> OboConnectionService:
@@ -255,9 +257,7 @@ class OboServiceFactory:
255
257
  :return: a new OboConnectionService instance.
256
258
  """
257
259
  return OboConnectionService(
258
- ConnectionApi(self._pod_client),
259
- self._auth_session,
260
- self._config.retry
260
+ ConnectionApi(self._pod_client), self._auth_session, self._config.retry
261
261
  )
262
262
 
263
263
  def get_stream_service(self) -> OboStreamService:
@@ -270,7 +270,8 @@ class OboServiceFactory:
270
270
  RoomMembershipApi(self._pod_client),
271
271
  ShareApi(self._agent_client),
272
272
  self._auth_session,
273
- self._config.retry)
273
+ self._config.retry,
274
+ )
274
275
 
275
276
  def get_presence_service(self) -> OboPresenceService:
276
277
  """Returns a fully initialized OboPresenceService
@@ -278,9 +279,7 @@ class OboServiceFactory:
278
279
  :return: a new OboPresenceService instance
279
280
  """
280
281
  return OboPresenceService(
281
- PresenceApi(self._pod_client),
282
- self._auth_session,
283
- self._config.retry
282
+ PresenceApi(self._pod_client), self._auth_session, self._config.retry
284
283
  )
285
284
 
286
285
  def get_signal_service(self) -> OboSignalService:
@@ -289,7 +288,5 @@ class OboServiceFactory:
289
288
  :return: a new OboSignalService instance
290
289
  """
291
290
  return OboSignalService(
292
- SignalsApi(self._agent_client),
293
- self._auth_session,
294
- self._config.retry
291
+ SignalsApi(self._agent_client), self._auth_session, self._config.retry
295
292
  )
@@ -1,5 +1,5 @@
1
- """Module containing SymphonyBdk class which acts as en entry point for all BDK services.
2
- """
1
+ """Module containing SymphonyBdk class which acts as en entry point for all BDK services."""
2
+
3
3
  import functools
4
4
  import logging
5
5
 
@@ -9,7 +9,7 @@ from symphony.bdk.core.auth.authenticator_factory import AuthenticatorFactory
9
9
  from symphony.bdk.core.auth.exception import AuthInitializationError
10
10
  from symphony.bdk.core.auth.ext_app_authenticator import ExtensionAppAuthenticator
11
11
  from symphony.bdk.core.client.api_client_factory import ApiClientFactory
12
- from symphony.bdk.core.config.exception import BotNotConfiguredError, BdkConfigError
12
+ from symphony.bdk.core.config.exception import BdkConfigError, BotNotConfiguredError
13
13
  from symphony.bdk.core.extension import ExtensionService
14
14
  from symphony.bdk.core.service.application.application_service import ApplicationService
15
15
  from symphony.bdk.core.service.connection.connection_service import ConnectionService
@@ -55,6 +55,7 @@ def app_service(func):
55
55
  :return: the value returned by the decorated function with the passed arguments.
56
56
  :raise: BdkConfigError if the app is not configured.
57
57
  """
58
+
58
59
  @functools.wraps(func)
59
60
  def check_if_app_configured_and_call_function(*args, **kwds):
60
61
  symphony_bdk = args[0]
@@ -66,8 +67,7 @@ def app_service(func):
66
67
 
67
68
 
68
69
  class SymphonyBdk:
69
- """BDK entry point
70
- """
70
+ """BDK entry point"""
71
71
 
72
72
  async def __aenter__(self):
73
73
  return self
@@ -80,7 +80,9 @@ class SymphonyBdk:
80
80
  self._api_client_factory = ApiClientFactory(config)
81
81
  self._pod_client = self._api_client_factory.get_pod_client()
82
82
  self._agent_client = self._api_client_factory.get_agent_client()
83
- self._authenticator_factory = AuthenticatorFactory(config, api_client_factory=self._api_client_factory)
83
+ self._authenticator_factory = AuthenticatorFactory(
84
+ config, api_client_factory=self._api_client_factory
85
+ )
84
86
 
85
87
  self._bot_session = None
86
88
  self._ext_app_authenticator = None
@@ -101,12 +103,17 @@ class SymphonyBdk:
101
103
  if self._config.bot.is_authentication_configured():
102
104
  self._initialize_bot_services()
103
105
  else:
104
- logging.info("Bot (service account) credentials have not been configured."
105
- "You can however use services in OBO mode if app authentication is configured.")
106
+ logging.info(
107
+ "Bot (service account) credentials have not been configured."
108
+ "You can however use services in OBO mode if app authentication is configured."
109
+ )
106
110
 
107
111
  def _initialize_bot_services(self):
108
- self._bot_session = AuthSession(self._authenticator_factory.get_bot_authenticator())
109
- self._service_factory = ServiceFactory(self._api_client_factory, self._bot_session, self._config)
112
+ bot_authenticator = self._authenticator_factory.get_bot_authenticator()
113
+ self._bot_session = AuthSession(bot_authenticator)
114
+ self._service_factory = ServiceFactory(
115
+ self._api_client_factory, self._bot_session, self._config
116
+ )
110
117
  self._user_service = self._service_factory.get_user_service()
111
118
  self._message_service = self._service_factory.get_message_service()
112
119
  self._connection_service = self._service_factory.get_connection_service()
@@ -122,7 +129,10 @@ class SymphonyBdk:
122
129
  self._activity_registry = ActivityRegistry(self._session_service)
123
130
  self._datafeed_loop.subscribe(self._activity_registry)
124
131
  # initialises extension service and register decorated extensions
125
- self._extension_service = ExtensionService(self._api_client_factory, self._bot_session, self._config)
132
+ self._extension_service = ExtensionService(
133
+ self._api_client_factory, self._bot_session, self._config
134
+ )
135
+ bot_authenticator.agent_version_service = self._service_factory.get_agent_version_service()
126
136
 
127
137
  @bot_service
128
138
  def bot_session(self) -> AuthSession:
@@ -140,7 +150,9 @@ class SymphonyBdk:
140
150
  :return: a new instance of :class:`symphony.bdk.core.auth.ext_app_authenticator.ExtensionAppAuthenticator`
141
151
  """
142
152
  if self._ext_app_authenticator is None:
143
- self._ext_app_authenticator = self._authenticator_factory.get_extension_app_authenticator()
153
+ self._ext_app_authenticator = (
154
+ self._authenticator_factory.get_extension_app_authenticator()
155
+ )
144
156
  return self._ext_app_authenticator
145
157
 
146
158
  @app_service
@@ -150,11 +162,16 @@ class SymphonyBdk:
150
162
  :return: The obo authentication session
151
163
  """
152
164
  if user_id is not None:
153
- return self._authenticator_factory.get_obo_authenticator().authenticate_by_user_id(user_id)
165
+ return self._authenticator_factory.get_obo_authenticator().authenticate_by_user_id(
166
+ user_id
167
+ )
154
168
  if username is not None:
155
- return self._authenticator_factory.get_obo_authenticator().authenticate_by_username(username)
156
- raise AuthInitializationError("At least user_id or username should be given to OBO authenticate the "
157
- "extension app")
169
+ return self._authenticator_factory.get_obo_authenticator().authenticate_by_username(
170
+ username
171
+ )
172
+ raise AuthInitializationError(
173
+ "At least user_id or username should be given to OBO authenticate the extension app"
174
+ )
158
175
 
159
176
  @app_service
160
177
  def obo_services(self, obo_session: OboAuthSession) -> OboServices:
@@ -270,6 +287,5 @@ class SymphonyBdk:
270
287
  return self._extension_service
271
288
 
272
289
  async def close_clients(self):
273
- """Close all the existing api clients created by the api client factory.
274
- """
290
+ """Close all the existing api clients created by the api client factory."""
275
291
  await self._api_client_factory.close_clients()
symphony/bdk/ext/group.py CHANGED
@@ -1,10 +1,14 @@
1
1
  from typing import AsyncGenerator
2
2
 
3
- from symphony.bdk.core.extension import BdkAuthenticationAware, BdkApiClientFactoryAware, BdkExtensionServiceProvider, \
4
- BdkConfigAware
3
+ from symphony.bdk.core.extension import (
4
+ BdkApiClientFactoryAware,
5
+ BdkAuthenticationAware,
6
+ BdkConfigAware,
7
+ BdkExtensionServiceProvider,
8
+ )
5
9
  from symphony.bdk.core.retry import retry
6
10
  from symphony.bdk.core.retry.strategy import is_network_or_minor_error, is_unauthorized
7
- from symphony.bdk.core.service.pagination import offset_based_pagination, cursor_based_pagination
11
+ from symphony.bdk.core.service.pagination import cursor_based_pagination
8
12
  from symphony.bdk.core.service.user.user_util import extract_tenant_id
9
13
  from symphony.bdk.gen.group_api.group_api import GroupApi
10
14
  from symphony.bdk.gen.group_model.add_member import AddMember
@@ -34,10 +38,10 @@ async def refresh_bearer_token_if_unauthorized(retry_state):
34
38
  return False
35
39
 
36
40
 
37
- class SymphonyGroupBdkExtension(BdkAuthenticationAware, BdkApiClientFactoryAware, BdkConfigAware,
38
- BdkExtensionServiceProvider):
39
- """Extension for Symphony Groups APIs
40
- """
41
+ class SymphonyGroupBdkExtension(
42
+ BdkAuthenticationAware, BdkApiClientFactoryAware, BdkConfigAware, BdkExtensionServiceProvider
43
+ ):
44
+ """Extension for Symphony Groups APIs"""
41
45
 
42
46
  def __init__(self):
43
47
  self._api_client_factory = None
@@ -58,15 +62,15 @@ class SymphonyGroupBdkExtension(BdkAuthenticationAware, BdkApiClientFactoryAware
58
62
 
59
63
 
60
64
  class SymphonyGroupService:
61
- """Service class for managing Symphony Groups
62
- """
65
+ """Service class for managing Symphony Groups"""
63
66
 
64
67
  def __init__(self, api_client_factory, auth_session, retry_config):
65
68
  self._api_client_factory = api_client_factory
66
69
  self._auth_session = auth_session
67
70
  self._retry_config = retry_config
68
- self._oauth_session = OAuthSession(self._api_client_factory.get_login_client(), self._auth_session,
69
- self._retry_config)
71
+ self._oauth_session = OAuthSession(
72
+ self._api_client_factory.get_login_client(), self._auth_session, self._retry_config
73
+ )
70
74
  client = self._api_client_factory.get_client("/profile-manager")
71
75
  client.configuration.auth_settings = self._oauth_session.get_auth_settings
72
76
 
@@ -85,8 +89,14 @@ class SymphonyGroupService:
85
89
  return await self._group_api.insert_group(x_symphony_host="", create_group=create_group)
86
90
 
87
91
  @retry(retry=refresh_bearer_token_if_unauthorized)
88
- async def list_groups(self, status: Status = None, before: str = None, after: str = None, limit: int = None,
89
- sort_order: SortOrder = None) -> GroupList:
92
+ async def list_groups(
93
+ self,
94
+ status: Status = None,
95
+ before: str = None,
96
+ after: str = None,
97
+ limit: int = None,
98
+ sort_order: SortOrder = None,
99
+ ) -> GroupList:
90
100
  """List groups of type SDL
91
101
  See: `List all groups of specified type <https://developers.symphony.com/restapi/reference/listgroups>`_
92
102
 
@@ -112,10 +122,7 @@ class SymphonyGroupService:
112
122
  return await self._group_api.list_groups(**kwargs)
113
123
 
114
124
  async def list_all_groups(
115
- self,
116
- status: Status = None,
117
- chunk_size: int = 100,
118
- max_number: int = None
125
+ self, status: Status = None, chunk_size: int = 100, max_number: int = None
119
126
  ) -> AsyncGenerator[ReadGroup, None]:
120
127
  """Returns an asynchronous generator of groups of type SDL
121
128
  See: `List all groups of specified type <https://developers.symphony.com/restapi/reference/listgroups>`_
@@ -128,15 +135,15 @@ class SymphonyGroupService:
128
135
  """
129
136
 
130
137
  async def groups_one_page(limit, after=None):
131
- result = await self.list_groups(status=status,
132
- limit=limit,
133
- after=after)
134
- return result.data, getattr(result.pagination.cursors, 'after', None)
138
+ result = await self.list_groups(status=status, limit=limit, after=after)
139
+ return result.data, getattr(result.pagination.cursors, "after", None)
135
140
 
136
141
  return cursor_based_pagination(groups_one_page, chunk_size, max_number)
137
142
 
138
143
  @retry(retry=refresh_bearer_token_if_unauthorized)
139
- async def update_group(self, if_match: str, group_id: str, update_group: UpdateGroup) -> ReadGroup:
144
+ async def update_group(
145
+ self, if_match: str, group_id: str, update_group: UpdateGroup
146
+ ) -> ReadGroup:
140
147
  """Update an existing group
141
148
  See: `Update a group <https://developers.symphony.com/restapi/reference/updategroup>`_
142
149
 
@@ -145,8 +152,9 @@ class SymphonyGroupService:
145
152
  :param update_group: the group fields to be updated
146
153
  :return: the updated group
147
154
  """
148
- return await self._group_api.update_group(x_symphony_host="", if_match=if_match, group_id=group_id,
149
- update_group=update_group)
155
+ return await self._group_api.update_group(
156
+ x_symphony_host="", if_match=if_match, group_id=group_id, update_group=update_group
157
+ )
150
158
 
151
159
  @retry(retry=refresh_bearer_token_if_unauthorized)
152
160
  async def update_avatar(self, group_id: str, image: str) -> ReadGroup:
@@ -159,7 +167,9 @@ class SymphonyGroupService:
159
167
  :return: the updated group
160
168
  """
161
169
  upload_avatar = UploadAvatar(image=image)
162
- return await self._group_api.update_avatar(x_symphony_host="", group_id=group_id, upload_avatar=upload_avatar)
170
+ return await self._group_api.update_avatar(
171
+ x_symphony_host="", group_id=group_id, upload_avatar=upload_avatar
172
+ )
163
173
 
164
174
  @retry(retry=refresh_bearer_token_if_unauthorized)
165
175
  async def get_group(self, group_id: str) -> ReadGroup:
@@ -181,13 +191,13 @@ class SymphonyGroupService:
181
191
  :return: the updated group
182
192
  """
183
193
  member = Member(member_id=user_id, member_tenant=extract_tenant_id(user_id))
184
- return await self._group_api.add_member_to_group(x_symphony_host="", group_id=group_id,
185
- add_member=AddMember(member=member))
194
+ return await self._group_api.add_member_to_group(
195
+ x_symphony_host="", group_id=group_id, add_member=AddMember(member=member)
196
+ )
186
197
 
187
198
 
188
199
  class OAuthSession:
189
- """Used to handle the bearer token needed to call Groups endpoints.
190
- """
200
+ """Used to handle the bearer token needed to call Groups endpoints."""
191
201
 
192
202
  def __init__(self, login_client, session, retry_config):
193
203
  self._authentication_api = AuthenticationApi(login_client)
@@ -197,10 +207,10 @@ class OAuthSession:
197
207
 
198
208
  @retry
199
209
  async def refresh(self):
200
- """Refreshes internal Bearer authentication token from the bot sessionToken.
201
- """
202
- jwt_token = await self._authentication_api.idm_tokens_post(await self._auth_session.session_token,
203
- scope="profile-manager")
210
+ """Refreshes internal Bearer authentication token from the bot sessionToken."""
211
+ jwt_token = await self._authentication_api.idm_tokens_post(
212
+ await self._auth_session.session_token, scope="profile-manager"
213
+ )
204
214
  self._bearer_token = jwt_token.access_token
205
215
 
206
216
  async def get_auth_settings(self):
@@ -208,12 +218,17 @@ class OAuthSession:
208
218
 
209
219
  :return: the map of auth_settings containing the header value with the current bearer token
210
220
  """
211
- return {"bearerAuth": {"in": "header", "type": "bearer", "key": "Authorization",
212
- "value": "Bearer " + await self._get_bearer_token()}}
221
+ return {
222
+ "bearerAuth": {
223
+ "in": "header",
224
+ "type": "bearer",
225
+ "key": "Authorization",
226
+ "value": "Bearer " + await self._get_bearer_token(),
227
+ }
228
+ }
213
229
 
214
230
  async def _get_bearer_token(self):
215
- """Returns the bearer token
216
- """
231
+ """Returns the bearer token"""
217
232
  if self._bearer_token is None:
218
233
  await self.refresh()
219
234
  return self._bearer_token