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
@@ -1,9 +1,12 @@
1
1
  import base64
2
- from typing import Union, AsyncGenerator
2
+ import json
3
+ from pathlib import Path
4
+ from typing import AsyncGenerator, Union
3
5
 
4
6
  from symphony.bdk.core.auth.auth_session import AuthSession
5
7
  from symphony.bdk.core.config.model.bdk_retry_config import BdkRetryConfig
6
- from symphony.bdk.core.service.pagination import offset_based_pagination, cursor_based_pagination
8
+ from symphony.bdk.core.retry import retry
9
+ from symphony.bdk.core.service.pagination import cursor_based_pagination, offset_based_pagination
7
10
  from symphony.bdk.core.service.user.model.delegate_action_enum import DelegateActionEnum
8
11
  from symphony.bdk.core.service.user.model.role_id import RoleId
9
12
  from symphony.bdk.gen.agent_api.audit_trail_api import AuditTrailApi
@@ -21,20 +24,19 @@ from symphony.bdk.gen.pod_model.followers_list import FollowersList
21
24
  from symphony.bdk.gen.pod_model.followers_list_response import FollowersListResponse
22
25
  from symphony.bdk.gen.pod_model.following_list_response import FollowingListResponse
23
26
  from symphony.bdk.gen.pod_model.role_detail import RoleDetail
27
+ from symphony.bdk.gen.pod_model.service_account_manifest import ServiceAccountManifest
24
28
  from symphony.bdk.gen.pod_model.string_id import StringId
25
29
  from symphony.bdk.gen.pod_model.user_filter import UserFilter
26
30
  from symphony.bdk.gen.pod_model.user_id_list import UserIdList
27
31
  from symphony.bdk.gen.pod_model.user_search_query import UserSearchQuery
28
32
  from symphony.bdk.gen.pod_model.user_search_results import UserSearchResults
29
33
  from symphony.bdk.gen.pod_model.user_status import UserStatus
34
+ from symphony.bdk.gen.pod_model.user_suspension import UserSuspension
30
35
  from symphony.bdk.gen.pod_model.user_v2 import UserV2
31
36
  from symphony.bdk.gen.pod_model.v2_user_attributes import V2UserAttributes
32
37
  from symphony.bdk.gen.pod_model.v2_user_create import V2UserCreate
33
38
  from symphony.bdk.gen.pod_model.v2_user_detail import V2UserDetail
34
39
  from symphony.bdk.gen.pod_model.v2_user_list import V2UserList
35
- from symphony.bdk.gen.pod_model.user_suspension import UserSuspension
36
-
37
- from symphony.bdk.core.retry import retry
38
40
 
39
41
 
40
42
  class OboUserService:
@@ -47,10 +49,13 @@ class OboUserService:
47
49
  * follow/unfollow users
48
50
  """
49
51
 
50
- def __init__(self, user_api: UserApi,
51
- users_api: UsersApi,
52
- auth_session: AuthSession,
53
- retry_config: BdkRetryConfig):
52
+ def __init__(
53
+ self,
54
+ user_api: UserApi,
55
+ users_api: UsersApi,
56
+ auth_session: AuthSession,
57
+ retry_config: BdkRetryConfig,
58
+ ):
54
59
  self._user_api = user_api
55
60
  self._users_api = users_api
56
61
  self._auth_session = auth_session
@@ -58,10 +63,7 @@ class OboUserService:
58
63
 
59
64
  @retry
60
65
  async def list_users_by_ids(
61
- self,
62
- user_ids: [int],
63
- local: bool = False,
64
- active: bool = None
66
+ self, user_ids: [int], local: bool = False, active: bool = None
65
67
  ) -> V2UserList:
66
68
  """Search users by user ids.
67
69
  See : `Users Lookup v3 <https://developers.symphony.com/restapi/reference/users-lookup-v3>`_
@@ -76,22 +78,19 @@ class OboUserService:
76
78
 
77
79
  :return: Users found by user ids.
78
80
  """
79
- user_ids_str = ','.join(map(str, user_ids))
81
+ user_ids_str = ",".join(map(str, user_ids))
80
82
  params = {
81
- 'uid': user_ids_str,
82
- 'local': local,
83
- 'session_token': await self._auth_session.session_token
83
+ "uid": user_ids_str,
84
+ "local": local,
85
+ "session_token": await self._auth_session.session_token,
84
86
  }
85
87
  if active is not None:
86
- params['active'] = active
88
+ params["active"] = active
87
89
  return await self._users_api.v3_users_get(**params)
88
90
 
89
91
  @retry
90
92
  async def list_users_by_emails(
91
- self,
92
- emails: [str],
93
- local: bool = False,
94
- active: bool = None
93
+ self, emails: [str], local: bool = False, active: bool = None
95
94
  ) -> V2UserList:
96
95
  """Search users by emails.
97
96
  See : `Users Lookup v3 <https://developers.symphony.com/restapi/reference/users-lookup-v3>`_
@@ -106,22 +105,18 @@ class OboUserService:
106
105
 
107
106
  :return: Users found by emails.
