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,511 @@
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-dial-number.")
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
+ 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 Dialed Number Mapping(s)."""
24
+ api = get_api(debug=debug)
25
+ cc_base_url = get_cc_base_url()
26
+ orgid = get_cc_org_id(api.session)
27
+ url = f"{cc_base_url}/organization/{orgid}/dial-number"
28
+ params = {}
29
+ if filter_param is not None:
30
+ params["filter"] = filter_param
31
+ if attributes is not None:
32
+ params["attributes"] = attributes
33
+ if page is not None:
34
+ params["page"] = page
35
+ if page_size is not None:
36
+ params["pageSize"] = page_size
37
+ if limit > 0:
38
+ params["max"] = limit
39
+ if offset > 0:
40
+ params["start"] = offset
41
+ result = None
42
+ try:
43
+ result = api.session.rest_get(url, params=params)
44
+ except WebexError as e:
45
+ handle_rest_error(e)
46
+ result = result or []
47
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
48
+ if output == "json":
49
+ print_json(items)
50
+ else:
51
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
52
+
53
+
54
+
55
+ @app.command("create")
56
+ def create(
57
+ organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. This field is require"),
58
+ id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
59
+ version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
60
+ dialled_number: str = typer.Option(None, "--dialled-number", help="The dialed number(DN) used to map to entry points."),
61
+ extension: str = typer.Option(None, "--extension", help="The extension used to map to entry points."),
62
+ routing_prefix: str = typer.Option(None, "--routing-prefix", help="The routing prefix is mapped to a location and can be prefix"),
63
+ esn: str = typer.Option(None, "--esn", help="The esn is routing prefix with extension"),
64
+ route_point_id: str = typer.Option(None, "--route-point-id", help="The identifier of a route point of WxC which is similar to e"),
65
+ entry_point_id: str = typer.Option(None, "--entry-point-id", help="(required) The identifier of an entry point to which you want to map th"),
66
+ entry_point_name: str = typer.Option(None, "--entry-point-name", help="(required) The entryPoint name of the entryPointId."),
67
+ default_ani: bool = typer.Option(None, "--default-ani/--no-default-ani", help="The default dial number for the tenant to make outdial calls"),
68
+ location: str = typer.Option(None, "--location", help="The name of the location as configured on Webex Calling(appl"),
69
+ region_id: str = typer.Option(None, "--region-id", help="Specify the telephony region id. You can pass id for one of"),
70
+ created_time: str = typer.Option(None, "--created-time", help="This is the created time of the entity."),
71
+ last_updated_time: str = typer.Option(None, "--last-updated-time", help="This is the updated time of the entity."),
72
+ dialled_number_digits: str = typer.Option(None, "--dialled-number-digits", help=""),
73
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
74
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
75
+ debug: bool = typer.Option(False, "--debug"),
76
+ ):
77
+ """Create a new Dialed Number Mapping."""
78
+ api = get_api(debug=debug)
79
+ cc_base_url = get_cc_base_url()
80
+ orgid = get_cc_org_id(api.session)
81
+ url = f"{cc_base_url}/organization/{orgid}/dial-number"
82
+ if json_body:
83
+ body = json.loads(json_body)
84
+ else:
85
+ body = {}
86
+ if organization_id is not None:
87
+ body["organizationId"] = organization_id
88
+ if id_param is not None:
89
+ body["id"] = id_param
90
+ if version is not None:
91
+ body["version"] = version
92
+ if dialled_number is not None:
93
+ body["dialledNumber"] = dialled_number
94
+ if extension is not None:
95
+ body["extension"] = extension
96
+ if routing_prefix is not None:
97
+ body["routingPrefix"] = routing_prefix
98
+ if esn is not None:
99
+ body["esn"] = esn
100
+ if route_point_id is not None:
101
+ body["routePointId"] = route_point_id
102
+ if entry_point_id is not None:
103
+ body["entryPointId"] = entry_point_id
104
+ if entry_point_name is not None:
105
+ body["entryPointName"] = entry_point_name
106
+ if default_ani is not None:
107
+ body["defaultAni"] = default_ani
108
+ if location is not None:
109
+ body["location"] = location
110
+ if region_id is not None:
111
+ body["regionId"] = region_id
112
+ if created_time is not None:
113
+ body["createdTime"] = created_time
114
+ if last_updated_time is not None:
115
+ body["lastUpdatedTime"] = last_updated_time
116
+ if dialled_number_digits is not None:
117
+ body["dialledNumberDigits"] = dialled_number_digits
118
+ _missing = [f for f in ['entryPointId', 'entryPointName'] if f not in body or body[f] is None]
119
+ if _missing:
120
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
121
+ raise typer.Exit(1)
122
+ try:
123
+ result = api.session.rest_post(url, json=body)
124
+ except WebexError as e:
125
+ handle_rest_error(e)
126
+ if output == "json":
127
+ print_json(result)
128
+ elif isinstance(result, dict) and "id" in result:
129
+ typer.echo(f"Created: {result['id']}")
130
+ elif not result or result == {}:
131
+ typer.echo("Created.")
132
+ else:
133
+ print_json(result)
134
+
135
+
136
+
137
+ @app.command("delete")
138
+ def delete(
139
+ force: bool = typer.Option(False, "--force", help="Skip confirmation"),
140
+ debug: bool = typer.Option(False, "--debug"),
141
+ ):
142
+ """Delete all Dialed Number Mapping(s)."""
143
+ if not force:
144
+ typer.confirm(f"Delete {orgid}?", abort=True)
145
+ api = get_api(debug=debug)
146
+ cc_base_url = get_cc_base_url()
147
+ orgid = get_cc_org_id(api.session)
148
+ url = f"{cc_base_url}/organization/{orgid}/dial-number"
149
+ try:
150
+ api.session.rest_delete(url)
151
+ except WebexError as e:
152
+ handle_rest_error(e)
153
+ typer.echo(f"Deleted: {orgid}")
154
+
155
+
156
+
157
+ @app.command("create-bulk")
158
+ def create_bulk(
159
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
160
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
161
+ debug: bool = typer.Option(False, "--debug"),
162
+ ):
163
+ """Bulk save Dialed Number Mapping(s)\n\nExample --json-body:\n '{"items":[{"itemIdentifier":"...","item":"...","requestAction":"..."}]}'."""
164
+ api = get_api(debug=debug)
165
+ cc_base_url = get_cc_base_url()
166
+ orgid = get_cc_org_id(api.session)
167
+ url = f"{cc_base_url}/organization/{orgid}/dial-number/bulk"
168
+ if json_body:
169
+ body = json.loads(json_body)
170
+ else:
171
+ body = {}
172
+ try:
173
+ result = api.session.rest_post(url, json=body)
174
+ except WebexError as e:
175
+ handle_rest_error(e)
176
+ if output == "json":
177
+ print_json(result)
178
+ elif isinstance(result, dict) and "id" in result:
179
+ typer.echo(f"Created: {result['id']}")
180
+ elif not result or result == {}:
181
+ typer.echo("Created.")
182
+ else:
183
+ print_json(result)
184
+
185
+
186
+
187
+ @app.command("list-bulk-export")
188
+ def list_bulk_export(
189
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
190
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
191
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
192
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
193
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
194
+ debug: bool = typer.Option(False, "--debug"),
195
+ ):
196
+ """Bulk export Dialed Number Mapping(s)."""
197
+ api = get_api(debug=debug)
198
+ cc_base_url = get_cc_base_url()
199
+ orgid = get_cc_org_id(api.session)
200
+ url = f"{cc_base_url}/organization/{orgid}/dial-number/bulk-export"
201
+ params = {}
202
+ if page is not None:
203
+ params["page"] = page
204
+ if page_size is not None:
205
+ params["pageSize"] = page_size
206
+ if limit > 0:
207
+ params["max"] = limit
208
+ if offset > 0:
209
+ params["start"] = offset
210
+ result = None
211
+ try:
212
+ result = api.session.rest_get(url, params=params)
213
+ except WebexError as e:
214
+ handle_rest_error(e)
215
+ result = result or []
216
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
217
+ if output == "json":
218
+ print_json(items)
219
+ else:
220
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
221
+
222
+
223
+
224
+ @app.command("list-numbers-only")
225
+ def list_numbers_only(
226
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
227
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
228
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
229
+ debug: bool = typer.Option(False, "--debug"),
230
+ ):
231
+ """List only dialed numbers(property - dialledNumber) from Dialed Number Mapping(s)."""
232
+ api = get_api(debug=debug)
233
+ cc_base_url = get_cc_base_url()
234
+ orgid = get_cc_org_id(api.session)
235
+ url = f"{cc_base_url}/organization/{orgid}/dial-number/numbers-only"
236
+ params = {}
237
+ if limit > 0:
238
+ params["max"] = limit
239
+ if offset > 0:
240
+ params["start"] = offset
241
+ result = None
242
+ try:
243
+ result = api.session.rest_get(url, params=params)
244
+ except WebexError as e:
245
+ handle_rest_error(e)
246
+ result = result or []
247
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
248
+ if output == "json":
249
+ print_json(items)
250
+ else:
251
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
252
+
253
+
254
+
255
+ @app.command("show")
256
+ def show(
257
+ id: str = typer.Argument(help="id"),
258
+ output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
259
+ debug: bool = typer.Option(False, "--debug"),
260
+ ):
261
+ """Get specific Dialed Number Mapping by ID."""
262
+ api = get_api(debug=debug)
263
+ cc_base_url = get_cc_base_url()
264
+ orgid = get_cc_org_id(api.session)
265
+ url = f"{cc_base_url}/organization/{orgid}/dial-number/{id}"
266
+ try:
267
+ result = api.session.rest_get(url)
268
+ except WebexError as e:
269
+ handle_rest_error(e)
270
+ if output == "json":
271
+ print_json(result)
272
+ else:
273
+ if isinstance(result, dict):
274
+ print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
275
+ elif isinstance(result, list):
276
+ print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
277
+ else:
278
+ print_json(result)
279
+
280
+
281
+
282
+ @app.command("update")
283
+ def update(
284
+ id: str = typer.Argument(help="id"),
285
+ organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. This field is require"),
286
+ id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
287
+ version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
288
+ dialled_number: str = typer.Option(None, "--dialled-number", help="The dialed number(DN) used to map to entry points."),
289
+ extension: str = typer.Option(None, "--extension", help="The extension used to map to entry points."),
290
+ routing_prefix: str = typer.Option(None, "--routing-prefix", help="The routing prefix is mapped to a location and can be prefix"),
291
+ esn: str = typer.Option(None, "--esn", help="The esn is routing prefix with extension"),
292
+ route_point_id: str = typer.Option(None, "--route-point-id", help="The identifier of a route point of WxC which is similar to e"),
293
+ entry_point_id: str = typer.Option(None, "--entry-point-id", help="The identifier of an entry point to which you want to map th"),
294
+ entry_point_name: str = typer.Option(None, "--entry-point-name", help="The entryPoint name of the entryPointId."),
295
+ default_ani: bool = typer.Option(None, "--default-ani/--no-default-ani", help="The default dial number for the tenant to make outdial calls"),
296
+ location: str = typer.Option(None, "--location", help="The name of the location as configured on Webex Calling(appl"),
297
+ region_id: str = typer.Option(None, "--region-id", help="Specify the telephony region id. You can pass id for one of"),
298
+ created_time: str = typer.Option(None, "--created-time", help="This is the created time of the entity."),
299
+ last_updated_time: str = typer.Option(None, "--last-updated-time", help="This is the updated time of the entity."),
300
+ dialled_number_digits: str = typer.Option(None, "--dialled-number-digits", help=""),
301
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
302
+ debug: bool = typer.Option(False, "--debug"),
303
+ ):
304
+ """Update specific Dialed Number Mapping by ID."""
305
+ api = get_api(debug=debug)
306
+ cc_base_url = get_cc_base_url()
307
+ orgid = get_cc_org_id(api.session)
308
+ url = f"{cc_base_url}/organization/{orgid}/dial-number/{id}"
309
+ if json_body:
310
+ body = json.loads(json_body)
311
+ else:
312
+ body = {}
313
+ if organization_id is not None:
314
+ body["organizationId"] = organization_id
315
+ if id_param is not None:
316
+ body["id"] = id_param
317
+ if version is not None:
318
+ body["version"] = version
319
+ if dialled_number is not None:
320
+ body["dialledNumber"] = dialled_number
321
+ if extension is not None:
322
+ body["extension"] = extension
323
+ if routing_prefix is not None:
324
+ body["routingPrefix"] = routing_prefix
325
+ if esn is not None:
326
+ body["esn"] = esn
327
+ if route_point_id is not None:
328
+ body["routePointId"] = route_point_id
329
+ if entry_point_id is not None:
330
+ body["entryPointId"] = entry_point_id
331
+ if entry_point_name is not None:
332
+ body["entryPointName"] = entry_point_name
333
+ if default_ani is not None:
334
+ body["defaultAni"] = default_ani
335
+ if location is not None:
336
+ body["location"] = location
337
+ if region_id is not None:
338
+ body["regionId"] = region_id
339
+ if created_time is not None:
340
+ body["createdTime"] = created_time
341
+ if last_updated_time is not None:
342
+ body["lastUpdatedTime"] = last_updated_time
343
+ if dialled_number_digits is not None:
344
+ body["dialledNumberDigits"] = dialled_number_digits
345
+ try:
346
+ result = api.session.rest_put(url, json=body)
347
+ except WebexError as e:
348
+ handle_rest_error(e)
349
+ typer.echo(f"Updated.")
350
+
351
+
352
+
353
+ @app.command("delete-dial-number")
354
+ def delete_dial_number(
355
+ id: str = typer.Argument(help="id"),
356
+ force: bool = typer.Option(False, "--force", help="Skip confirmation"),
357
+ debug: bool = typer.Option(False, "--debug"),
358
+ ):
359
+ """Delete specific Dialed Number Mapping by ID."""
360
+ if not force:
361
+ typer.confirm(f"Delete {id}?", abort=True)
362
+ api = get_api(debug=debug)
363
+ cc_base_url = get_cc_base_url()
364
+ orgid = get_cc_org_id(api.session)
365
+ url = f"{cc_base_url}/organization/{orgid}/dial-number/{id}"
366
+ try:
367
+ api.session.rest_delete(url)
368
+ except WebexError as e:
369
+ handle_rest_error(e)
370
+ typer.echo(f"Deleted: {id}")
371
+
372
+
373
+
374
+ @app.command("list-incoming-references")
375
+ def list_incoming_references(
376
+ id: str = typer.Argument(help="id"),
377
+ type_param: str = typer.Option(None, "--type", help="Entity type of the other entity that has a reference to this"),
378
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
379
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
380
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
381
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
382
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
383
+ debug: bool = typer.Option(False, "--debug"),
384
+ ):
385
+ """List references for a specific Dialed Number Mapping."""
386
+ api = get_api(debug=debug)
387
+ cc_base_url = get_cc_base_url()
388
+ orgid = get_cc_org_id(api.session)
389
+ url = f"{cc_base_url}/organization/{orgid}/dial-number/{id}/incoming-references"
390
+ params = {}
391
+ if type_param is not None:
392
+ params["type"] = type_param
393
+ if page is not None:
394
+ params["page"] = page
395
+ if page_size is not None:
396
+ params["pageSize"] = page_size
397
+ if limit > 0:
398
+ params["max"] = limit
399
+ if offset > 0:
400
+ params["start"] = offset
401
+ result = None
402
+ try:
403
+ result = api.session.rest_get(url, params=params)
404
+ except WebexError as e:
405
+ handle_rest_error(e)
406
+ result = result or []
407
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
408
+ if output == "json":
409
+ print_json(items)
410
+ else:
411
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
412
+
413
+
414
+
415
+ @app.command("list-dial-number-v2")
416
+ def list_dial_number_v2(
417
+ filter_param: str = typer.Option(None, "--filter", help="Specify a filter based on which the results will be fetched."),
418
+ attributes: str = typer.Option(None, "--attributes", help="Specify the attributes to be returned. By default, all attri"),
419
+ search: str = typer.Option(None, "--search", help="Filter data based on the search keyword.Supported search col"),
420
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
421
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
422
+ include_entry_point_name: str = typer.Option(None, "--include-entry-point-name", help="If includeEntryPointName is set to true and entryPointName i"),
423
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
424
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
425
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
426
+ debug: bool = typer.Option(False, "--debug"),
427
+ ):
428
+ """List Dialed Number Mapping(s)."""
429
+ api = get_api(debug=debug)
430
+ cc_base_url = get_cc_base_url()
431
+ orgid = get_cc_org_id(api.session)
432
+ url = f"{cc_base_url}/organization/{orgid}/v2/dial-number"
433
+ params = {}
434
+ if filter_param is not None:
435
+ params["filter"] = filter_param
436
+ if attributes is not None:
437
+ params["attributes"] = attributes
438
+ if search is not None:
439
+ params["search"] = search
440
+ if page is not None:
441
+ params["page"] = page
442
+ if page_size is not None:
443
+ params["pageSize"] = page_size
444
+ if include_entry_point_name is not None:
445
+ params["includeEntryPointName"] = include_entry_point_name
446
+ if limit > 0:
447
+ params["max"] = limit
448
+ if offset > 0:
449
+ params["start"] = offset
450
+ result = None
451
+ try:
452
+ result = api.session.rest_get(url, params=params)
453
+ except WebexError as e:
454
+ handle_rest_error(e)
455
+ result = result or []
456
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
457
+ if output == "json":
458
+ print_json(items)
459
+ else:
460
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
461
+
462
+
463
+
464
+ @app.command("list-dial-number-v3")
465
+ def list_dial_number_v3(
466
+ filter_param: str = typer.Option(None, "--filter", help="Specify a filter based on which the results will be fetched."),
467
+ attributes: str = typer.Option(None, "--attributes", help="Specify the attributes to be returned. By default, all attri"),
468
+ search: str = typer.Option(None, "--search", help="Filter data based on the search keyword.Supported search col"),
469
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
470
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
471
+ include_entry_point_name: str = typer.Option(None, "--include-entry-point-name", help="If includeEntryPointName is set to true and entryPointName i"),
472
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
473
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
474
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
475
+ debug: bool = typer.Option(False, "--debug"),
476
+ ):
477
+ """List Dialed Number Mapping(s)."""
478
+ api = get_api(debug=debug)
479
+ cc_base_url = get_cc_base_url()
480
+ orgid = get_cc_org_id(api.session)
481
+ url = f"{cc_base_url}/organization/{orgid}/v3/dial-number"
482
+ params = {}
483
+ if filter_param is not None:
484
+ params["filter"] = filter_param
485
+ if attributes is not None:
486
+ params["attributes"] = attributes
487
+ if search is not None:
488
+ params["search"] = search
489
+ if page is not None:
490
+ params["page"] = page
491
+ if page_size is not None:
492
+ params["pageSize"] = page_size
493
+ if include_entry_point_name is not None:
494
+ params["includeEntryPointName"] = include_entry_point_name
495
+ if limit > 0:
496
+ params["max"] = limit
497
+ if offset > 0:
498
+ params["start"] = offset
499
+ result = None
500
+ try:
501
+ result = api.session.rest_get(url, params=params)
502
+ except WebexError as e:
503
+ handle_rest_error(e)
504
+ result = result or []
505
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
506
+ if output == "json":
507
+ print_json(items)
508
+ else:
509
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
510
+
511
+