wxcli 1.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. wxcli/__init__.py +4 -0
  2. wxcli/_playbook/.claude/agents/migration-advisor.md +239 -0
  3. wxcli/_playbook/.claude/agents/wxc-calling-builder.md +946 -0
  4. wxcli/_playbook/.claude/rules/cleanup.md +29 -0
  5. wxcli/_playbook/.claude/rules/cucm-migration.md +58 -0
  6. wxcli/_playbook/.claude/rules/org-health.md +14 -0
  7. wxcli/_playbook/.claude/settings.json +8 -0
  8. wxcli/_playbook/.claude/skills/audit-compliance/SKILL.md +515 -0
  9. wxcli/_playbook/.claude/skills/call-control/SKILL.md +747 -0
  10. wxcli/_playbook/.claude/skills/configure-features/SKILL.md +623 -0
  11. wxcli/_playbook/.claude/skills/configure-routing/SKILL.md +627 -0
  12. wxcli/_playbook/.claude/skills/contact-center/SKILL.md +1181 -0
  13. wxcli/_playbook/.claude/skills/cucm-migrate/SKILL.md +820 -0
  14. wxcli/_playbook/.claude/skills/customer-assist/SKILL.md +443 -0
  15. wxcli/_playbook/.claude/skills/device-platform/SKILL.md +407 -0
  16. wxcli/_playbook/.claude/skills/manage-call-settings/SKILL.md +757 -0
  17. wxcli/_playbook/.claude/skills/manage-devices/SKILL.md +790 -0
  18. wxcli/_playbook/.claude/skills/manage-identity/SKILL.md +638 -0
  19. wxcli/_playbook/.claude/skills/manage-licensing/SKILL.md +528 -0
  20. wxcli/_playbook/.claude/skills/manage-meetings/SKILL.md +708 -0
  21. wxcli/_playbook/.claude/skills/messaging-bots/SKILL.md +365 -0
  22. wxcli/_playbook/.claude/skills/messaging-spaces/SKILL.md +520 -0
  23. wxcli/_playbook/.claude/skills/org-health/SKILL.md +159 -0
  24. wxcli/_playbook/.claude/skills/provision-calling/SKILL.md +421 -0
  25. wxcli/_playbook/.claude/skills/query-live/SKILL.md +183 -0
  26. wxcli/_playbook/.claude/skills/query-live/domains/call-flow-trace.md +223 -0
  27. wxcli/_playbook/.claude/skills/query-live/domains/call-history.md +44 -0
  28. wxcli/_playbook/.claude/skills/query-live/domains/features.md +169 -0
  29. wxcli/_playbook/.claude/skills/query-live/domains/numbers.md +93 -0
  30. wxcli/_playbook/.claude/skills/query-live/domains/people-and-settings.md +146 -0
  31. wxcli/_playbook/.claude/skills/query-live/domains/routing.md +124 -0
  32. wxcli/_playbook/.claude/skills/reporting/SKILL.md +501 -0
  33. wxcli/_playbook/.claude/skills/reporting/references/cdr-recipes.md +1628 -0
  34. wxcli/_playbook/.claude/skills/reporting-cc/SKILL.md +251 -0
  35. wxcli/_playbook/.claude/skills/reporting-meetings/SKILL.md +290 -0
  36. wxcli/_playbook/.claude/skills/teardown/SKILL.md +214 -0
  37. wxcli/_playbook/.claude/skills/video-mesh/SKILL.md +379 -0
  38. wxcli/_playbook/.claude/skills/wxc-calling-debug/SKILL.md +475 -0
  39. wxcli/_playbook/CLAUDE.md +373 -0
  40. wxcli/_playbook/docs/reference/CLAUDE.md +25 -0
  41. wxcli/_playbook/docs/reference/admin-apps-data.md +643 -0
  42. wxcli/_playbook/docs/reference/admin-audit-security.md +322 -0
  43. wxcli/_playbook/docs/reference/admin-hybrid.md +383 -0
  44. wxcli/_playbook/docs/reference/admin-identity-scim.md +1007 -0
  45. wxcli/_playbook/docs/reference/admin-licensing.md +414 -0
  46. wxcli/_playbook/docs/reference/admin-org-management.md +586 -0
  47. wxcli/_playbook/docs/reference/admin-partner.md +357 -0
  48. wxcli/_playbook/docs/reference/archive/wxc-sdk-patterns.md +1229 -0
  49. wxcli/_playbook/docs/reference/archive/wxcadm-advanced.md +835 -0
  50. wxcli/_playbook/docs/reference/archive/wxcadm-core.md +743 -0
  51. wxcli/_playbook/docs/reference/archive/wxcadm-devices-workspaces.md +1305 -0
  52. wxcli/_playbook/docs/reference/archive/wxcadm-features.md +849 -0
  53. wxcli/_playbook/docs/reference/archive/wxcadm-locations.md +938 -0
  54. wxcli/_playbook/docs/reference/archive/wxcadm-person.md +1255 -0
  55. wxcli/_playbook/docs/reference/archive/wxcadm-routing.md +1262 -0
  56. wxcli/_playbook/docs/reference/authentication.md +965 -0
  57. wxcli/_playbook/docs/reference/call-control.md +1205 -0
  58. wxcli/_playbook/docs/reference/call-features-additional.md +2541 -0
  59. wxcli/_playbook/docs/reference/call-features-major.md +1320 -0
  60. wxcli/_playbook/docs/reference/call-routing.md +2304 -0
  61. wxcli/_playbook/docs/reference/contact-center-analytics.md +1049 -0
  62. wxcli/_playbook/docs/reference/contact-center-core.md +1614 -0
  63. wxcli/_playbook/docs/reference/contact-center-journey.md +457 -0
  64. wxcli/_playbook/docs/reference/contact-center-routing.md +1138 -0
  65. wxcli/_playbook/docs/reference/devices-core.md +1869 -0
  66. wxcli/_playbook/docs/reference/devices-dect.md +1150 -0
  67. wxcli/_playbook/docs/reference/devices-platform.md +467 -0
  68. wxcli/_playbook/docs/reference/devices-workspaces.md +1426 -0
  69. wxcli/_playbook/docs/reference/emergency-services.md +1122 -0
  70. wxcli/_playbook/docs/reference/location-calling-core.md +2037 -0
  71. wxcli/_playbook/docs/reference/location-calling-media.md +1334 -0
  72. wxcli/_playbook/docs/reference/location-recording-advanced.md +1482 -0
  73. wxcli/_playbook/docs/reference/meetings-content.md +473 -0
  74. wxcli/_playbook/docs/reference/meetings-core.md +903 -0
  75. wxcli/_playbook/docs/reference/meetings-infrastructure.md +899 -0
  76. wxcli/_playbook/docs/reference/meetings-settings.md +850 -0
  77. wxcli/_playbook/docs/reference/messaging-bots.md +1091 -0
  78. wxcli/_playbook/docs/reference/messaging-spaces.md +695 -0
  79. wxcli/_playbook/docs/reference/person-call-settings-behavior.md +1639 -0
  80. wxcli/_playbook/docs/reference/person-call-settings-handling.md +1394 -0
  81. wxcli/_playbook/docs/reference/person-call-settings-media.md +1898 -0
  82. wxcli/_playbook/docs/reference/person-call-settings-permissions.md +1329 -0
  83. wxcli/_playbook/docs/reference/provisioning.md +1366 -0
  84. wxcli/_playbook/docs/reference/reporting-analytics.md +1318 -0
  85. wxcli/_playbook/docs/reference/self-service-call-settings.md +1020 -0
  86. wxcli/_playbook/docs/reference/virtual-lines.md +1132 -0
  87. wxcli/_playbook/docs/reference/webhooks-events.md +1444 -0
  88. wxcli/_playbook/docs/reference/wxcadm-xsi-realtime.md +953 -0
  89. wxcli/_version.py +24 -0
  90. wxcli/auth.py +137 -0
  91. wxcli/commands/__init__.py +0 -0
  92. wxcli/commands/_registry.py +181 -0
  93. wxcli/commands/activation_email.py +103 -0
  94. wxcli/commands/admin_recordings.py +585 -0
  95. wxcli/commands/analytics.py +105 -0
  96. wxcli/commands/announcement_playlists.py +219 -0
  97. wxcli/commands/announcements.py +519 -0
  98. wxcli/commands/archive_users.py +36 -0
  99. wxcli/commands/attachment_actions.py +60 -0
  100. wxcli/commands/audit_events.py +83 -0
  101. wxcli/commands/authorizations.py +113 -0
  102. wxcli/commands/auto_attendant.py +642 -0
  103. wxcli/commands/broadworks_billing_reports.py +126 -0
  104. wxcli/commands/broadworks_enterprises.py +160 -0
  105. wxcli/commands/broadworks_subscribers.py +319 -0
  106. wxcli/commands/broadworks_workspaces.py +108 -0
  107. wxcli/commands/call_controls.py +1304 -0
  108. wxcli/commands/call_park.py +494 -0
  109. wxcli/commands/call_pickup.py +229 -0
  110. wxcli/commands/call_queue.py +1878 -0
  111. wxcli/commands/call_recording.py +707 -0
  112. wxcli/commands/call_routing.py +1610 -0
  113. wxcli/commands/call_settings_for_me_phase_5.py +212 -0
  114. wxcli/commands/caller_reputation.py +169 -0
  115. wxcli/commands/calling_service.py +305 -0
  116. wxcli/commands/cc_address_book.py +770 -0
  117. wxcli/commands/cc_agent_greetings.py +242 -0
  118. wxcli/commands/cc_agent_summaries.py +39 -0
  119. wxcli/commands/cc_agent_wellbeing.py +216 -0
  120. wxcli/commands/cc_agents.py +425 -0
  121. wxcli/commands/cc_ai_assistant.py +55 -0
  122. wxcli/commands/cc_ai_feature.py +294 -0
  123. wxcli/commands/cc_audio_files.py +149 -0
  124. wxcli/commands/cc_auto_csat.py +311 -0
  125. wxcli/commands/cc_aux_code.py +458 -0
  126. wxcli/commands/cc_business_hour.py +353 -0
  127. wxcli/commands/cc_call_monitoring.py +228 -0
  128. wxcli/commands/cc_callbacks.py +194 -0
  129. wxcli/commands/cc_campaign.py +212 -0
  130. wxcli/commands/cc_captures.py +39 -0
  131. wxcli/commands/cc_contact_list.py +169 -0
  132. wxcli/commands/cc_contact_number.py +295 -0
  133. wxcli/commands/cc_data_sources.py +235 -0
  134. wxcli/commands/cc_desktop_layout.py +380 -0
  135. wxcli/commands/cc_desktop_profile.py +322 -0
  136. wxcli/commands/cc_dial_number.py +511 -0
  137. wxcli/commands/cc_dial_plan.py +347 -0
  138. wxcli/commands/cc_dnc.py +101 -0
  139. wxcli/commands/cc_entry_point.py +545 -0
  140. wxcli/commands/cc_ewt.py +51 -0
  141. wxcli/commands/cc_flow.py +477 -0
  142. wxcli/commands/cc_global_vars.py +430 -0
  143. wxcli/commands/cc_holiday_list.py +335 -0
  144. wxcli/commands/cc_journey.py +1261 -0
  145. wxcli/commands/cc_legacy_flows.py +49 -0
  146. wxcli/commands/cc_multimedia_profile.py +436 -0
  147. wxcli/commands/cc_notification.py +51 -0
  148. wxcli/commands/cc_outdial_ani.py +604 -0
  149. wxcli/commands/cc_overrides.py +341 -0
  150. wxcli/commands/cc_queue.py +1083 -0
  151. wxcli/commands/cc_queue_stats.py +55 -0
  152. wxcli/commands/cc_realtime.py +51 -0
  153. wxcli/commands/cc_resource_collection.py +312 -0
  154. wxcli/commands/cc_search.py +46 -0
  155. wxcli/commands/cc_site.py +400 -0
  156. wxcli/commands/cc_skill.py +350 -0
  157. wxcli/commands/cc_skill_profile.py +289 -0
  158. wxcli/commands/cc_subscriptions.py +426 -0
  159. wxcli/commands/cc_summaries.py +130 -0
  160. wxcli/commands/cc_tasks.py +844 -0
  161. wxcli/commands/cc_team.py +325 -0
  162. wxcli/commands/cc_user_profiles.py +349 -0
  163. wxcli/commands/cc_users.py +701 -0
  164. wxcli/commands/cc_work_types.py +363 -0
  165. wxcli/commands/cdr.py +89 -0
  166. wxcli/commands/classifications.py +38 -0
  167. wxcli/commands/cleanup.py +1427 -0
  168. wxcli/commands/client_settings.py +72 -0
  169. wxcli/commands/conference.py +328 -0
  170. wxcli/commands/configure.py +72 -0
  171. wxcli/commands/converged_recordings.py +347 -0
  172. wxcli/commands/converged_recordings_export.py +310 -0
  173. wxcli/commands/cq_playlists.py +42 -0
  174. wxcli/commands/cucm.py +2794 -0
  175. wxcli/commands/cucm_config.py +129 -0
  176. wxcli/commands/customer_assist.py +373 -0
  177. wxcli/commands/data_sources.py +227 -0
  178. wxcli/commands/dect_devices.py +787 -0
  179. wxcli/commands/device_configurations.py +77 -0
  180. wxcli/commands/device_dynamic_settings.py +320 -0
  181. wxcli/commands/device_settings.py +1489 -0
  182. wxcli/commands/devices.py +280 -0
  183. wxcli/commands/domains.py +142 -0
  184. wxcli/commands/ecm.py +178 -0
  185. wxcli/commands/emergency_services.py +827 -0
  186. wxcli/commands/events.py +83 -0
  187. wxcli/commands/external_voicemail.py +52 -0
  188. wxcli/commands/groups.py +206 -0
  189. wxcli/commands/guest_management.py +76 -0
  190. wxcli/commands/hds.py +340 -0
  191. wxcli/commands/hot_desk.py +67 -0
  192. wxcli/commands/hot_desking_members.py +118 -0
  193. wxcli/commands/hot_desking_portal.py +124 -0
  194. wxcli/commands/hunt_group.py +577 -0
  195. wxcli/commands/hybrid_clusters.py +71 -0
  196. wxcli/commands/hybrid_connectors.py +67 -0
  197. wxcli/commands/identity_org.py +159 -0
  198. wxcli/commands/init_playbook.py +155 -0
  199. wxcli/commands/licenses.py +106 -0
  200. wxcli/commands/live_monitoring.py +40 -0
  201. wxcli/commands/location_call_handling.py +577 -0
  202. wxcli/commands/location_schedules.py +341 -0
  203. wxcli/commands/location_settings.py +1297 -0
  204. wxcli/commands/location_voicemail.py +494 -0
  205. wxcli/commands/locations.py +336 -0
  206. wxcli/commands/meeting_captions.py +110 -0
  207. wxcli/commands/meeting_chats.py +63 -0
  208. wxcli/commands/meeting_invitees.py +234 -0
  209. wxcli/commands/meeting_messages.py +28 -0
  210. wxcli/commands/meeting_participants.py +278 -0
  211. wxcli/commands/meeting_polls.py +111 -0
  212. wxcli/commands/meeting_preferences.py +515 -0
  213. wxcli/commands/meeting_qa.py +78 -0
  214. wxcli/commands/meeting_qualities.py +43 -0
  215. wxcli/commands/meeting_reports.py +101 -0
  216. wxcli/commands/meeting_session_types.py +105 -0
  217. wxcli/commands/meeting_site.py +57 -0
  218. wxcli/commands/meeting_slido.py +44 -0
  219. wxcli/commands/meeting_summaries.py +92 -0
  220. wxcli/commands/meeting_tracking_codes.py +233 -0
  221. wxcli/commands/meeting_transcripts.py +230 -0
  222. wxcli/commands/meetings.py +1997 -0
  223. wxcli/commands/memberships.py +164 -0
  224. wxcli/commands/messages.py +213 -0
  225. wxcli/commands/mode_management.py +244 -0
  226. wxcli/commands/my_call_settings.py +3577 -0
  227. wxcli/commands/numbers.py +405 -0
  228. wxcli/commands/operating_modes.py +410 -0
  229. wxcli/commands/org_contacts.py +284 -0
  230. wxcli/commands/org_health_cli.py +55 -0
  231. wxcli/commands/org_settings.py +71 -0
  232. wxcli/commands/organizations.py +83 -0
  233. wxcli/commands/paging_group.py +257 -0
  234. wxcli/commands/partner_admins.py +141 -0
  235. wxcli/commands/partner_reports.py +188 -0
  236. wxcli/commands/partner_tags.py +216 -0
  237. wxcli/commands/people.py +279 -0
  238. wxcli/commands/person_call_settings.py +71 -0
  239. wxcli/commands/pstn.py +280 -0
  240. wxcli/commands/recording_report.py +154 -0
  241. wxcli/commands/report_templates.py +38 -0
  242. wxcli/commands/reports.py +144 -0
  243. wxcli/commands/resource_group_memberships.py +160 -0
  244. wxcli/commands/resource_groups.py +67 -0
  245. wxcli/commands/roles.py +63 -0
  246. wxcli/commands/room_tabs.py +160 -0
  247. wxcli/commands/rooms.py +225 -0
  248. wxcli/commands/scim_bulk.py +46 -0
  249. wxcli/commands/scim_groups.py +246 -0
  250. wxcli/commands/scim_schemas.py +82 -0
  251. wxcli/commands/scim_users.py +283 -0
  252. wxcli/commands/security_audit.py +54 -0
  253. wxcli/commands/service_apps.py +51 -0
  254. wxcli/commands/single_number_reach.py +209 -0
  255. wxcli/commands/team_memberships.py +155 -0
  256. wxcli/commands/teams.py +153 -0
  257. wxcli/commands/ucm_profile.py +42 -0
  258. wxcli/commands/update.py +219 -0
  259. wxcli/commands/user_settings.py +5116 -0
  260. wxcli/commands/video_mesh.py +1090 -0
  261. wxcli/commands/virtual_extensions.py +502 -0
  262. wxcli/commands/virtual_line_settings.py +2072 -0
  263. wxcli/commands/webhooks.py +176 -0
  264. wxcli/commands/wholesale_billing_reports.py +147 -0
  265. wxcli/commands/wholesale_provisioning.py +523 -0
  266. wxcli/commands/workspace_locations.py +339 -0
  267. wxcli/commands/workspace_metrics.py +103 -0
  268. wxcli/commands/workspace_personalization.py +70 -0
  269. wxcli/commands/workspace_settings.py +3347 -0
  270. wxcli/commands/workspaces.py +279 -0
  271. wxcli/commands/xapi.py +114 -0
  272. wxcli/config.py +139 -0
  273. wxcli/errors.py +77 -0
  274. wxcli/main.py +210 -0
  275. wxcli/migration/CLAUDE.md +106 -0
  276. wxcli/migration/__init__.py +1 -0
  277. wxcli/migration/advisory/CLAUDE.md +196 -0
  278. wxcli/migration/advisory/__init__.py +46 -0
  279. wxcli/migration/advisory/advisor.py +107 -0
  280. wxcli/migration/advisory/advisory_patterns.py +2552 -0
  281. wxcli/migration/advisory/recommendation_rules.py +835 -0
  282. wxcli/migration/cucm/CLAUDE.md +74 -0
  283. wxcli/migration/cucm/__init__.py +5 -0
  284. wxcli/migration/cucm/connection.py +265 -0
  285. wxcli/migration/cucm/discovery.py +225 -0
  286. wxcli/migration/cucm/extractors/__init__.py +1 -0
  287. wxcli/migration/cucm/extractors/announcements.py +92 -0
  288. wxcli/migration/cucm/extractors/base.py +90 -0
  289. wxcli/migration/cucm/extractors/device_profiles.py +98 -0
  290. wxcli/migration/cucm/extractors/devices.py +193 -0
  291. wxcli/migration/cucm/extractors/e911.py +103 -0
  292. wxcli/migration/cucm/extractors/features.py +309 -0
  293. wxcli/migration/cucm/extractors/helpers.py +73 -0
  294. wxcli/migration/cucm/extractors/informational.py +295 -0
  295. wxcli/migration/cucm/extractors/locations.py +221 -0
  296. wxcli/migration/cucm/extractors/moh.py +100 -0
  297. wxcli/migration/cucm/extractors/remote_destinations.py +96 -0
  298. wxcli/migration/cucm/extractors/routing.py +493 -0
  299. wxcli/migration/cucm/extractors/shared_lines.py +146 -0
  300. wxcli/migration/cucm/extractors/templates.py +229 -0
  301. wxcli/migration/cucm/extractors/tier4.py +173 -0
  302. wxcli/migration/cucm/extractors/users.py +240 -0
  303. wxcli/migration/cucm/extractors/voicemail.py +243 -0
  304. wxcli/migration/cucm/extractors/workspaces.py +88 -0
  305. wxcli/migration/cucm/unity_connection.py +304 -0
  306. wxcli/migration/execute/CLAUDE.md +372 -0
  307. wxcli/migration/execute/__init__.py +303 -0
  308. wxcli/migration/execute/batch.py +277 -0
  309. wxcli/migration/execute/dependency.py +483 -0
  310. wxcli/migration/execute/engine.py +964 -0
  311. wxcli/migration/execute/handlers.py +2232 -0
  312. wxcli/migration/execute/planner.py +1939 -0
  313. wxcli/migration/execute/runtime.py +571 -0
  314. wxcli/migration/export/CLAUDE.md +49 -0
  315. wxcli/migration/export/__init__.py +8 -0
  316. wxcli/migration/export/csv_export.py +126 -0
  317. wxcli/migration/export/deployment_plan.py +479 -0
  318. wxcli/migration/export/json_export.py +60 -0
  319. wxcli/migration/models.py +941 -0
  320. wxcli/migration/phone_models.py +50 -0
  321. wxcli/migration/preflight/CLAUDE.md +52 -0
  322. wxcli/migration/preflight/__init__.py +89 -0
  323. wxcli/migration/preflight/checks.py +911 -0
  324. wxcli/migration/preflight/runner.py +293 -0
  325. wxcli/migration/rate_limiter.py +144 -0
  326. wxcli/migration/report/CLAUDE.md +245 -0
  327. wxcli/migration/report/__init__.py +7 -0
  328. wxcli/migration/report/appendix.py +2437 -0
  329. wxcli/migration/report/assembler.py +183 -0
  330. wxcli/migration/report/charts.py +263 -0
  331. wxcli/migration/report/executive.py +776 -0
  332. wxcli/migration/report/explainer.py +704 -0
  333. wxcli/migration/report/helpers.py +74 -0
  334. wxcli/migration/report/ingest.py +152 -0
  335. wxcli/migration/report/notice_templates.py +192 -0
  336. wxcli/migration/report/score.py +375 -0
  337. wxcli/migration/report/styles.py +1052 -0
  338. wxcli/migration/report/user_diff.py +1052 -0
  339. wxcli/migration/report/user_notice.py +425 -0
  340. wxcli/migration/state.py +139 -0
  341. wxcli/migration/store.py +860 -0
  342. wxcli/migration/transform/CLAUDE.md +107 -0
  343. wxcli/migration/transform/__init__.py +12 -0
  344. wxcli/migration/transform/analysis_pipeline.py +453 -0
  345. wxcli/migration/transform/analyzers/__init__.py +142 -0
  346. wxcli/migration/transform/analyzers/css_permission.py +189 -0
  347. wxcli/migration/transform/analyzers/css_routing.py +335 -0
  348. wxcli/migration/transform/analyzers/device_compatibility.py +122 -0
  349. wxcli/migration/transform/analyzers/dn_ambiguity.py +131 -0
  350. wxcli/migration/transform/analyzers/duplicate_user.py +221 -0
  351. wxcli/migration/transform/analyzers/extension_conflict.py +173 -0
  352. wxcli/migration/transform/analyzers/feature_approximation.py +227 -0
  353. wxcli/migration/transform/analyzers/layout_overflow.py +174 -0
  354. wxcli/migration/transform/analyzers/location_ambiguity.py +184 -0
  355. wxcli/migration/transform/analyzers/missing_data.py +300 -0
  356. wxcli/migration/transform/analyzers/selective_call_handling.py +394 -0
  357. wxcli/migration/transform/analyzers/shared_line.py +170 -0
  358. wxcli/migration/transform/analyzers/voicemail_compatibility.py +267 -0
  359. wxcli/migration/transform/analyzers/workspace_license.py +212 -0
  360. wxcli/migration/transform/cross_reference.py +1136 -0
  361. wxcli/migration/transform/cucm_pattern.py +246 -0
  362. wxcli/migration/transform/decisions.py +301 -0
  363. wxcli/migration/transform/e164.py +145 -0
  364. wxcli/migration/transform/engine.py +256 -0
  365. wxcli/migration/transform/mappers/CLAUDE.md +123 -0
  366. wxcli/migration/transform/mappers/__init__.py +76 -0
  367. wxcli/migration/transform/mappers/announcement_mapper.py +122 -0
  368. wxcli/migration/transform/mappers/base.py +190 -0
  369. wxcli/migration/transform/mappers/button_template_mapper.py +186 -0
  370. wxcli/migration/transform/mappers/call_forwarding_mapper.py +228 -0
  371. wxcli/migration/transform/mappers/call_settings_mapper.py +144 -0
  372. wxcli/migration/transform/mappers/css_mapper.py +868 -0
  373. wxcli/migration/transform/mappers/dect_mapper.py +367 -0
  374. wxcli/migration/transform/mappers/device_layout_mapper.py +289 -0
  375. wxcli/migration/transform/mappers/device_mapper.py +227 -0
  376. wxcli/migration/transform/mappers/device_profile_mapper.py +190 -0
  377. wxcli/migration/transform/mappers/device_settings_mapper.py +464 -0
  378. wxcli/migration/transform/mappers/e911_mapper.py +129 -0
  379. wxcli/migration/transform/mappers/ecbn_mapper.py +263 -0
  380. wxcli/migration/transform/mappers/executive_assistant_mapper.py +156 -0
  381. wxcli/migration/transform/mappers/feature_mapper.py +1179 -0
  382. wxcli/migration/transform/mappers/line_mapper.py +310 -0
  383. wxcli/migration/transform/mappers/location_mapper.py +235 -0
  384. wxcli/migration/transform/mappers/moh_mapper.py +114 -0
  385. wxcli/migration/transform/mappers/monitoring_mapper.py +221 -0
  386. wxcli/migration/transform/mappers/receptionist_mapper.py +245 -0
  387. wxcli/migration/transform/mappers/routing_mapper.py +821 -0
  388. wxcli/migration/transform/mappers/snr_mapper.py +201 -0
  389. wxcli/migration/transform/mappers/softkey_mapper.py +205 -0
  390. wxcli/migration/transform/mappers/user_mapper.py +264 -0
  391. wxcli/migration/transform/mappers/voicemail_group_mapper.py +286 -0
  392. wxcli/migration/transform/mappers/voicemail_mapper.py +514 -0
  393. wxcli/migration/transform/mappers/workspace_mapper.py +464 -0
  394. wxcli/migration/transform/normalizers.py +2008 -0
  395. wxcli/migration/transform/pattern_converter.py +106 -0
  396. wxcli/migration/transform/pipeline.py +271 -0
  397. wxcli/migration/transform/rules.py +255 -0
  398. wxcli/org_health/CLAUDE.md +63 -0
  399. wxcli/org_health/__init__.py +7 -0
  400. wxcli/org_health/analyze.py +93 -0
  401. wxcli/org_health/checks.py +458 -0
  402. wxcli/org_health/collector.py +62 -0
  403. wxcli/org_health/models.py +78 -0
  404. wxcli/org_health/report.py +300 -0
  405. wxcli/output.py +101 -0
  406. wxcli-1.2.0.dist-info/METADATA +505 -0
  407. wxcli-1.2.0.dist-info/RECORD +413 -0
  408. wxcli-1.2.0.dist-info/WHEEL +5 -0
  409. wxcli-1.2.0.dist-info/entry_points.txt +2 -0
  410. wxcli-1.2.0.dist-info/licenses/LICENSE +191 -0
  411. wxcli-1.2.0.dist-info/scm_file_list.json +751 -0
  412. wxcli-1.2.0.dist-info/scm_version.json +8 -0
  413. wxcli-1.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,164 @@