108
107
  """
109
- emails_str = ','.join(emails)
108
+ emails_str = ",".join(emails)
110
109
  params = {
111
- 'email': emails_str,
112
- 'local': local,
113
- 'session_token': await self._auth_session.session_token
110
+ "email": emails_str,
111
+ "local": local,
112
+ "session_token": await self._auth_session.session_token,
114
113
  }
115
114
  if active is not None:
116
- params['active'] = active
115
+ params["active"] = active
117
116
  return await self._users_api.v3_users_get(**params)
118
117
 
119
118
  @retry
120
- async def list_users_by_usernames(
121
- self,
122
- usernames: [str],
123
- active: bool = None
124
- ) -> V2UserList:
119
+ async def list_users_by_usernames(self, usernames: [str], active: bool = None) -> V2UserList:
125
120
  """Search users by usernames.
126
121
  See : `Users Lookup v3 <https://developers.symphony.com/restapi/reference/users-lookup-v3>`_
127
122
 
@@ -132,23 +127,19 @@ class OboUserService:
132
127
 
133
128
  :return: Users found by usernames.
134
129
  """
135
- usernames_str = ','.join(usernames)
130
+ usernames_str = ",".join(usernames)
136
131
  params = {
137
- 'username': usernames_str,
138
- 'local': True,
139
- 'session_token': await self._auth_session.session_token
132
+ "username": usernames_str,
133
+ "local": True,
134
+ "session_token": await self._auth_session.session_token,
140
135
  }
141
136
  if active is not None:
142
- params['active'] = active
137
+ params["active"] = active
143
138
  return await self._users_api.v3_users_get(**params)
144
139
 
145
140
  @retry
146
141
  async def search_users(
147
- self,
148
- query: UserSearchQuery,
149
- local: bool = False,
150
- skip: int = 0,
151
- limit: int = 50
142
+ self, query: UserSearchQuery, local: bool = False, skip: int = 0, limit: int = 50
152
143
  ) -> UserSearchResults:
153
144
  """Search for users by first name, last name, display name, and email; optionally, filter results by company,
154
145
  title, location, marketCoverage, responsibility, function, or instrument.
@@ -165,20 +156,20 @@ class OboUserService:
165
156
 
166
157
  """
167
158
  params = {
168
- 'search_request': query,
169
- 'local': local,
170
- 'session_token': await self._auth_session.session_token,
171
- 'skip': skip,
172
- 'limit': limit
159
+ "search_request": query,
160
+ "local": local,
161
+ "session_token": await self._auth_session.session_token,
162
+ "skip": skip,
163
+ "limit": limit,
173
164
  }
174
165
  return await self._users_api.v1_user_search_post(**params)
175
166
 
176
167
  async def search_all_users(
177
- self,
178
- query: UserSearchQuery,
179
- local: bool = False,
180
- chunk_size: int = 50,
181
- max_number: int = None
168
+ self,
169
+ query: UserSearchQuery,
170
+ local: bool = False,
171
+ chunk_size: int = 50,
172
+ max_number: int = None,
182
173
  ) -> AsyncGenerator[UserV2, None]:
183
174
  """Search for users by first name, last name, display name, and email; optionally, filter results by company,
184
175
  title, location, marketCoverage, responsibility, function, or instrument.
@@ -203,11 +194,7 @@ class OboUserService:
203
194
  return offset_based_pagination(search_users_one_page, chunk_size, max_number)
204
195
 
205
196
  @retry
206
- async def follow_user(
207
- self,
208
- follower_ids: [int],
209
- user_id: int
210
- ) -> None:
197
+ async def follow_user(self, follower_ids: [int], user_id: int) -> None:
211
198
  """Make a list of users to start following a specific user.
212
199
  See: `Follow User <https://developers.symphony.com/restapi/reference/follow-user>`_
213
200
 
@@ -215,18 +202,14 @@ class OboUserService:
215
202
  :param user_id: The id of the user to be followed.
216
203
  """
217
204
  params = {
218
- 'uid': user_id,
219
- 'uid_list': FollowersList(followers=UserIdList(value=follower_ids)),
220
- 'session_token': await self._auth_session.session_token
205
+ "uid": user_id,
206
+ "uid_list": FollowersList(followers=UserIdList(value=follower_ids)),
207
+ "session_token": await self._auth_session.session_token,
221
208
  }
222
209
  await self._user_api.v1_user_uid_follow_post(**params)
223
210
 
224
211
  @retry
225
- async def unfollow_user(
226
- self,
227
- follower_ids: [int],
228
- user_id: int
229
- ) -> None:
212
+ async def unfollow_user(self, follower_ids: [int], user_id: int) -> None:
230
213
  """Make a list of users to stop following a specific user.
231
214
  See: `Unfollow User <https://developers.symphony.com/restapi/reference/unfollow-user>`_
232
215
 
@@ -234,9 +217,9 @@ class OboUserService:
234
217
  :param user_id: The id of the user to be unfollowed.
235
218
  """
236
219
  params = {
237
- 'uid': user_id,
238
- 'uid_list': FollowersList(followers=UserIdList(value=follower_ids)),
239
- 'session_token': await self._auth_session.session_token
220
+ "uid": user_id,
221
+ "uid_list": FollowersList(followers=UserIdList(value=follower_ids)),
222
+ "session_token": await self._auth_session.session_token,
240
223
  }
241
224
  await self._user_api.v1_user_uid_unfollow_post(**params)
