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,604 @@
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
+ from wxcli.config import resolve_org_id, get_cc_base_url, get_cc_org_id
7
+
8
+
9
+ app = typer.Typer(help="Manage Webex Contact Center cc-outdial-ani.")
10
+
11
+
12
+ @app.command("list")
13
+ def cmd_list(
14
+ filter_param: str = typer.Option(None, "--filter", help="Specify a filter based on which the results will be fetched."),
15
+ attributes: str = typer.Option(None, "--attributes", help="Specify the attributes to be returned. By default, all attri"),
16
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
17
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
18
+ single_object_response: str = typer.Option(None, "--single-object-response", help="Specify whether to include array fields in the response. Thi"),
19
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
20
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
21
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
22
+ debug: bool = typer.Option(False, "--debug"),
23
+ ):
24
+ """List Outdial ANIs."""
25
+ api = get_api(debug=debug)
26
+ cc_base_url = get_cc_base_url()
27
+ orgid = get_cc_org_id(api.session)
28
+ url = f"{cc_base_url}/organization/{orgid}/outdial-ani"
29
+ params = {}
30
+ if filter_param is not None:
31
+ params["filter"] = filter_param
32
+ if attributes is not None:
33
+ params["attributes"] = attributes
34
+ if page is not None:
35
+ params["page"] = page
36
+ if page_size is not None:
37
+ params["pageSize"] = page_size
38
+ if single_object_response is not None:
39
+ params["singleObjectResponse"] = single_object_response
40
+ if limit > 0:
41
+ params["max"] = limit
42
+ if offset > 0:
43
+ params["start"] = offset
44
+ result = None
45
+ try:
46
+ result = api.session.rest_get(url, params=params)
47
+ except WebexError as e:
48
+ handle_rest_error(e)
49
+ result = result or []
50
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
51
+ if output == "json":
52
+ print_json(items)
53
+ else:
54
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
55
+
56
+
57
+
58
+ @app.command("create")
59
+ def create(
60
+ organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. This field is require"),
61
+ id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
62
+ version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
63
+ name: str = typer.Option(None, "--name", help="(required) Enter a name for the outdial ANI."),
64
+ description: str = typer.Option(None, "--description", help="(Optional) Enter a description for the outdial ANI."),
65
+ created_time: str = typer.Option(None, "--created-time", help="This is the created time of the entity."),
66
+ last_updated_time: str = typer.Option(None, "--last-updated-time", help="This is the updated time of the entity."),
67
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
68
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
69
+ debug: bool = typer.Option(False, "--debug"),
70
+ ):
71
+ """Create a new Outdial ANI\n\nExample --json-body:\n '{"name":"...","organizationId":"...","id":"...","version":0,"description":"...","outdialANIEntries":[{"name":"...","number":"...","organizationId":"...","id":"...","version":"...","defaultANIEntry":"...","createdTime":"...","lastUpdatedTime":"..."}],"createdTime":0,"lastUpdatedTime":0}'."""
72
+ api = get_api(debug=debug)
73
+ cc_base_url = get_cc_base_url()
74
+ orgid = get_cc_org_id(api.session)
75
+ url = f"{cc_base_url}/organization/{orgid}/outdial-ani"
76
+ if json_body:
77
+ body = json.loads(json_body)
78
+ else:
79
+ body = {}
80
+ if organization_id is not None:
81
+ body["organizationId"] = organization_id
82
+ if id_param is not None:
83
+ body["id"] = id_param
84
+ if version is not None:
85
+ body["version"] = version
86
+ if name is not None:
87
+ body["name"] = name
88
+ if description is not None:
89
+ body["description"] = description
90
+ if created_time is not None:
91
+ body["createdTime"] = created_time
92
+ if last_updated_time is not None:
93
+ body["lastUpdatedTime"] = last_updated_time
94
+ _missing = [f for f in ['name'] if f not in body or body[f] is None]
95
+ if _missing:
96
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
97
+ raise typer.Exit(1)
98
+ try:
99
+ result = api.session.rest_post(url, json=body)
100
+ except WebexError as e:
101
+ handle_rest_error(e)
102
+ if output == "json":
103
+ print_json(result)
104
+ elif isinstance(result, dict) and "id" in result:
105
+ typer.echo(f"Created: {result['id']}")
106
+ elif not result or result == {}:
107
+ typer.echo("Created.")
108
+ else:
109
+ print_json(result)
110
+
111
+
112
+
113
+ @app.command("create-bulk-outdial-ani")
114
+ def create_bulk_outdial_ani(
115
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
116
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
117
+ debug: bool = typer.Option(False, "--debug"),
118
+ ):
119
+ """Bulk save Outdial ANIs\n\nExample --json-body:\n '{"items":[{"itemIdentifier":"...","item":"...","requestAction":"..."}]}'."""
120
+ api = get_api(debug=debug)
121
+ cc_base_url = get_cc_base_url()
122
+ orgid = get_cc_org_id(api.session)
123
+ url = f"{cc_base_url}/organization/{orgid}/outdial-ani/bulk"
124
+ if json_body:
125
+ body = json.loads(json_body)
126
+ else:
127
+ body = {}
128
+ try:
129
+ result = api.session.rest_post(url, json=body)
130
+ except WebexError as e:
131
+ handle_rest_error(e)
132
+ if output == "json":
133
+ print_json(result)
134
+ elif isinstance(result, dict) and "id" in result:
135
+ typer.echo(f"Created: {result['id']}")
136
+ elif not result or result == {}:
137
+ typer.echo("Created.")
138
+ else:
139
+ print_json(result)
140
+
141
+
142
+
143
+ @app.command("list-entry-outdial-ani")
144
+ def list_entry_outdial_ani(
145
+ filter_param: str = typer.Option(None, "--filter", help="Specify a filter based on which the results will be fetched."),
146
+ attributes: str = typer.Option(None, "--attributes", help="Specify the attributes to be returned. By default, all attri"),
147
+ search: str = typer.Option(None, "--search", help="Filter data based on the search keyword.Supported search col"),
148
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
149
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
150
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
151
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
152
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
153
+ debug: bool = typer.Option(False, "--debug"),
154
+ ):
155
+ """List Outdial ANI Entries."""
156
+ api = get_api(debug=debug)
157
+ cc_base_url = get_cc_base_url()
158
+ orgid = get_cc_org_id(api.session)
159
+ url = f"{cc_base_url}/organization/{orgid}/outdial-ani/entry"
160
+ params = {}
161
+ if filter_param is not None:
162
+ params["filter"] = filter_param
163
+ if attributes is not None:
164
+ params["attributes"] = attributes
165
+ if search is not None:
166
+ params["search"] = search
167
+ if page is not None:
168
+ params["page"] = page
169
+ if page_size is not None:
170
+ params["pageSize"] = page_size
171
+ if limit > 0:
172
+ params["max"] = limit
173
+ if offset > 0:
174
+ params["start"] = offset
175
+ result = None
176
+ try:
177
+ result = api.session.rest_get(url, params=params)
178
+ except WebexError as e:
179
+ handle_rest_error(e)
180
+ result = result or []
181
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
182
+ if output == "json":
183
+ print_json(items)
184
+ else:
185
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
186
+
187
+
188
+
189
+ @app.command("show")
190
+ def show(
191
+ id: str = typer.Argument(help="id"),
192
+ output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
193
+ debug: bool = typer.Option(False, "--debug"),
194
+ ):
195
+ """Get specific Outdial ANI by ID."""
196
+ api = get_api(debug=debug)
197
+ cc_base_url = get_cc_base_url()
198
+ orgid = get_cc_org_id(api.session)
199
+ url = f"{cc_base_url}/organization/{orgid}/outdial-ani/{id}"
200
+ try:
201
+ result = api.session.rest_get(url)
202
+ except WebexError as e:
203
+ handle_rest_error(e)
204
+ if output == "json":
205
+ print_json(result)
206
+ else:
207
+ if isinstance(result, dict):
208
+ print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
209
+ elif isinstance(result, list):
210
+ print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
211
+ else:
212
+ print_json(result)
213
+
214
+
215
+
216
+ @app.command("update")
217
+ def update(
218
+ id: str = typer.Argument(help="id"),
219
+ organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. This field is require"),
220
+ id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
221
+ version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
222
+ name: str = typer.Option(None, "--name", help="Enter a name for the outdial ANI."),
223
+ description: str = typer.Option(None, "--description", help="(Optional) Enter a description for the outdial ANI."),
224
+ created_time: str = typer.Option(None, "--created-time", help="This is the created time of the entity."),
225
+ last_updated_time: str = typer.Option(None, "--last-updated-time", help="This is the updated time of the entity."),
226
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
227
+ debug: bool = typer.Option(False, "--debug"),
228
+ ):
229
+ """Update specific Outdial ANI by ID\n\nExample --json-body:\n '{"name":"...","organizationId":"...","id":"...","version":0,"description":"...","outdialANIEntries":[{"name":"...","number":"...","organizationId":"...","id":"...","version":"...","defaultANIEntry":"...","createdTime":"...","lastUpdatedTime":"..."}],"createdTime":0,"lastUpdatedTime":0}'."""
230
+ api = get_api(debug=debug)
231
+ cc_base_url = get_cc_base_url()
232
+ orgid = get_cc_org_id(api.session)
233
+ url = f"{cc_base_url}/organization/{orgid}/outdial-ani/{id}"
234
+ if json_body:
235
+ body = json.loads(json_body)
236
+ else:
237
+ body = {}
238
+ if organization_id is not None:
239
+ body["organizationId"] = organization_id
240
+ if id_param is not None:
241
+ body["id"] = id_param
242
+ if version is not None:
243
+ body["version"] = version
244
+ if name is not None:
245
+ body["name"] = name
246
+ if description is not None:
247
+ body["description"] = description
248
+ if created_time is not None:
249
+ body["createdTime"] = created_time
250
+ if last_updated_time is not None:
251
+ body["lastUpdatedTime"] = last_updated_time
252
+ try:
253
+ result = api.session.rest_put(url, json=body)
254
+ except WebexError as e:
255
+ handle_rest_error(e)
256
+ typer.echo(f"Updated.")
257
+
258
+
259
+
260
+ @app.command("delete")
261
+ def delete(
262
+ id: str = typer.Argument(help="id"),
263
+ force: bool = typer.Option(False, "--force", help="Skip confirmation"),
264
+ debug: bool = typer.Option(False, "--debug"),
265
+ ):
266
+ """Delete specific Outdial ANI by ID."""
267
+ if not force:
268
+ typer.confirm(f"Delete {id}?", abort=True)
269
+ api = get_api(debug=debug)
270
+ cc_base_url = get_cc_base_url()
271
+ orgid = get_cc_org_id(api.session)
272
+ url = f"{cc_base_url}/organization/{orgid}/outdial-ani/{id}"
273
+ try:
274
+ api.session.rest_delete(url)
275
+ except WebexError as e:
276
+ handle_rest_error(e)
277
+ typer.echo(f"Deleted: {id}")
278
+
279
+
280
+
281
+ @app.command("list-incoming-references")
282
+ def list_incoming_references(
283
+ id: str = typer.Argument(help="id"),
284
+ type_param: str = typer.Option(None, "--type", help="Entity type of the other entity that has a reference to this"),
285
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
286
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
287
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
288
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
289
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
290
+ debug: bool = typer.Option(False, "--debug"),
291
+ ):
292
+ """List references for a specific Outdial ANI."""
293
+ api = get_api(debug=debug)
294
+ cc_base_url = get_cc_base_url()
295
+ orgid = get_cc_org_id(api.session)
296
+ url = f"{cc_base_url}/organization/{orgid}/outdial-ani/{id}/incoming-references"
297
+ params = {}
298
+ if type_param is not None:
299
+ params["type"] = type_param
300
+ if page is not None:
301
+ params["page"] = page
302
+ if page_size is not None:
303
+ params["pageSize"] = page_size
304
+ if limit > 0:
305
+ params["max"] = limit
306
+ if offset > 0:
307
+ params["start"] = offset
308
+ result = None
309
+ try:
310
+ result = api.session.rest_get(url, params=params)
311
+ except WebexError as e:
312
+ handle_rest_error(e)
313
+ result = result or []
314
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
315
+ if output == "json":
316
+ print_json(items)
317
+ else:
318
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
319
+
320
+
321
+
322
+ @app.command("create-entry")
323
+ def create_entry(
324
+ out_dial_ani_id: str = typer.Argument(help="outDialAniId"),
325
+ organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. This field is require"),
326
+ id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
327
+ version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
328
+ name: str = typer.Option(None, "--name", help="(required) Enter a name for the outdial ANI entry."),
329
+ number: str = typer.Option(None, "--number", help="(required) Enter a valid phone number or valid SIP URI."),
330
+ default_ani_entry: bool = typer.Option(None, "--default-ani-entry/--no-default-ani-entry", help="Indicates whether this is the default Outdial ANI Entry(true"),
331
+ created_time: str = typer.Option(None, "--created-time", help="This is the created time of the entity."),
332
+ last_updated_time: str = typer.Option(None, "--last-updated-time", help="This is the updated time of the entity."),
333
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
334
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
335
+ debug: bool = typer.Option(False, "--debug"),
336
+ ):
337
+ """Create a new Outdial ANI Entry."""
338
+ api = get_api(debug=debug)
339
+ cc_base_url = get_cc_base_url()
340
+ orgid = get_cc_org_id(api.session)
341
+ url = f"{cc_base_url}/organization/{orgid}/outdial-ani/{out_dial_ani_id}/entry"
342
+ if json_body:
343
+ body = json.loads(json_body)
344
+ else:
345
+ body = {}
346
+ if organization_id is not None:
347
+ body["organizationId"] = organization_id
348
+ if id_param is not None:
349
+ body["id"] = id_param
350
+ if version is not None:
351
+ body["version"] = version
352
+ if name is not None:
353
+ body["name"] = name
354
+ if number is not None:
355
+ body["number"] = number
356
+ if default_ani_entry is not None:
357
+ body["defaultANIEntry"] = default_ani_entry
358
+ if created_time is not None:
359
+ body["createdTime"] = created_time
360
+ if last_updated_time is not None:
361
+ body["lastUpdatedTime"] = last_updated_time
362
+ _missing = [f for f in ['name', 'number'] if f not in body or body[f] is None]
363
+ if _missing:
364
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
365
+ raise typer.Exit(1)
366
+ try:
367
+ result = api.session.rest_post(url, json=body)
368
+ except WebexError as e:
369
+ handle_rest_error(e)
370
+ if output == "json":
371
+ print_json(result)
372
+ elif isinstance(result, dict) and "id" in result:
373
+ typer.echo(f"Created: {result['id']}")
374
+ elif not result or result == {}:
375
+ typer.echo("Created.")
376
+ else:
377
+ print_json(result)
378
+
379
+
380
+
381
+ @app.command("create-bulk-entry")
382
+ def create_bulk_entry(
383
+ out_dial_ani_id: str = typer.Argument(help="outDialAniId"),
384
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
385
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
386
+ debug: bool = typer.Option(False, "--debug"),
387
+ ):
388
+ """Bulk save Outdial ANI Entries\n\nExample --json-body:\n '{"items":[{"itemIdentifier":"...","item":"...","requestAction":"..."}]}'."""
389
+ api = get_api(debug=debug)
390
+ cc_base_url = get_cc_base_url()
391
+ orgid = get_cc_org_id(api.session)
392
+ url = f"{cc_base_url}/organization/{orgid}/outdial-ani/{out_dial_ani_id}/entry/bulk"
393
+ if json_body:
394
+ body = json.loads(json_body)
395
+ else:
396
+ body = {}
397
+ try:
398
+ result = api.session.rest_post(url, json=body)
399
+ except WebexError as e:
400
+ handle_rest_error(e)
401
+ if output == "json":
402
+ print_json(result)
403
+ elif isinstance(result, dict) and "id" in result:
404
+ typer.echo(f"Created: {result['id']}")
405
+ elif not result or result == {}:
406
+ typer.echo("Created.")
407
+ else:
408
+ print_json(result)
409
+
410
+
411
+
412
+ @app.command("show-entry")
413
+ def show_entry(
414
+ out_dial_ani_id: str = typer.Argument(help="outDialAniId"),
415
+ id: str = typer.Argument(help="id"),
416
+ output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
417
+ debug: bool = typer.Option(False, "--debug"),
418
+ ):
419
+ """Get specific Outdial ANI Entry by ID."""
420
+ api = get_api(debug=debug)
421
+ cc_base_url = get_cc_base_url()
422
+ orgid = get_cc_org_id(api.session)
423
+ url = f"{cc_base_url}/organization/{orgid}/outdial-ani/{out_dial_ani_id}/entry/{id}"
424
+ try:
425
+ result = api.session.rest_get(url)
426
+ except WebexError as e:
427
+ handle_rest_error(e)
428
+ if output == "json":
429
+ print_json(result)
430
+ else:
431
+ if isinstance(result, dict):
432
+ print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
433
+ elif isinstance(result, list):
434
+ print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
435
+ else:
436
+ print_json(result)
437
+
438
+
439
+
440
+ @app.command("update-entry")
441
+ def update_entry(
442
+ out_dial_ani_id: str = typer.Argument(help="outDialAniId"),
443
+ id: str = typer.Argument(help="id"),
444
+ organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. This field is require"),
445
+ id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
446
+ version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
447
+ name: str = typer.Option(None, "--name", help="Enter a name for the outdial ANI entry."),
448
+ number: str = typer.Option(None, "--number", help="Enter a valid phone number or valid SIP URI."),
449
+ default_ani_entry: bool = typer.Option(None, "--default-ani-entry/--no-default-ani-entry", help="Indicates whether this is the default Outdial ANI Entry(true"),
450
+ created_time: str = typer.Option(None, "--created-time", help="This is the created time of the entity."),
451
+ last_updated_time: str = typer.Option(None, "--last-updated-time", help="This is the updated time of the entity."),
452
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
453
+ debug: bool = typer.Option(False, "--debug"),
454
+ ):
455
+ """Update specific Outdial ANI Entry by ID."""
456
+ api = get_api(debug=debug)
457
+ cc_base_url = get_cc_base_url()
458
+ orgid = get_cc_org_id(api.session)
459
+ url = f"{cc_base_url}/organization/{orgid}/outdial-ani/{out_dial_ani_id}/entry/{id}"
460
+ if json_body:
461
+ body = json.loads(json_body)
462
+ else:
463
+ body = {}
464
+ if organization_id is not None:
465
+ body["organizationId"] = organization_id
466
+ if id_param is not None:
467
+ body["id"] = id_param
468
+ if version is not None:
469
+ body["version"] = version
470
+ if name is not None:
471
+ body["name"] = name
472
+ if number is not None:
473
+ body["number"] = number
474
+ if default_ani_entry is not None:
475
+ body["defaultANIEntry"] = default_ani_entry
476
+ if created_time is not None:
477
+ body["createdTime"] = created_time
478
+ if last_updated_time is not None:
479
+ body["lastUpdatedTime"] = last_updated_time
480
+ try:
481
+ result = api.session.rest_put(url, json=body)
482
+ except WebexError as e:
483
+ handle_rest_error(e)
484
+ typer.echo(f"Updated.")
485
+
486
+
487
+
488
+ @app.command("delete-entry")
489
+ def delete_entry(
490
+ out_dial_ani_id: str = typer.Argument(help="outDialAniId"),
491
+ id: str = typer.Argument(help="id"),
492
+ force: bool = typer.Option(False, "--force", help="Skip confirmation"),
493
+ debug: bool = typer.Option(False, "--debug"),
494
+ ):
495
+ """Delete specific Outdial ANI Entry by ID."""
496
+ if not force:
497
+ typer.confirm(f"Delete {id}?", abort=True)
498
+ api = get_api(debug=debug)
499
+ cc_base_url = get_cc_base_url()
500
+ orgid = get_cc_org_id(api.session)
501
+ url = f"{cc_base_url}/organization/{orgid}/outdial-ani/{out_dial_ani_id}/entry/{id}"
502
+ try:
503
+ api.session.rest_delete(url)
504
+ except WebexError as e:
505
+ handle_rest_error(e)
506
+ typer.echo(f"Deleted: {id}")
507
+
508
+
509
+
510
+ @app.command("list-outdial-ani")
511
+ def list_outdial_ani(
512
+ filter_param: str = typer.Option(None, "--filter", help="Specify a filter based on which the results will be fetched."),
513
+ attributes: str = typer.Option(None, "--attributes", help="Specify the attributes to be returned. By default, all attri"),
514
+ search: str = typer.Option(None, "--search", help="Filter data based on the search keyword.Supported search col"),
515
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
516
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
517
+ single_object_response: str = typer.Option(None, "--single-object-response", help="Specify whether to include array fields in the response. Thi"),
518
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
519
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
520
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
521
+ debug: bool = typer.Option(False, "--debug"),
522
+ ):
523
+ """List Outdial ANIs."""
524
+ api = get_api(debug=debug)
525
+ cc_base_url = get_cc_base_url()
526
+ orgid = get_cc_org_id(api.session)
527
+ url = f"{cc_base_url}/organization/{orgid}/v2/outdial-ani"
528
+ params = {}
529
+ if filter_param is not None:
530
+ params["filter"] = filter_param
531
+ if attributes is not None:
532
+ params["attributes"] = attributes
533
+ if search is not None:
534
+ params["search"] = search
535
+ if page is not None:
536
+ params["page"] = page
537
+ if page_size is not None:
538
+ params["pageSize"] = page_size
539
+ if single_object_response is not None:
540
+ params["singleObjectResponse"] = single_object_response
541
+ if limit > 0:
542
+ params["max"] = limit
543
+ if offset > 0:
544
+ params["start"] = offset
545
+ result = None
546
+ try:
547
+ result = api.session.rest_get(url, params=params)
548
+ except WebexError as e:
549
+ handle_rest_error(e)
550
+ result = result or []
551
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
552
+ if output == "json":
553
+ print_json(items)
554
+ else:
555
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
556
+
557
+
558
+
559
+ @app.command("list-entry-outdial-ani-1")
560
+ def list_entry_outdial_ani_1(
561
+ out_dial_ani_id: str = typer.Argument(help="outDialAniId"),
562
+ filter_param: str = typer.Option(None, "--filter", help="Specify a filter based on which the results will be fetched."),
563
+ attributes: str = typer.Option(None, "--attributes", help="Specify the attributes to be returned. By default, all attri"),
564
+ search: str = typer.Option(None, "--search", help="Filter data based on the search keyword.Supported search col"),
565
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
566
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
567
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
568
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
569
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
570
+ debug: bool = typer.Option(False, "--debug"),
571
+ ):
572
+ """List Outdial ANI Entries."""
573
+ api = get_api(debug=debug)
574
+ cc_base_url = get_cc_base_url()
575
+ orgid = get_cc_org_id(api.session)
576
+ url = f"{cc_base_url}/organization/{orgid}/v2/outdial-ani/{out_dial_ani_id}/entry"
577
+ params = {}
578
+ if filter_param is not None:
579
+ params["filter"] = filter_param
580
+ if attributes is not None:
581
+ params["attributes"] = attributes
582
+ if search is not None:
583
+ params["search"] = search
584
+ if page is not None:
585
+ params["page"] = page
586
+ if page_size is not None:
587
+ params["pageSize"] = page_size
588
+ if limit > 0:
589
+ params["max"] = limit
590
+ if offset > 0:
591
+ params["start"] = offset
592
+ result = None
593
+ try:
594
+ result = api.session.rest_get(url, params=params)
595
+ except WebexError as e:
596
+ handle_rest_error(e)
597
+ result = result or []
598
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
599
+ if output == "json":
600
+ print_json(items)
601
+ else:
602
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
603
+
604
+