1
+ import json
2
+ import typer
3
+ from wxcli.auth import get_api
4
+ from wxcli.errors import WebexError, handle_rest_error
5
+ from wxcli.output import print_table, print_json
6
+
7
+
8
+ app = typer.Typer(help="Manage Webex Calling memberships.")
9
+
10
+
11
+ @app.command("list")
12
+ def cmd_list(
13
+ room_id: str = typer.Option(None, "--room-id", help="List memberships associated with a room, by ID."),
14
+ person_id: str = typer.Option(None, "--person-id", help="List memberships associated with a person, by ID. The `roomI"),
15
+ person_email: str = typer.Option(None, "--person-email", help="List memberships associated with a person, by email address."),
16
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
17
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
18
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
19
+ debug: bool = typer.Option(False, "--debug"),
20
+ ):
21
+ """List Memberships."""
22
+ api = get_api(debug=debug)
23
+ url = f"https://webexapis.com/v1/memberships"
24
+ params = {}
25
+ if room_id is not None:
26
+ params["roomId"] = room_id
27
+ if person_id is not None:
28
+ params["personId"] = person_id
29
+ if person_email is not None:
30
+ params["personEmail"] = person_email
31
+ if limit > 0:
32
+ params["max"] = limit
33
+ if offset > 0:
34
+ params["start"] = offset
35
+ try:
36
+ if limit > 0:
37
+ result = api.session.rest_get(url, params=params)
38
+ result = result or {}
39
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
40
+ else:
41
+ items = list(api.session.follow_pagination(url=url, params=params, item_key="items"))
42
+ except WebexError as e:
43
+ handle_rest_error(e)
44
+ if output == "json":
45
+ print_json(items)
46
+ else:
47
+ print_table(items, columns=[('ID', 'id'), ('Person', 'personDisplayName'), ('Email', 'personEmail'), ('Moderator', 'isModerator')], limit=limit)
48
+
49
+
50
+
51
+ @app.command("create")
52
+ def create(
53
+ room_id: str = typer.Option(None, "--room-id", help="(required) The room ID."),
54
+ person_id: str = typer.Option(None, "--person-id", help="The person ID."),
55
+ person_email: str = typer.Option(None, "--person-email", help="The email address of the person."),
56
+ is_moderator: bool = typer.Option(None, "--is-moderator/--no-is-moderator", help="Whether or not the participant is a room moderator."),
57
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
58
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
59
+ debug: bool = typer.Option(False, "--debug"),
60
+ ):
61
+ """Create a Membership."""
62
+ api = get_api(debug=debug)
63
+ url = f"https://webexapis.com/v1/memberships"
64
+ if json_body:
65
+ body = json.loads(json_body)
66
+ else:
67
+ body = {}
68
+ if room_id is not None:
69
+ body["roomId"] = room_id
70
+ if person_id is not None:
71
+ body["personId"] = person_id
72
+ if person_email is not None:
73
+ body["personEmail"] = person_email
74
+ if is_moderator is not None:
75
+ body["isModerator"] = is_moderator
76
+ _missing = [f for f in ['roomId'] if f not in body or body[f] is None]
77
+ if _missing:
78
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
79
+ raise typer.Exit(1)
80
+ try:
81
+ result = api.session.rest_post(url, json=body)
82
+ except WebexError as e:
83
+ handle_rest_error(e)
84
+ if output == "json":
85
+ print_json(result)
86
+ elif isinstance(result, dict) and "id" in result:
87
+ typer.echo(f"Created: {result['id']}")
88
+ elif not result or result == {}:
89
+ typer.echo("Created.")
90
+ else:
91
+ print_json(result)
92
+
93
+
94
+
95
+ @app.command("show")
96
+ def show(
97
+ membership_id: str = typer.Argument(help="membershipId"),
98
+ output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
99
+ debug: bool = typer.Option(False, "--debug"),
100
+ ):
101
+ """Get Membership Details."""
102
+ api = get_api(debug=debug)
103
+ url = f"https://webexapis.com/v1/memberships/{membership_id}"
104
+ try:
105
+ result = api.session.rest_get(url)
106
+ except WebexError as e:
107
+ handle_rest_error(e)
108
+ if output == "json":
109
+ print_json(result)
110
+ else:
111
+ if isinstance(result, dict):
112
+ print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
113
+ elif isinstance(result, list):
114
+ print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
115
+ else:
116
+ print_json(result)
117
+
118
+
119
+
120
+ @app.command("update")
121
+ def update(
122
+ membership_id: str = typer.Argument(help="membershipId"),
123
+ is_moderator: bool = typer.Option(None, "--is-moderator/--no-is-moderator", help="Whether or not the participant is a room moderator."),
124
+ is_room_hidden: bool = typer.Option(None, "--is-room-hidden/--no-is-room-hidden", help="When set to true, hides direct spaces in the teams client. A"),
125
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
126
+ debug: bool = typer.Option(False, "--debug"),
127
+ ):
128
+ """Update a Membership."""
129
+ api = get_api(debug=debug)
130
+ url = f"https://webexapis.com/v1/memberships/{membership_id}"
131
+ if json_body:
132
+ body = json.loads(json_body)
133
+ else:
134
+ body = {}
135
+ if is_moderator is not None:
136
+ body["isModerator"] = is_moderator
137
+ if is_room_hidden is not None:
138
+ body["isRoomHidden"] = is_room_hidden
139
+ try:
140
+ result = api.session.rest_put(url, json=body)
141
+ except WebexError as e:
142
+ handle_rest_error(e)
143
+ typer.echo(f"Updated.")
144
+
145
+
146
+
147
+ @app.command("delete")
148
+ def delete(
149
+ membership_id: str = typer.Argument(help="membershipId"),
150
+ force: bool = typer.Option(False, "--force", help="Skip confirmation"),
151
+ debug: bool = typer.Option(False, "--debug"),
152
+ ):
153
+ """Delete a Membership."""
154
+ if not force:
155
+ typer.confirm(f"Delete {membership_id}?", abort=True)
156
+ api = get_api(debug=debug)
157
+ url = f"https://webexapis.com/v1/memberships/{membership_id}"
158
+ try:
159
+ api.session.rest_delete(url)
160
+ except WebexError as e:
161
+ handle_rest_error(e)
162
+ typer.echo(f"Deleted: {membership_id}")
163
+
164
+
@@ -0,0 +1,213 @@
1
+ import json
2
+ import typer
3
+ from wxcli.auth import get_api
4
+ from wxcli.errors import WebexError, handle_rest_error
5
+ from wxcli.output import print_table, print_json
6
+
7
+
8
+ app = typer.Typer(help="Manage Webex Calling messages.")
9
+
10
+
11
+ @app.command("list")
12
+ def cmd_list(
13
+ room_id: str = typer.Option(..., "--room-id", help="List messages in a room, by ID."),
14
+ parent_id: str = typer.Option(None, "--parent-id", help="List messages with a parent, by ID."),
15
+ mentioned_people: str = typer.Option(None, "--mentioned-people", help="List messages with these people mentioned, by ID. Use `me` a"),
16
+ before: str = typer.Option(None, "--before", help="List messages sent before a date and time."),
17
+ before_message: str = typer.Option(None, "--before-message", help="List messages sent before a message, by ID."),
18
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
19
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
20
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
21
+ debug: bool = typer.Option(False, "--debug"),
22
+ ):
23
+ """List Messages."""
24
+ api = get_api(debug=debug)
25
+ url = f"https://webexapis.com/v1/messages"
26
+ params = {}
27
+ if room_id is not None:
28
+ params["roomId"] = room_id
29
+ if parent_id is not None:
30
+ params["parentId"] = parent_id
31
+ if mentioned_people is not None:
32
+ params["mentionedPeople"] = mentioned_people
33
+ if before is not None:
34
+ params["before"] = before
35
+ if before_message is not None:
36
+ params["beforeMessage"] = before_message
37
+ if limit > 0:
38
+ params["max"] = limit
39
+ if offset > 0:
40
+ params["start"] = offset
41
+ try:
42
+ if limit > 0:
43
+ result = api.session.rest_get(url, params=params)
44
+ result = result or {}
45
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
46
+ else:
47
+ items = list(api.session.follow_pagination(url=url, params=params, item_key="items"))
48
+ except WebexError as e:
49
+ handle_rest_error(e)
50
+ if output == "json":
51
+ print_json(items)
52
+ else:
53
+ print_table(items, columns=[('ID', 'id'), ('Person Email', 'personEmail'), ('Text', 'text')], limit=limit)
54
+
55
+
56
+
57
+ @app.command("create")
58
+ def create(
59
+ room_id: str = typer.Option(None, "--room-id", help="The room ID of the message."),
60
+ parent_id: str = typer.Option(None, "--parent-id", help="The parent message to reply to."),
61
+ to_person_id: str = typer.Option(None, "--to-person-id", help="The person ID of the recipient when sending a private 1:1 me"),
62
+ to_person_email: str = typer.Option(None, "--to-person-email", help="The email address of the recipient when sending a private 1:"),
63
+ text: str = typer.Option(None, "--text", help="The message, in plain text. If `markdown` is specified this"),
64
+ markdown: str = typer.Option(None, "--markdown", help="The message, in Markdown format. The maximum message length"),
65
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
66
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
67
+ debug: bool = typer.Option(False, "--debug"),
68
+ ):
69
+ """Create a Message\n\nExample --json-body:\n '{"roomId":"...","parentId":"...","toPersonId":"...","toPersonEmail":"...","text":"...","markdown":"...","files":["..."],"attachments":[{"content":"..."}]}'."""
70
+ api = get_api(debug=debug)
71
+ url = f"https://webexapis.com/v1/messages"
72
+ if json_body:
73
+ body = json.loads(json_body)
74
+ else:
75
+ body = {}
76
+ if room_id is not None:
77
+ body["roomId"] = room_id
78
+ if parent_id is not None:
79
+ body["parentId"] = parent_id
80
+ if to_person_id is not None:
81
+ body["toPersonId"] = to_person_id
82
+ if to_person_email is not None:
83
+ body["toPersonEmail"] = to_person_email
84
+ if text is not None:
85
+ body["text"] = text
86
+ if markdown is not None:
87
+ body["markdown"] = markdown
88
+ try:
89
+ result = api.session.rest_post(url, json=body)
90
+ except WebexError as e:
91
+ handle_rest_error(e)
92
+ if output == "json":
93
+ print_json(result)
94
+ elif isinstance(result, dict) and "id" in result:
95
+ typer.echo(f"Created: {result['id']}")
96
+ elif not result or result == {}:
97
+ typer.echo("Created.")
98
+ else:
99
+ print_json(result)
100
+
101
+
102
+
103
+ @app.command("list-direct")
104
+ def list_direct(
105
+ parent_id: str = typer.Option(None, "--parent-id", help="List messages with a parent, by ID."),
106
+ person_id: str = typer.Option(None, "--person-id", help="List messages in a 1:1 room, by person ID."),
107
+ person_email: str = typer.Option(None, "--person-email", help="List messages in a 1:1 room, by person email."),
108
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
109
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
110
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
111
+ debug: bool = typer.Option(False, "--debug"),
112
+ ):
113
+ """List Direct Messages."""
114
+ api = get_api(debug=debug)
115
+ url = f"https://webexapis.com/v1/messages/direct"
116
+ params = {}
117
+ if parent_id is not None:
118
+ params["parentId"] = parent_id
119
+ if person_id is not None:
120
+ params["personId"] = person_id
121
+ if person_email is not None:
122
+ params["personEmail"] = person_email
123
+ if limit > 0:
124
+ params["max"] = limit
125
+ if offset > 0:
126
+ params["start"] = offset
127
+ result = None
128
+ try:
129
+ result = api.session.rest_get(url, params=params)
130
+ except WebexError as e:
131
+ handle_rest_error(e)
132
+ result = result or []
133
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
134
+ if output == "json":
135
+ print_json(items)
136
+ else:
137
+ print_table(items, columns=[('ID', 'id'), ('Person Email', 'personEmail'), ('Text', 'text')], limit=limit)
138
+
139
+
140
+
141
+ @app.command("show")
142
+ def show(
143
+ message_id: str = typer.Argument(help="messageId"),
144
+ output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
145
+ debug: bool = typer.Option(False, "--debug"),
146
+ ):
147
+ """Get Message Details."""
148
+ api = get_api(debug=debug)
149
+ url = f"https://webexapis.com/v1/messages/{message_id}"
150
+ try:
151
+ result = api.session.rest_get(url)
152
+ except WebexError as e:
153
+ handle_rest_error(e)
154
+ if output == "json":
155
+ print_json(result)
156
+ else:
157
+ if isinstance(result, dict):
158
+ print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
159
+ elif isinstance(result, list):
160
+ print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
161
+ else:
162
+ print_json(result)
163
+
164
+
165
+
166
+ @app.command("update")
167
+ def update(
168
+ message_id: str = typer.Argument(help="messageId"),
169
+ room_id: str = typer.Option(None, "--room-id", help="The room ID of the message."),
170
+ text: str = typer.Option(None, "--text", help="The message, in plain text. If `markdown` is specified this"),
171
+ markdown: str = typer.Option(None, "--markdown", help="The message, in Markdown format. If this attribute is set en"),
172
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
173
+ debug: bool = typer.Option(False, "--debug"),
174
+ ):
175
+ """Edit a Message."""
176
+ api = get_api(debug=debug)
177
+ url = f"https://webexapis.com/v1/messages/{message_id}"
178
+ if json_body:
179
+ body = json.loads(json_body)
180
+ else:
181
+ body = {}
182
+ if room_id is not None:
183
+ body["roomId"] = room_id
184
+ if text is not None:
185
+ body["text"] = text
186
+ if markdown is not None:
187
+ body["markdown"] = markdown
188
+ try:
189
+ result = api.session.rest_put(url, json=body)
190
+ except WebexError as e:
191
+ handle_rest_error(e)
192
+ typer.echo(f"Updated.")
193
+
194
+
195
+
196
+ @app.command("delete")
197
+ def delete(
198
+ message_id: str = typer.Argument(help="messageId"),
199
+ force: bool = typer.Option(False, "--force", help="Skip confirmation"),
200
+ debug: bool = typer.Option(False, "--debug"),
201
+ ):
202
+ """Delete a Message."""
203
+ if not force:
204
+ typer.confirm(f"Delete {message_id}?", abort=True)
205
+ api = get_api(debug=debug)
206
+ url = f"https://webexapis.com/v1/messages/{message_id}"
207
+ try:
208
+ api.session.rest_delete(url)
209
+ except WebexError as e:
210
+ handle_rest_error(e)
211
+ typer.echo(f"Deleted: {message_id}")
212
+
213
+
@@ -0,0 +1,244 @@
1
+ import json
2
+ import typer
3
+ from wxcli.auth import get_api
4
+ from wxcli.errors import WebexError, handle_rest_error
5
+ from wxcli.output import print_table, print_json
6
+
7
+
8
+ app = typer.Typer(help="Manage Webex Calling mode-management.")
9
+
10
+
11
+ @app.command("list")
12
+ def cmd_list(
13
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
14
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
15
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
16
+ debug: bool = typer.Option(False, "--debug"),
17
+ ):
18
+ """Get Mode Management Features."""
19
+ api = get_api(debug=debug)
20
+ url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features"
21
+ params = {}
22
+ if limit > 0:
23
+ params["max"] = limit
24
+ if offset > 0:
25
+ params["start"] = offset
26
+ result = None
27
+ try:
28
+ result = api.session.rest_get(url, params=params)
29
+ except WebexError as e:
30
+ handle_rest_error(e)
31
+ result = result or []
32
+ items = result.get("features", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
33
+ if output == "json":
34
+ print_json(items)
35
+ else:
36
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
37
+
38
+
39
+
40
+ @app.command("list-common-modes")
41
+ def list_common_modes(
42
+ feature_ids: str = typer.Option(..., "--feature-ids", help="List of feature IDs (comma-separated) for auto attendants, c"),
43
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
44
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
45
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
46
+ debug: bool = typer.Option(False, "--debug"),
47
+ ):
48
+ """Get Common Modes."""
49
+ api = get_api(debug=debug)
50
+ url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/commonModes"
51
+ params = {}
52
+ if feature_ids is not None:
53
+ params["featureIds"] = feature_ids
54
+ if limit > 0:
55
+ params["max"] = limit
56
+ if offset > 0:
57
+ params["start"] = offset
58
+ result = None
59
+ try:
60
+ result = api.session.rest_get(url, params=params)
61
+ except WebexError as e:
62
+ handle_rest_error(e)
63
+ result = result or []
64
+ items = result.get("commonModeNames", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
65
+ if output == "json":
66
+ print_json(items)
67
+ else:
68
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
69
+
70
+
71
+
72
+ @app.command("switch-mode-for-invoke")
73
+ def switch_mode_for_invoke(
74
+ operating_mode_name: str = typer.Option(None, "--operating-mode-name", help="Name of the common operating mode to be set as current opera"),
75
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body"),
76
+ debug: bool = typer.Option(False, "--debug"),
77
+ ):
78
+ """Switch Mode for Multiple Features\n\nExample --json-body:\n '{"featureIds":["..."],"operatingModeName":"..."}'."""
79
+ api = get_api(debug=debug)
80
+ url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/actions/switchMode/invoke"
81
+ if json_body:
82
+ body = json.loads(json_body)
83
+ else:
84
+ body = {}
85
+ if operating_mode_name is not None:
86
+ body["operatingModeName"] = operating_mode_name
87
+ try:
88
+ result = api.session.rest_post(url, json=body)
89
+ except WebexError as e:
90
+ handle_rest_error(e)
91
+ print_json(result)
92
+
93
+
94
+
95
+ @app.command("show")
96
+ def show(
97
+ feature_id: str = typer.Argument(help="featureId"),
98
+ output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
99
+ debug: bool = typer.Option(False, "--debug"),
100
+ ):
101
+ """Get Mode Management Feature."""
102
+ api = get_api(debug=debug)
103
+ url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/{feature_id}"
104
+ try:
105
+ result = api.session.rest_get(url)
106
+ except WebexError as e:
107
+ handle_rest_error(e)
108
+ if output == "json":
109
+ print_json(result)
110
+ else:
111
+ if isinstance(result, dict):
112
+ print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
113
+ elif isinstance(result, list):
114
+ print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
115
+ else:
116
+ print_json(result)
117
+
118
+
119
+
120
+ @app.command("show-normal-operation-mode")
121
+ def show_normal_operation_mode(
122
+ feature_id: str = typer.Argument(help="featureId"),
123
+ output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
124
+ debug: bool = typer.Option(False, "--debug"),
125
+ ):
126
+ """Get Normal Operation Mode."""
127
+ api = get_api(debug=debug)
128
+ url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/{feature_id}/normalOperationMode"
129
+ try:
130
+ result = api.session.rest_get(url)
131
+ except WebexError as e:
132
+ handle_rest_error(e)
133
+ if output == "json":
134
+ print_json(result)
135
+ else:
136
+ if isinstance(result, dict):
137
+ print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
138
+ elif isinstance(result, list):
139
+ print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
140
+ else:
141
+ print_json(result)
142
+
143
+
144
+
145
+ @app.command("show-modes")
146
+ def show_modes(
147
+ feature_id: str = typer.Argument(help="featureId"),
148
+ mode_id: str = typer.Argument(help="modeId"),
149
+ output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
150
+ debug: bool = typer.Option(False, "--debug"),
151
+ ):
152
+ """Get Operating Mode."""
153
+ api = get_api(debug=debug)
154
+ url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/{feature_id}/modes/{mode_id}"
155
+ try:
156
+ result = api.session.rest_get(url)
157
+ except WebexError as e:
158
+ handle_rest_error(e)
159
+ if output == "json":
160
+ print_json(result)
161
+ else:
162
+ if isinstance(result, dict):
163
+ print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
164
+ elif isinstance(result, list):
165
+ print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
166
+ else:
167
+ print_json(result)
168
+
169
+
170
+
171
+ @app.command("switch-to-normal")
172
+ def switch_to_normal(
173
+ feature_id: str = typer.Argument(help="featureId"),
174
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body"),
175
+ debug: bool = typer.Option(False, "--debug"),
176
+ ):
177
+ """Switch to Normal Operation."""
178
+ api = get_api(debug=debug)
179
+ url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/{feature_id}/actions/switchToNormalOperation/invoke"
180
+ if json_body:
181
+ body = json.loads(json_body)
182
+ else:
183
+ body = {}
184
+ try:
185
+ result = api.session.rest_post(url, json=body)
186
+ except WebexError as e:
187
+ handle_rest_error(e)
188
+ print_json(result)
189
+
190
+
191
+
192
+ @app.command("switch-mode-for-invoke-1")
193
+ def switch_mode_for_invoke_1(
194
+ feature_id: str = typer.Argument(help="featureId"),
195
+ operating_mode_id: str = typer.Option(None, "--operating-mode-id", help="Operating mode ID to switch to"),
196
+ is_manual_switchback_enabled: str = typer.Option(None, "--is-manual-switchback-enabled", help="Determines if switch back will be manual (if true) or automa"),
197
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body"),
198
+ debug: bool = typer.Option(False, "--debug"),
199
+ ):
200
+ """Switch Mode for Single Feature."""
201
+ api = get_api(debug=debug)
202
+ url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/{feature_id}/actions/switchMode/invoke"
203
+ if json_body:
204
+ body = json.loads(json_body)
205
+ else:
206
+ body = {}
207
+ if operating_mode_id is not None:
208
+ body["operatingModeId"] = operating_mode_id
209
+ if is_manual_switchback_enabled is not None:
210
+ body["isManualSwitchbackEnabled"] = is_manual_switchback_enabled
211
+ try:
212
+ result = api.session.rest_post(url, json=body)
213
+ except WebexError as e:
214
+ handle_rest_error(e)
215
+ print_json(result)
216
+
217
+
218
+
219
+ @app.command("extend-current-operating")
220
+ def extend_current_operating(
221
+ feature_id: str = typer.Argument(help="featureId"),
222
+ operating_mode_id: str = typer.Option(None, "--operating-mode-id", help="Unique identifier for the operating mode for which the exten"),
223
+ extension_time: str = typer.Option(None, "--extension-time", help="Extension time in minutes (must be multiple of 30). If not s"),
224
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body"),
225
+ debug: bool = typer.Option(False, "--debug"),
226
+ ):
227
+ """Extend Current Operating Mode Duration."""
228
+ api = get_api(debug=debug)
229
+ url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/{feature_id}/actions/extendMode/invoke"
230
+ if json_body:
231
+ body = json.loads(json_body)
232
+ else:
233
+ body = {}
234
+ if operating_mode_id is not None:
235
+ body["operatingModeId"] = operating_mode_id
236
+ if extension_time is not None:
237
+ body["extensionTime"] = extension_time
238
+ try:
239
+ result = api.session.rest_post(url, json=body)
240
+ except WebexError as e:
241
+ handle_rest_error(e)
242
+ print_json(result)
243
+
244
+