242
225
 
@@ -255,39 +238,34 @@ class UserService(OboUserService):
255
238
  * Get, update status of a user
256
239
  """
257
240
 
258
- def __init__(self, user_api: UserApi,
259
- users_api: UsersApi,
260
- audit_trail_api: AuditTrailApi,
261
- system_api: SystemApi,
262
- auth_session: AuthSession,
263
- retry_config: BdkRetryConfig):
241
+ def __init__(
242
+ self,
243
+ user_api: UserApi,
244
+ users_api: UsersApi,
245
+ audit_trail_api: AuditTrailApi,
246
+ system_api: SystemApi,
247
+ auth_session: AuthSession,
248
+ retry_config: BdkRetryConfig,
249
+ manifest: str,
250
+ ):
264
251
  super().__init__(user_api, users_api, auth_session, retry_config)
265
252
  self._audit_trail_api = audit_trail_api
266
253
  self._system_api = system_api
254
+ self._manifest = manifest
267
255
 
268
256
  @retry
269
- async def get_user_detail(
270
- self,
271
- user_id: int
272
- ) -> V2UserDetail:
257
+ async def get_user_detail(self, user_id: int) -> V2UserDetail:
273
258
  """Retrieve user details of a particular user.
274
259
  See: 'Get User v2 <https://developers.symphony.com/restapi/reference/get-user-v2>'_
275
260
 
276
261
  :param user_id: User Id
277
262
  :return: Details of the user.
278
263
  """
279
- params = {
280
- 'uid': user_id,
281
- 'session_token': await self._auth_session.session_token
282
- }
264
+ params = {"uid": user_id, "session_token": await self._auth_session.session_token}
283
265
  return await self._user_api.v2_admin_user_uid_get(**params)
284
266
 
285
267
  @retry
286
- async def list_user_details(
287
- self,
288
- skip: int = 0,
289
- limit: int = 50
290
- ) -> [V2UserDetail]:
268
+ async def list_user_details(self, skip: int = 0, limit: int = 50) -> [V2UserDetail]:
291
269
  """Retrieve all users in the company (pod).
292
270
  See: 'List Users V2 <https://developers.symphony.com/restapi/reference/list-users-v2>'_
293
271
 
@@ -296,17 +274,15 @@ class UserService(OboUserService):
296
274
  :return: List of details of all users in the company.
297
275
  """
298
276
  params = {
299
- 'session_token': await self._auth_session.session_token,
300
- 'skip': skip,
301
- 'limit': limit
277
+ "session_token": await self._auth_session.session_token,
278
+ "skip": skip,
279
+ "limit": limit,
302
280
  }
303
281
  user_detail_list = await self._user_api.v2_admin_user_list_get(**params)
304
282
  return user_detail_list.value
305
283
 
306
284
  async def list_all_user_details(
307
- self,
308
- chunk_size: int = 50,
309
- max_number: int = None
285
+ self, chunk_size: int = 50, max_number: int = None
310
286
  ) -> AsyncGenerator[V2UserDetail, None]:
311
287
  """Retrieve all users in the company (pod).
312
288
  Same as :func:`~list_user_details` but returns an asynchronous generator which performs the paginated calls with
@@ -322,10 +298,7 @@ class UserService(OboUserService):
322
298
 
323
299
  @retry
324
300
  async def list_user_details_by_filter(
325
- self,
326
- user_filter: UserFilter,
327
- skip: int = 0,
328
- limit: int = 50
301
+ self, user_filter: UserFilter, skip: int = 0, limit: int = 50
329
302
  ) -> [V2UserDetail]:
330
303
  """Retrieve a list of users in the company (pod) by a filter.
331
304
  See: `Find Users V1 <https://developers.symphony.com/restapi/reference/find-users>`_
@@ -336,19 +309,16 @@ class UserService(OboUserService):
336
309
  :return: List of retrieved users.
337
310
  """
338
311
  params = {
339
- 'payload': user_filter,
340
- 'session_token': await self._auth_session.session_token,
341
- 'skip': skip,
342
- 'limit': limit
312
+ "payload": user_filter,
313
+ "session_token": await self._auth_session.session_token,
314
+ "skip": skip,
315
+ "limit": limit,
343
316
  }
344
317
  user_detail_list = await self._user_api.v1_admin_user_find_post(**params)
345
318
  return user_detail_list.value
346
319
 
347
320
  async def list_all_user_details_by_filter(
348
- self,
349
- user_filter: UserFilter,
350
- chunk_size: int = 50,
351
- max_number: int = None
321
+ self, user_filter: UserFilter, chunk_size: int = 50, max_number: int = None
352
322
  ) -> AsyncGenerator[V2UserDetail, None]:
353
323
  """Retrieve an asynchronous generator of users in the company (pod) by a filter.
354
324
  Same as :func:`~list_user_details_by_filter` but returns an generator which performs the paginated
@@ -368,11 +338,7 @@ class UserService(OboUserService):
368
338
  return offset_based_pagination(list_user_details_one_page, chunk_size, max_number)
369
339
 
370
340
  @retry
371
- async def add_role(
372
- self,
373
- user_id: int,
374
- role_id: RoleId
375
- ) -> None:
341
+ async def add_role(self, user_id: int, role_id: RoleId) -> None:
376
342
  """Add a role to a user.
377
343
  See: `Add Role <https://developers.symphony.com/restapi/reference/add-role>`_
378
344
 
@@ -380,9 +346,9 @@ class UserService(OboUserService):
380
346
  :param role_id: role id
381
347
  """
382
348
  params = {
383
- 'uid': user_id,
384
- 'payload': StringId(id=role_id.value),
385
- 'session_token': await self._auth_session.session_token
349
+ "uid": user_id,
350
+ "payload": StringId(id=role_id.value),
351
+ "session_token": await self._auth_session.session_token,
386
352
  }
387
353
  await self._user_api.v1_admin_user_uid_roles_add_post(**params)
388
354
 
@@ -393,18 +359,12 @@ class UserService(OboUserService):
393
359
 
394
360
  :return: List of all roles details in the pod.
395
361
  """
396
- params = {
397
- 'session_token': await self._auth_session.session_token
398
- }
362
+ params = {"session_token": await self._auth_session.session_token}
399
363
  role_list = await self._system_api.v1_admin_system_roles_list_get(**params)
400
364
  return role_list.value
401
365
 
402
366
  @retry
403
- async def remove_role(
404
- self,
405
- user_id: int,
406
- role_id: RoleId
407
- ) -> None:
367
+ async def remove_role(self, user_id: int, role_id: RoleId) -> None:
408
368
  """Remove a role from a user.
409
369
  See: `Remove Role <https://developers.symphony.com/restapi/reference/remove-role>`_
410
370
 
@@ -412,36 +372,26 @@ class UserService(OboUserService):
412
372
  :param role_id: role id
413
373
  """
414
374
  params = {
415
- 'uid': user_id,
416
- 'payload': StringId(id=role_id.value),
417
- 'session_token': await self._auth_session.session_token
375
+ "uid": user_id,
376
+ "payload": StringId(id=role_id.value),
377
+ "session_token": await self._auth_session.session_token,
418
378
  }
419
379
  await self._user_api.v1_admin_user_uid_roles_remove_post(**params)
420
380
 
421
381
  @retry
422
- async def get_avatar(
423
- self,
424
- user_id: int
425
- ) -> [Avatar]:
382
+ async def get_avatar(self, user_id: int) -> [Avatar]:
426
383
  """Get the url of avatar of a user.
427
384
  See: `User Avatar <https://developers.symphony.com/restapi/reference/user-avatar>`_
428
385
 
429
386
  :param user_id: User id
430
387
  :return: List of avatar urls of the user
431
388
  """
432
- params = {
433
- 'uid': user_id,
434
- 'session_token': await self._auth_session.session_token
435
- }
389
+ params = {"uid": user_id, "session_token": await self._auth_session.session_token}
436
390
  avatar_list = await self._user_api.v1_admin_user_uid_avatar_get(**params)
437
391
  return avatar_list.value
438
392
 
439
393
  @retry
440
- async def update_avatar(
441
- self,
442
- user_id: int,
443
- image: Union[str, bytes]
444
- ) -> None:
394
+ async def update_avatar(self, user_id: int, image: Union[str, bytes]) -> None:
445
395
  """Update avatar of a user.
446
396
  See: `Update User Avatar <https://developers.symphony.com/restapi/reference/update-user-avatar>`_
447
397
 
@@ -452,51 +402,35 @@ class UserService(OboUserService):
452
402
  if isinstance(image, bytes):
453
403
  image = str(base64.standard_b64encode(image))
454
404
  params = {
455
- 'uid': user_id,
456
- 'payload': AvatarUpdate(image=image),
457
- 'session_token': await self._auth_session.session_token
405
+ "uid": user_id,
406
+ "payload": AvatarUpdate(image=image),
407
+ "session_token": await self._auth_session.session_token,
458
408
  }
459
409
  await self._user_api.v1_admin_user_uid_avatar_update_post(**params)
460
410
 
461
411
  @retry
462
- async def get_disclaimer(
463
- self,
464
- user_id: int
465
- ) -> Disclaimer:
412
+ async def get_disclaimer(self, user_id: int) -> Disclaimer:
466
413
  """Get disclaimer assigned to a user.
467
414
  See: `User Disclaimer <https://developers.symphony.com/restapi/reference/user-disclaimer>`_
468
415
 
469
416
  :param user_id: user id
470
417
  :return: Disclaimer assigned to the user.
471
418
  """
472
- params = {
473
- 'uid': user_id,
474
- 'session_token': await self._auth_session.session_token
475
- }
419
+ params = {"uid": user_id, "session_token": await self._auth_session.session_token}
476
420
  return await self._user_api.v1_admin_user_uid_disclaimer_get(**params)
477
421
 
478
422
  @retry
479
- async def remove_disclaimer(
480
- self,
481
- user_id: int
482
- ) -> None:
423
+ async def remove_disclaimer(self, user_id: int) -> None:
483
424
  """Unassign disclaimer from a user.
484
425
  See: `Unassign User Disclaimer <https://developers.symphony.com/restapi/reference/unassign-user-disclaimer>`_
485
426
 
486
427
  :param user_id: user id
487
428
  """
488
- params = {
489
- 'uid': user_id,
490
- 'session_token': await self._auth_session.session_token
491
- }
429
+ params = {"uid": user_id, "session_token": await self._auth_session.session_token}
492
430
  await self._user_api.v1_admin_user_uid_disclaimer_delete(**params)
493
431
 
494
432
  @retry
495
- async def add_disclaimer(
496
- self,
497
- user_id: int,
498
- disclaimer_id: str
499
- ) -> None:
433
+ async def add_disclaimer(self, user_id: int, disclaimer_id: str) -> None:
500
434
  """Assign disclaimer to a user.
501
435
  See: `Update User Disclaimer <https://developers.symphony.com/restapi/reference/update-disclaimer>`_
502
436
 
@@ -504,36 +438,27 @@ class UserService(OboUserService):
504
438
  :param disclaimer_id: Disclaimer to be assigned
505
439
  """
506
440
  params = {
507
- 'uid': user_id,
508
- 'payload': StringId(id=disclaimer_id),
509
- 'session_token': await self._auth_session.session_token
441
+ "uid": user_id,
442
+ "payload": StringId(id=disclaimer_id),
443
+ "session_token": await self._auth_session.session_token,
510
444
  }
511
445
  await self._user_api.v1_admin_user_uid_disclaimer_update_post(**params)
512
446
 
513
447
  @retry
514
- async def get_delegates(
515
- self,
516
- user_id: int
517
- ) -> [int]:
448
+ async def get_delegates(self, user_id: int) -> [int]:
518
449
  """Get delegates assigned to a user.
519
450
  See: `User Delegates <https://developers.symphony.com/restapi/reference/delegates>`_
520
451
 
521
452
  :param user_id: User id.
522
453
  :return: List of delegates assigned to a user.
523
454
  """
524
- params = {
525
- 'uid': user_id,
526
- 'session_token': await self._auth_session.session_token
527
- }
455
+ params = {"uid": user_id, "session_token": await self._auth_session.session_token}
528
456
  delegates_list = await self._user_api.v1_admin_user_uid_delegates_get(**params)
529
457
  return delegates_list.value
530
458
 
531
459
  @retry
532
460
  async def update_delegates(
533
- self,
534
- user_id: int,
535
- delegate_user_id: int,
536
- action: DelegateActionEnum
461
+ self, user_id: int, delegate_user_id: int, action: DelegateActionEnum
537
462
  ) -> None:
538
463
  """Update delegates assigned to a user.
539
464
  See: `Update User Delegates <https://developers.symphony.com/restapi/reference/update-delegates>`_
@@ -543,36 +468,26 @@ class UserService(OboUserService):
543
468
  :param action: Action to be performed
544
469
  """
545
470
  params = {
546
- 'uid': user_id,
547
- 'payload': DelegateAction(user_id=delegate_user_id, action=action.value),
548
- 'session_token': await self._auth_session.session_token
471
+ "uid": user_id,
472
+ "payload": DelegateAction(user_id=delegate_user_id, action=action.value),
473
+ "session_token": await self._auth_session.session_token,
549
474
  }
550
475
  await self._user_api.v1_admin_user_uid_delegates_update_post(**params)
551
476
 
552
477
  @retry
553
- async def get_feature_entitlements(
554
- self,
555
- user_id: int
556
- ) -> [Feature]:
478
+ async def get_feature_entitlements(self, user_id: int) -> [Feature]:
557
479
  """Get feature entitlements of a user.
558
480
  See: `User Features <https://developers.symphony.com/restapi/reference/features>`_
559
481
 
560
482
  :param user_id: User id.
561
483
  :return: List of feature entitlements of the user.
562
484
  """
563
- params = {
564
- 'uid': user_id,
565
- 'session_token': await self._auth_session.session_token
566
- }
485
+ params = {"uid": user_id, "session_token": await self._auth_session.session_token}
567
486
  feature_list = await self._user_api.v1_admin_user_uid_features_get(**params)
568
487
  return feature_list.value
569
488
 
570
489
  @retry
571
- async def update_feature_entitlements(
572
- self,
573
- user_id: int,
574
- features: [Feature]
575
- ) -> None:
490
+ async def update_feature_entitlements(self, user_id: int, features: [Feature]) -> None:
576
491
  """Update feature entitlements of a user.
577
492
  See: `Update User Features <https://developers.symphony.com/restapi/reference/update-features>`_
578
493
 
@@ -580,35 +495,25 @@ class UserService(OboUserService):
580
495
  :param features: List of feature entitlements to be updated
581
496
  """
582
497
  params = {
583
- 'uid': user_id,
584
- 'payload': FeatureList(value=features),
585
- 'session_token': await self._auth_session.session_token
498
+ "uid": user_id,
499
+ "payload": FeatureList(value=features),
500
+ "session_token": await self._auth_session.session_token,
586
501
  }
587
502
  await self._user_api.v1_admin_user_uid_features_update_post(**params)
588
503
 
589
504
  @retry
590
- async def get_status(
591
- self,
592
- user_id: int
593
- ) -> UserStatus:
505
+ async def get_status(self, user_id: int) -> UserStatus:
594
506
  """Get status of a user.
595
507
  See: `User Status <https://developers.symphony.com/restapi/reference/user-status>`_
596
508
 
597
509
  :param user_id: User id.
598
510
  :return: Status of the user.
599
511
  """
600
- params = {
601
- 'uid': user_id,
602
- 'session_token': await self._auth_session.session_token
603
- }
512
+ params = {"uid": user_id, "session_token": await self._auth_session.session_token}
604
513
  return await self._user_api.v1_admin_user_uid_status_get(**params)
605
514
 
606
515
  @retry
607
- async def update_status(
608
- self,
609
- user_id: int,
610
- user_status: UserStatus
611
- ) -> None:
516
+ async def update_status(self, user_id: int, user_status: UserStatus) -> None:
612
517
  """Update the status of a user.
613
518
  See: `Update User Status <https://developers.symphony.com/restapi/reference/update-user-status>`_
614
519
 
@@ -616,19 +521,15 @@ class UserService(OboUserService):
616
521
  :param user_status: Status to be updated to the user.
617
522
  """
618
523
  params = {
619
- 'uid': user_id,
620
- 'payload': user_status,
621
- 'session_token': await self._auth_session.session_token
524
+ "uid": user_id,
525
+ "payload": user_status,
526
+ "session_token": await self._auth_session.session_token,
622
527
  }
623
528
  await self._user_api.v1_admin_user_uid_status_update_post(**params)
624
529
 
625
530
  @retry
626
531
  async def list_user_followers(
627
- self,
628
- user_id: int,
629
- limit: int = 100,
630
- before: str = None,
631
- after: str = None
532
+ self, user_id: int, limit: int = 100, before: str = None, after: str = None
632
533
  ) -> FollowersListResponse:
633
534
  """Returns the list of followers of a specific user.
634
535
  See: `List User Followers <https://developers.symphony.com/restapi/reference/list-user-followers>`_
@@ -640,21 +541,18 @@ class UserService(OboUserService):
640
541
  :return: List of followers of a specific user.
641
542
  """
642
543
  params = {
643
- 'uid': user_id,
644
- 'limit': limit,
645
- 'session_token': await self._auth_session.session_token
544
+ "uid": user_id,
545
+ "limit": limit,
546
+ "session_token": await self._auth_session.session_token,
646
547
  }
647
548
  if before is not None:
648
- params['before'] = before
549
+ params["before"] = before
649
550
  if after is not None:
650
- params['after'] = after
551
+ params["after"] = after
651
552
  return await self._user_api.v1_user_uid_followers_get(**params)
652
553
 
653
554
  async def list_all_user_followers(
654
- self,
655
- user_id: int,
656
- chunk_size: int = 100,
657
- max_number: int = None
555
+ self, user_id: int, chunk_size: int = 100, max_number: int = None
658
556
  ) -> AsyncGenerator[int, None]:
659
557
  """Returns an asynchronous generator of the IDs of users who are followers of a specific user.
660
558
  See: `List User Followers <https://developers.symphony.com/restapi/reference/list-user-followers>`_
@@ -668,17 +566,13 @@ class UserService(OboUserService):
668
566
 
669
567
  async def user_followers_one_page(limit, after=None):
670
568
  result = await self.list_user_followers(user_id, limit, after=after)
671
- return result.followers, getattr(result.pagination.cursors, 'after', None)
569
+ return result.followers, getattr(result.pagination.cursors, "after", None)
672
570
 
673
571
  return cursor_based_pagination(user_followers_one_page, chunk_size, max_number)
674
572
 
675
573
  @retry
676
574
  async def list_users_following(
677
- self,
678
- user_id: int,
679
- limit: int = 100,
680
- before: str = None,
681
- after: str = None
575
+ self, user_id: int, limit: int = 100, before: str = None, after: str = None
682
576
  ) -> FollowingListResponse:
683
577
  """Returns the list of users followed by a specific user.
684
578
  See: `List Users Followed <https://developers.symphony.com/restapi/reference/list-users-followed>`_
@@ -690,21 +584,18 @@ class UserService(OboUserService):
690
584
  :return: The list of users followed by a specific user.
691
585
  """
692
586
  params = {
693
- 'uid': user_id,
694
- 'limit': limit,
695
- 'session_token': await self._auth_session.session_token
587
+ "uid": user_id,
588
+ "limit": limit,
589
+ "session_token": await self._auth_session.session_token,
696
590
  }
697
591
  if before is not None:
698
- params['before'] = before
592
+ params["before"] = before
699
593
  if after is not None:
700
- params['after'] = after
594
+ params["after"] = after
701
595
  return await self._user_api.v1_user_uid_following_get(**params)
702
596
 
703
597
  async def list_all_users_following(
704
- self,
705
- user_id: int,
706
- chunk_size: int = 100,
707
- max_number: int = None
598
+ self, user_id: int, chunk_size: int = 100, max_number: int = None
708
599
  ) -> AsyncGenerator[int, None]:
709
600
  """Returns n asynchronous generator of the IDs of users followed by a given user.
710
601
  See: `List Users Followed <https://developers.symphony.com/restapi/reference/list-users-followed>`_
@@ -718,33 +609,23 @@ class UserService(OboUserService):
718
609
 
719
610
  async def user_following_one_page(limit, after=None):
720
611
  result = await self.list_users_following(user_id, limit, after=after)
721
- return result.following, getattr(result.pagination.cursors, 'after', None)
612
+ return result.following, getattr(result.pagination.cursors, "after", None)
722
613
 
723
614
  return cursor_based_pagination(user_following_one_page, chunk_size, max_number)
724
615
 
725
616
  @retry
726
- async def create(
727
- self,
728
- payload: V2UserCreate
729
- ) -> V2UserDetail:
617
+ async def create(self, payload: V2UserCreate) -> V2UserDetail:
730
618
  """Create a new user.
731
619
  See: `Create User v2 <https://developers.symphony.com/restapi/reference/create-user-v2>`_
732
620
 
733
621
  :param payload: User's details to create.
734
622
  :return: Created user details.
735
623
  """
736
- params = {
737
- 'payload': payload,
738
- 'session_token': await self._auth_session.session_token
739
- }
624
+ params = {"payload": payload, "session_token": await self._auth_session.session_token}
740
625
  return await self._user_api.v2_admin_user_create_post(**params)
741
626
 
742
627
  @retry
743
- async def update(
744
- self,
745
- user_id: int,
746
- payload: V2UserAttributes
747
- ) -> V2UserDetail:
628
+ async def update(self, user_id: int, payload: V2UserAttributes) -> V2UserDetail:
748
629
  """Updates an existing user.
749
630
  See: `Update User v2 <https://developers.symphony.com/restapi/reference/update-user-v2>`_
750
631
 
@@ -753,22 +634,22 @@ class UserService(OboUserService):
753
634
  :return: User with the updated user details.
754
635
  """
755
636
  params = {
756
- 'uid': user_id,
757
- 'payload': payload,
758
- 'session_token': await self._auth_session.session_token
637
+ "uid": user_id,
638
+ "payload": payload,
639
+ "session_token": await self._auth_session.session_token,
759
640
  }
760
641
  return await self._user_api.v2_admin_user_uid_update_post(**params)
761
642
 
762
643
  @retry
763
644
  async def list_audit_trail(
764
- self,
765
- start_timestamp: int,
766
- end_timestamp: int = None,
767
- initiator_id: int = None,
768
- role: RoleId = None,
769
- limit: int = 50,
770
- before: int = None,
771
- after: int = None
645
+ self,
646
+ start_timestamp: int,
647
+ end_timestamp: int = None,
648
+ initiator_id: int = None,
649
+ role: RoleId = None,
650
+ limit: int = 50,
651
+ before: int = None,
652
+ after: int = None,
772
653
  ) -> V1AuditTrailInitiatorList:
773
654
  """Returns audit trail of actions performed by a privileged user in a given period of time.
774
655
  See: `List Audit Trail v1 <https://developers.symphony.com/restapi/reference/list-audit-trail-v1>`_
@@ -783,31 +664,31 @@ class UserService(OboUserService):
783
664
  :return: List of audit trail initiator.
784
665
  """
785
666
  params = {
786
- 'start_timestamp': start_timestamp,
787
- 'limit': limit,
788
- 'session_token': await self._auth_session.session_token,
789
- 'key_manager_token': await self._auth_session.key_manager_token
667
+ "start_timestamp": start_timestamp,
668
+ "limit": limit,
669
+ "session_token": await self._auth_session.session_token,
670
+ "key_manager_token": await self._auth_session.key_manager_token,
790
671
  }
791
672
  if end_timestamp is not None:
792
- params['end_timestamp'] = end_timestamp
673
+ params["end_timestamp"] = end_timestamp
793
674
  if initiator_id is not None:
794
- params['initiator_id'] = initiator_id
675
+ params["initiator_id"] = initiator_id
795
676
  if role is not None:
796
- params['role'] = role.value
677
+ params["role"] = role.value
797
678
  if before is not None:
798
- params['before'] = before
679
+ params["before"] = before
799
680
  if after is not None:
800
- params['after'] = after
681
+ params["after"] = after
801
682
  return await self._audit_trail_api.v1_audittrail_privilegeduser_get(**params)
802
683
 
803
684
  async def list_all_audit_trail(
804
- self,
805
- start_timestamp: int,
806
- end_timestamp: int = None,
807
- initiator_id: int = None,
808
- role: RoleId = None,
809
- chunk_size: int = 100,
810
- max_number: int = None
685
+ self,
686
+ start_timestamp: int,
687
+ end_timestamp: int = None,
688
+ initiator_id: int = None,
689
+ role: RoleId = None,
690
+ chunk_size: int = 100,
691
+ max_number: int = None,
811
692
  ) -> AsyncGenerator[V1AuditTrailInitiatorList, None]:
812
693
  """Returns an asynchronous generation of audit trail of actions performed by a privileged user in a given period
813
694
  of time.
@@ -824,22 +705,20 @@ class UserService(OboUserService):
824
705
  """
825
706
 
826
707
  async def audit_trail_one_page(limit, after=None):
827
- result = await self.list_audit_trail(start_timestamp=start_timestamp,
828
- end_timestamp=end_timestamp,
829
- initiator_id=initiator_id,
830
- role=role,
831
- limit=limit,
832
- after=after)
833
- return result.items, getattr(result.pagination.cursors, 'after', None)
708
+ result = await self.list_audit_trail(
709
+ start_timestamp=start_timestamp,
710
+ end_timestamp=end_timestamp,
711
+ initiator_id=initiator_id,
712
+ role=role,
713
+ limit=limit,
714
+ after=after,
715
+ )
716
+ return result.items, getattr(result.pagination.cursors, "after", None)
834
717
 
835
718
  return cursor_based_pagination(audit_trail_one_page, chunk_size, max_number)
836
719
 
837
720
  @retry
838
- async def suspend_user(
839
- self,
840
- user_id: int,
841
- user_suspension: UserSuspension
842
- ) -> None:
721
+ async def suspend_user(self, user_id: int, user_suspension: UserSuspension) -> None:
843
722
  """Suspends or re-activates (unsuspend) a user account.
844
723
  See: `Suspend User Account v1 <https://developers.symphony.com/restapi/v20.10/reference/suspend-user-v1>`_
845
724
 
@@ -847,20 +726,15 @@ class UserService(OboUserService):
847
726
  :param user_suspension: User suspension payload.
848
727
  """
849
728
  params = {
850
- 'user_id': user_id,
851
- 'payload': user_suspension,
852
- 'session_token': await self._auth_session.session_token
729
+ "user_id": user_id,
730
+ "payload": user_suspension,
731
+ "session_token": await self._auth_session.session_token,
853
732
  }
854
733
 
855
734
  await self._user_api.v1_admin_user_user_id_suspension_update_put(**params)
856
735
 
857
736
  @retry
858
- async def suspend(
859
- self,
860
- user_id: int,
861
- reason: str = None,
862
- until: int = None
863
- ) -> None:
737
+ async def suspend(self, user_id: int, reason: str = None, until: int = None) -> None:
864
738
  """Suspends a user account.
865
739
  Calling this endpoint requires a service account with the User Provisioning role.
866
740
  See: `Suspend User Account v1 <https://developers.symphony.com/restapi/v20.10/reference/suspend-user-v1>`_
@@ -870,20 +744,19 @@ class UserService(OboUserService):
870
744
  :param until: Time till when the user should be suspended in millis
871
745
  """
872
746
 
873
- user_suspension = UserSuspension(suspended=True, suspended_until=until, suspension_reason=reason)
747
+ user_suspension = UserSuspension(
748
+ suspended=True, suspended_until=until, suspension_reason=reason
749
+ )
874
750
  params = {
875
- 'user_id': user_id,
876
- 'payload': user_suspension,
877
- 'session_token': await self._auth_session.session_token
751
+ "user_id": user_id,
752
+ "payload": user_suspension,
753
+ "session_token": await self._auth_session.session_token,
878
754
  }
879
755
 
880
756
  await self._user_api.v1_admin_user_user_id_suspension_update_put(**params)
881
757
 
882
758
  @retry
883
- async def unsuspend(
884
- self,
885
- user_id: int
886
- ) -> None:
759
+ async def unsuspend(self, user_id: int) -> None:
887
760
  """Unsuspend (Re-activates) a user account.
888
761
  Calling this endpoint requires a service account with the User Provisioning role.
889
762
  See: `Suspend User Account v1 <https://developers.symphony.com/restapi/v20.10/reference/suspend-user-v1>`_
@@ -892,9 +765,48 @@ class UserService(OboUserService):
892
765
  """
893
766
 
894
767
  params = {
895
- 'user_id': user_id,
896
- 'payload': UserSuspension(suspended=False),
897
- 'session_token': await self._auth_session.session_token
768
+ "user_id": user_id,
769
+ "payload": UserSuspension(suspended=False),
770
+ "session_token": await self._auth_session.session_token,
898
771
  }
899
772
 
900
773
  await self._user_api.v1_admin_user_user_id_suspension_update_put(**params)
774
+
775
+ @retry
776
+ async def update_manifest_from_json(self, manifest_data: str) -> None:
777
+ """
778
+ Updates the user manifest from a JSON string.
779
+
780
+ :param manifest_data: A JSON string.
781
+ :raises json.JSONDecodeError: If the string is not valid JSON.
782
+ """
783
+ await self._user_api.v1_user_manifest_own_post(
784
+ session_token=await self._auth_session.session_token,
785
+ manifest=ServiceAccountManifest(manifest_data),
786
+ )
787
+
788
+ async def update_manifest_from_file(self) -> None:
789
+ """
790
+ Updates the user manifest using the file mentioned in config.yaml under 'manifest'.
791
+
792
+ :raises FileNotFoundError: If the file does not exist.
793
+ :raises json.JSONDecodeError: If the file content is not valid JSON.
794
+ :raises IOError: If the file can't be read.
795
+ """
796
+ file_path = Path(self._manifest)
797
+
798
+ with file_path.open("r", encoding="utf-8") as f:
799
+ content = json.load(f)
800
+ manifest_text = json.dumps(content)
801
+
802
+ await self._user_api.v1_user_manifest_own_post(
803
+ session_token=await self._auth_session.session_token,
804
+ manifest=ServiceAccountManifest(manifest_text),
805
+ )
806
+
807
+ @retry
808
+ async def get_manifest(self) -> ServiceAccountManifest:
809
+ """Retrieves own user manifest"""
810
+ return await self._user_api.v1_user_manifest_own_get(
811
+ session_token=await self._auth_session.session_token
812
+ )