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.
- wxcli/__init__.py +4 -0
- wxcli/_playbook/.claude/agents/migration-advisor.md +239 -0
- wxcli/_playbook/.claude/agents/wxc-calling-builder.md +946 -0
- wxcli/_playbook/.claude/rules/cleanup.md +29 -0
- wxcli/_playbook/.claude/rules/cucm-migration.md +58 -0
- wxcli/_playbook/.claude/rules/org-health.md +14 -0
- wxcli/_playbook/.claude/settings.json +8 -0
- wxcli/_playbook/.claude/skills/audit-compliance/SKILL.md +515 -0
- wxcli/_playbook/.claude/skills/call-control/SKILL.md +747 -0
- wxcli/_playbook/.claude/skills/configure-features/SKILL.md +623 -0
- wxcli/_playbook/.claude/skills/configure-routing/SKILL.md +627 -0
- wxcli/_playbook/.claude/skills/contact-center/SKILL.md +1181 -0
- wxcli/_playbook/.claude/skills/cucm-migrate/SKILL.md +820 -0
- wxcli/_playbook/.claude/skills/customer-assist/SKILL.md +443 -0
- wxcli/_playbook/.claude/skills/device-platform/SKILL.md +407 -0
- wxcli/_playbook/.claude/skills/manage-call-settings/SKILL.md +757 -0
- wxcli/_playbook/.claude/skills/manage-devices/SKILL.md +790 -0
- wxcli/_playbook/.claude/skills/manage-identity/SKILL.md +638 -0
- wxcli/_playbook/.claude/skills/manage-licensing/SKILL.md +528 -0
- wxcli/_playbook/.claude/skills/manage-meetings/SKILL.md +708 -0
- wxcli/_playbook/.claude/skills/messaging-bots/SKILL.md +365 -0
- wxcli/_playbook/.claude/skills/messaging-spaces/SKILL.md +520 -0
- wxcli/_playbook/.claude/skills/org-health/SKILL.md +159 -0
- wxcli/_playbook/.claude/skills/provision-calling/SKILL.md +421 -0
- wxcli/_playbook/.claude/skills/query-live/SKILL.md +183 -0
- wxcli/_playbook/.claude/skills/query-live/domains/call-flow-trace.md +223 -0
- wxcli/_playbook/.claude/skills/query-live/domains/call-history.md +44 -0
- wxcli/_playbook/.claude/skills/query-live/domains/features.md +169 -0
- wxcli/_playbook/.claude/skills/query-live/domains/numbers.md +93 -0
- wxcli/_playbook/.claude/skills/query-live/domains/people-and-settings.md +146 -0
- wxcli/_playbook/.claude/skills/query-live/domains/routing.md +124 -0
- wxcli/_playbook/.claude/skills/reporting/SKILL.md +501 -0
- wxcli/_playbook/.claude/skills/reporting/references/cdr-recipes.md +1628 -0
- wxcli/_playbook/.claude/skills/reporting-cc/SKILL.md +251 -0
- wxcli/_playbook/.claude/skills/reporting-meetings/SKILL.md +290 -0
- wxcli/_playbook/.claude/skills/teardown/SKILL.md +214 -0
- wxcli/_playbook/.claude/skills/video-mesh/SKILL.md +379 -0
- wxcli/_playbook/.claude/skills/wxc-calling-debug/SKILL.md +475 -0
- wxcli/_playbook/CLAUDE.md +373 -0
- wxcli/_playbook/docs/reference/CLAUDE.md +25 -0
- wxcli/_playbook/docs/reference/admin-apps-data.md +643 -0
- wxcli/_playbook/docs/reference/admin-audit-security.md +322 -0
- wxcli/_playbook/docs/reference/admin-hybrid.md +383 -0
- wxcli/_playbook/docs/reference/admin-identity-scim.md +1007 -0
- wxcli/_playbook/docs/reference/admin-licensing.md +414 -0
- wxcli/_playbook/docs/reference/admin-org-management.md +586 -0
- wxcli/_playbook/docs/reference/admin-partner.md +357 -0
- wxcli/_playbook/docs/reference/archive/wxc-sdk-patterns.md +1229 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-advanced.md +835 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-core.md +743 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-devices-workspaces.md +1305 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-features.md +849 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-locations.md +938 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-person.md +1255 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-routing.md +1262 -0
- wxcli/_playbook/docs/reference/authentication.md +965 -0
- wxcli/_playbook/docs/reference/call-control.md +1205 -0
- wxcli/_playbook/docs/reference/call-features-additional.md +2541 -0
- wxcli/_playbook/docs/reference/call-features-major.md +1320 -0
- wxcli/_playbook/docs/reference/call-routing.md +2304 -0
- wxcli/_playbook/docs/reference/contact-center-analytics.md +1049 -0
- wxcli/_playbook/docs/reference/contact-center-core.md +1614 -0
- wxcli/_playbook/docs/reference/contact-center-journey.md +457 -0
- wxcli/_playbook/docs/reference/contact-center-routing.md +1138 -0
- wxcli/_playbook/docs/reference/devices-core.md +1869 -0
- wxcli/_playbook/docs/reference/devices-dect.md +1150 -0
- wxcli/_playbook/docs/reference/devices-platform.md +467 -0
- wxcli/_playbook/docs/reference/devices-workspaces.md +1426 -0
- wxcli/_playbook/docs/reference/emergency-services.md +1122 -0
- wxcli/_playbook/docs/reference/location-calling-core.md +2037 -0
- wxcli/_playbook/docs/reference/location-calling-media.md +1334 -0
- wxcli/_playbook/docs/reference/location-recording-advanced.md +1482 -0
- wxcli/_playbook/docs/reference/meetings-content.md +473 -0
- wxcli/_playbook/docs/reference/meetings-core.md +903 -0
- wxcli/_playbook/docs/reference/meetings-infrastructure.md +899 -0
- wxcli/_playbook/docs/reference/meetings-settings.md +850 -0
- wxcli/_playbook/docs/reference/messaging-bots.md +1091 -0
- wxcli/_playbook/docs/reference/messaging-spaces.md +695 -0
- wxcli/_playbook/docs/reference/person-call-settings-behavior.md +1639 -0
- wxcli/_playbook/docs/reference/person-call-settings-handling.md +1394 -0
- wxcli/_playbook/docs/reference/person-call-settings-media.md +1898 -0
- wxcli/_playbook/docs/reference/person-call-settings-permissions.md +1329 -0
- wxcli/_playbook/docs/reference/provisioning.md +1366 -0
- wxcli/_playbook/docs/reference/reporting-analytics.md +1318 -0
- wxcli/_playbook/docs/reference/self-service-call-settings.md +1020 -0
- wxcli/_playbook/docs/reference/virtual-lines.md +1132 -0
- wxcli/_playbook/docs/reference/webhooks-events.md +1444 -0
- wxcli/_playbook/docs/reference/wxcadm-xsi-realtime.md +953 -0
- wxcli/_version.py +24 -0
- wxcli/auth.py +137 -0
- wxcli/commands/__init__.py +0 -0
- wxcli/commands/_registry.py +181 -0
- wxcli/commands/activation_email.py +103 -0
- wxcli/commands/admin_recordings.py +585 -0
- wxcli/commands/analytics.py +105 -0
- wxcli/commands/announcement_playlists.py +219 -0
- wxcli/commands/announcements.py +519 -0
- wxcli/commands/archive_users.py +36 -0
- wxcli/commands/attachment_actions.py +60 -0
- wxcli/commands/audit_events.py +83 -0
- wxcli/commands/authorizations.py +113 -0
- wxcli/commands/auto_attendant.py +642 -0
- wxcli/commands/broadworks_billing_reports.py +126 -0
- wxcli/commands/broadworks_enterprises.py +160 -0
- wxcli/commands/broadworks_subscribers.py +319 -0
- wxcli/commands/broadworks_workspaces.py +108 -0
- wxcli/commands/call_controls.py +1304 -0
- wxcli/commands/call_park.py +494 -0
- wxcli/commands/call_pickup.py +229 -0
- wxcli/commands/call_queue.py +1878 -0
- wxcli/commands/call_recording.py +707 -0
- wxcli/commands/call_routing.py +1610 -0
- wxcli/commands/call_settings_for_me_phase_5.py +212 -0
- wxcli/commands/caller_reputation.py +169 -0
- wxcli/commands/calling_service.py +305 -0
- wxcli/commands/cc_address_book.py +770 -0
- wxcli/commands/cc_agent_greetings.py +242 -0
- wxcli/commands/cc_agent_summaries.py +39 -0
- wxcli/commands/cc_agent_wellbeing.py +216 -0
- wxcli/commands/cc_agents.py +425 -0
- wxcli/commands/cc_ai_assistant.py +55 -0
- wxcli/commands/cc_ai_feature.py +294 -0
- wxcli/commands/cc_audio_files.py +149 -0
- wxcli/commands/cc_auto_csat.py +311 -0
- wxcli/commands/cc_aux_code.py +458 -0
- wxcli/commands/cc_business_hour.py +353 -0
- wxcli/commands/cc_call_monitoring.py +228 -0
- wxcli/commands/cc_callbacks.py +194 -0
- wxcli/commands/cc_campaign.py +212 -0
- wxcli/commands/cc_captures.py +39 -0
- wxcli/commands/cc_contact_list.py +169 -0
- wxcli/commands/cc_contact_number.py +295 -0
- wxcli/commands/cc_data_sources.py +235 -0
- wxcli/commands/cc_desktop_layout.py +380 -0
- wxcli/commands/cc_desktop_profile.py +322 -0
- wxcli/commands/cc_dial_number.py +511 -0
- wxcli/commands/cc_dial_plan.py +347 -0
- wxcli/commands/cc_dnc.py +101 -0
- wxcli/commands/cc_entry_point.py +545 -0
- wxcli/commands/cc_ewt.py +51 -0
- wxcli/commands/cc_flow.py +477 -0
- wxcli/commands/cc_global_vars.py +430 -0
- wxcli/commands/cc_holiday_list.py +335 -0
- wxcli/commands/cc_journey.py +1261 -0
- wxcli/commands/cc_legacy_flows.py +49 -0
- wxcli/commands/cc_multimedia_profile.py +436 -0
- wxcli/commands/cc_notification.py +51 -0
- wxcli/commands/cc_outdial_ani.py +604 -0
- wxcli/commands/cc_overrides.py +341 -0
- wxcli/commands/cc_queue.py +1083 -0
- wxcli/commands/cc_queue_stats.py +55 -0
- wxcli/commands/cc_realtime.py +51 -0
- wxcli/commands/cc_resource_collection.py +312 -0
- wxcli/commands/cc_search.py +46 -0
- wxcli/commands/cc_site.py +400 -0
- wxcli/commands/cc_skill.py +350 -0
- wxcli/commands/cc_skill_profile.py +289 -0
- wxcli/commands/cc_subscriptions.py +426 -0
- wxcli/commands/cc_summaries.py +130 -0
- wxcli/commands/cc_tasks.py +844 -0
- wxcli/commands/cc_team.py +325 -0
- wxcli/commands/cc_user_profiles.py +349 -0
- wxcli/commands/cc_users.py +701 -0
- wxcli/commands/cc_work_types.py +363 -0
- wxcli/commands/cdr.py +89 -0
- wxcli/commands/classifications.py +38 -0
- wxcli/commands/cleanup.py +1427 -0
- wxcli/commands/client_settings.py +72 -0
- wxcli/commands/conference.py +328 -0
- wxcli/commands/configure.py +72 -0
- wxcli/commands/converged_recordings.py +347 -0
- wxcli/commands/converged_recordings_export.py +310 -0
- wxcli/commands/cq_playlists.py +42 -0
- wxcli/commands/cucm.py +2794 -0
- wxcli/commands/cucm_config.py +129 -0
- wxcli/commands/customer_assist.py +373 -0
- wxcli/commands/data_sources.py +227 -0
- wxcli/commands/dect_devices.py +787 -0
- wxcli/commands/device_configurations.py +77 -0
- wxcli/commands/device_dynamic_settings.py +320 -0
- wxcli/commands/device_settings.py +1489 -0
- wxcli/commands/devices.py +280 -0
- wxcli/commands/domains.py +142 -0
- wxcli/commands/ecm.py +178 -0
- wxcli/commands/emergency_services.py +827 -0
- wxcli/commands/events.py +83 -0
- wxcli/commands/external_voicemail.py +52 -0
- wxcli/commands/groups.py +206 -0
- wxcli/commands/guest_management.py +76 -0
- wxcli/commands/hds.py +340 -0
- wxcli/commands/hot_desk.py +67 -0
- wxcli/commands/hot_desking_members.py +118 -0
- wxcli/commands/hot_desking_portal.py +124 -0
- wxcli/commands/hunt_group.py +577 -0
- wxcli/commands/hybrid_clusters.py +71 -0
- wxcli/commands/hybrid_connectors.py +67 -0
- wxcli/commands/identity_org.py +159 -0
- wxcli/commands/init_playbook.py +155 -0
- wxcli/commands/licenses.py +106 -0
- wxcli/commands/live_monitoring.py +40 -0
- wxcli/commands/location_call_handling.py +577 -0
- wxcli/commands/location_schedules.py +341 -0
- wxcli/commands/location_settings.py +1297 -0
- wxcli/commands/location_voicemail.py +494 -0
- wxcli/commands/locations.py +336 -0
- wxcli/commands/meeting_captions.py +110 -0
- wxcli/commands/meeting_chats.py +63 -0
- wxcli/commands/meeting_invitees.py +234 -0
- wxcli/commands/meeting_messages.py +28 -0
- wxcli/commands/meeting_participants.py +278 -0
- wxcli/commands/meeting_polls.py +111 -0
- wxcli/commands/meeting_preferences.py +515 -0
- wxcli/commands/meeting_qa.py +78 -0
- wxcli/commands/meeting_qualities.py +43 -0
- wxcli/commands/meeting_reports.py +101 -0
- wxcli/commands/meeting_session_types.py +105 -0
- wxcli/commands/meeting_site.py +57 -0
- wxcli/commands/meeting_slido.py +44 -0
- wxcli/commands/meeting_summaries.py +92 -0
- wxcli/commands/meeting_tracking_codes.py +233 -0
- wxcli/commands/meeting_transcripts.py +230 -0
- wxcli/commands/meetings.py +1997 -0
- wxcli/commands/memberships.py +164 -0
- wxcli/commands/messages.py +213 -0
- wxcli/commands/mode_management.py +244 -0
- wxcli/commands/my_call_settings.py +3577 -0
- wxcli/commands/numbers.py +405 -0
- wxcli/commands/operating_modes.py +410 -0
- wxcli/commands/org_contacts.py +284 -0
- wxcli/commands/org_health_cli.py +55 -0
- wxcli/commands/org_settings.py +71 -0
- wxcli/commands/organizations.py +83 -0
- wxcli/commands/paging_group.py +257 -0
- wxcli/commands/partner_admins.py +141 -0
- wxcli/commands/partner_reports.py +188 -0
- wxcli/commands/partner_tags.py +216 -0
- wxcli/commands/people.py +279 -0
- wxcli/commands/person_call_settings.py +71 -0
- wxcli/commands/pstn.py +280 -0
- wxcli/commands/recording_report.py +154 -0
- wxcli/commands/report_templates.py +38 -0
- wxcli/commands/reports.py +144 -0
- wxcli/commands/resource_group_memberships.py +160 -0
- wxcli/commands/resource_groups.py +67 -0
- wxcli/commands/roles.py +63 -0
- wxcli/commands/room_tabs.py +160 -0
- wxcli/commands/rooms.py +225 -0
- wxcli/commands/scim_bulk.py +46 -0
- wxcli/commands/scim_groups.py +246 -0
- wxcli/commands/scim_schemas.py +82 -0
- wxcli/commands/scim_users.py +283 -0
- wxcli/commands/security_audit.py +54 -0
- wxcli/commands/service_apps.py +51 -0
- wxcli/commands/single_number_reach.py +209 -0
- wxcli/commands/team_memberships.py +155 -0
- wxcli/commands/teams.py +153 -0
- wxcli/commands/ucm_profile.py +42 -0
- wxcli/commands/update.py +219 -0
- wxcli/commands/user_settings.py +5116 -0
- wxcli/commands/video_mesh.py +1090 -0
- wxcli/commands/virtual_extensions.py +502 -0
- wxcli/commands/virtual_line_settings.py +2072 -0
- wxcli/commands/webhooks.py +176 -0
- wxcli/commands/wholesale_billing_reports.py +147 -0
- wxcli/commands/wholesale_provisioning.py +523 -0
- wxcli/commands/workspace_locations.py +339 -0
- wxcli/commands/workspace_metrics.py +103 -0
- wxcli/commands/workspace_personalization.py +70 -0
- wxcli/commands/workspace_settings.py +3347 -0
- wxcli/commands/workspaces.py +279 -0
- wxcli/commands/xapi.py +114 -0
- wxcli/config.py +139 -0
- wxcli/errors.py +77 -0
- wxcli/main.py +210 -0
- wxcli/migration/CLAUDE.md +106 -0
- wxcli/migration/__init__.py +1 -0
- wxcli/migration/advisory/CLAUDE.md +196 -0
- wxcli/migration/advisory/__init__.py +46 -0
- wxcli/migration/advisory/advisor.py +107 -0
- wxcli/migration/advisory/advisory_patterns.py +2552 -0
- wxcli/migration/advisory/recommendation_rules.py +835 -0
- wxcli/migration/cucm/CLAUDE.md +74 -0
- wxcli/migration/cucm/__init__.py +5 -0
- wxcli/migration/cucm/connection.py +265 -0
- wxcli/migration/cucm/discovery.py +225 -0
- wxcli/migration/cucm/extractors/__init__.py +1 -0
- wxcli/migration/cucm/extractors/announcements.py +92 -0
- wxcli/migration/cucm/extractors/base.py +90 -0
- wxcli/migration/cucm/extractors/device_profiles.py +98 -0
- wxcli/migration/cucm/extractors/devices.py +193 -0
- wxcli/migration/cucm/extractors/e911.py +103 -0
- wxcli/migration/cucm/extractors/features.py +309 -0
- wxcli/migration/cucm/extractors/helpers.py +73 -0
- wxcli/migration/cucm/extractors/informational.py +295 -0
- wxcli/migration/cucm/extractors/locations.py +221 -0
- wxcli/migration/cucm/extractors/moh.py +100 -0
- wxcli/migration/cucm/extractors/remote_destinations.py +96 -0
- wxcli/migration/cucm/extractors/routing.py +493 -0
- wxcli/migration/cucm/extractors/shared_lines.py +146 -0
- wxcli/migration/cucm/extractors/templates.py +229 -0
- wxcli/migration/cucm/extractors/tier4.py +173 -0
- wxcli/migration/cucm/extractors/users.py +240 -0
- wxcli/migration/cucm/extractors/voicemail.py +243 -0
- wxcli/migration/cucm/extractors/workspaces.py +88 -0
- wxcli/migration/cucm/unity_connection.py +304 -0
- wxcli/migration/execute/CLAUDE.md +372 -0
- wxcli/migration/execute/__init__.py +303 -0
- wxcli/migration/execute/batch.py +277 -0
- wxcli/migration/execute/dependency.py +483 -0
- wxcli/migration/execute/engine.py +964 -0
- wxcli/migration/execute/handlers.py +2232 -0
- wxcli/migration/execute/planner.py +1939 -0
- wxcli/migration/execute/runtime.py +571 -0
- wxcli/migration/export/CLAUDE.md +49 -0
- wxcli/migration/export/__init__.py +8 -0
- wxcli/migration/export/csv_export.py +126 -0
- wxcli/migration/export/deployment_plan.py +479 -0
- wxcli/migration/export/json_export.py +60 -0
- wxcli/migration/models.py +941 -0
- wxcli/migration/phone_models.py +50 -0
- wxcli/migration/preflight/CLAUDE.md +52 -0
- wxcli/migration/preflight/__init__.py +89 -0
- wxcli/migration/preflight/checks.py +911 -0
- wxcli/migration/preflight/runner.py +293 -0
- wxcli/migration/rate_limiter.py +144 -0
- wxcli/migration/report/CLAUDE.md +245 -0
- wxcli/migration/report/__init__.py +7 -0
- wxcli/migration/report/appendix.py +2437 -0
- wxcli/migration/report/assembler.py +183 -0
- wxcli/migration/report/charts.py +263 -0
- wxcli/migration/report/executive.py +776 -0
- wxcli/migration/report/explainer.py +704 -0
- wxcli/migration/report/helpers.py +74 -0
- wxcli/migration/report/ingest.py +152 -0
- wxcli/migration/report/notice_templates.py +192 -0
- wxcli/migration/report/score.py +375 -0
- wxcli/migration/report/styles.py +1052 -0
- wxcli/migration/report/user_diff.py +1052 -0
- wxcli/migration/report/user_notice.py +425 -0
- wxcli/migration/state.py +139 -0
- wxcli/migration/store.py +860 -0
- wxcli/migration/transform/CLAUDE.md +107 -0
- wxcli/migration/transform/__init__.py +12 -0
- wxcli/migration/transform/analysis_pipeline.py +453 -0
- wxcli/migration/transform/analyzers/__init__.py +142 -0
- wxcli/migration/transform/analyzers/css_permission.py +189 -0
- wxcli/migration/transform/analyzers/css_routing.py +335 -0
- wxcli/migration/transform/analyzers/device_compatibility.py +122 -0
- wxcli/migration/transform/analyzers/dn_ambiguity.py +131 -0
- wxcli/migration/transform/analyzers/duplicate_user.py +221 -0
- wxcli/migration/transform/analyzers/extension_conflict.py +173 -0
- wxcli/migration/transform/analyzers/feature_approximation.py +227 -0
- wxcli/migration/transform/analyzers/layout_overflow.py +174 -0
- wxcli/migration/transform/analyzers/location_ambiguity.py +184 -0
- wxcli/migration/transform/analyzers/missing_data.py +300 -0
- wxcli/migration/transform/analyzers/selective_call_handling.py +394 -0
- wxcli/migration/transform/analyzers/shared_line.py +170 -0
- wxcli/migration/transform/analyzers/voicemail_compatibility.py +267 -0
- wxcli/migration/transform/analyzers/workspace_license.py +212 -0
- wxcli/migration/transform/cross_reference.py +1136 -0
- wxcli/migration/transform/cucm_pattern.py +246 -0
- wxcli/migration/transform/decisions.py +301 -0
- wxcli/migration/transform/e164.py +145 -0
- wxcli/migration/transform/engine.py +256 -0
- wxcli/migration/transform/mappers/CLAUDE.md +123 -0
- wxcli/migration/transform/mappers/__init__.py +76 -0
- wxcli/migration/transform/mappers/announcement_mapper.py +122 -0
- wxcli/migration/transform/mappers/base.py +190 -0
- wxcli/migration/transform/mappers/button_template_mapper.py +186 -0
- wxcli/migration/transform/mappers/call_forwarding_mapper.py +228 -0
- wxcli/migration/transform/mappers/call_settings_mapper.py +144 -0
- wxcli/migration/transform/mappers/css_mapper.py +868 -0
- wxcli/migration/transform/mappers/dect_mapper.py +367 -0
- wxcli/migration/transform/mappers/device_layout_mapper.py +289 -0
- wxcli/migration/transform/mappers/device_mapper.py +227 -0
- wxcli/migration/transform/mappers/device_profile_mapper.py +190 -0
- wxcli/migration/transform/mappers/device_settings_mapper.py +464 -0
- wxcli/migration/transform/mappers/e911_mapper.py +129 -0
- wxcli/migration/transform/mappers/ecbn_mapper.py +263 -0
- wxcli/migration/transform/mappers/executive_assistant_mapper.py +156 -0
- wxcli/migration/transform/mappers/feature_mapper.py +1179 -0
- wxcli/migration/transform/mappers/line_mapper.py +310 -0
- wxcli/migration/transform/mappers/location_mapper.py +235 -0
- wxcli/migration/transform/mappers/moh_mapper.py +114 -0
- wxcli/migration/transform/mappers/monitoring_mapper.py +221 -0
- wxcli/migration/transform/mappers/receptionist_mapper.py +245 -0
- wxcli/migration/transform/mappers/routing_mapper.py +821 -0
- wxcli/migration/transform/mappers/snr_mapper.py +201 -0
- wxcli/migration/transform/mappers/softkey_mapper.py +205 -0
- wxcli/migration/transform/mappers/user_mapper.py +264 -0
- wxcli/migration/transform/mappers/voicemail_group_mapper.py +286 -0
- wxcli/migration/transform/mappers/voicemail_mapper.py +514 -0
- wxcli/migration/transform/mappers/workspace_mapper.py +464 -0
- wxcli/migration/transform/normalizers.py +2008 -0
- wxcli/migration/transform/pattern_converter.py +106 -0
- wxcli/migration/transform/pipeline.py +271 -0
- wxcli/migration/transform/rules.py +255 -0
- wxcli/org_health/CLAUDE.md +63 -0
- wxcli/org_health/__init__.py +7 -0
- wxcli/org_health/analyze.py +93 -0
- wxcli/org_health/checks.py +458 -0
- wxcli/org_health/collector.py +62 -0
- wxcli/org_health/models.py +78 -0
- wxcli/org_health/report.py +300 -0
- wxcli/output.py +101 -0
- wxcli-1.2.0.dist-info/METADATA +505 -0
- wxcli-1.2.0.dist-info/RECORD +413 -0
- wxcli-1.2.0.dist-info/WHEEL +5 -0
- wxcli-1.2.0.dist-info/entry_points.txt +2 -0
- wxcli-1.2.0.dist-info/licenses/LICENSE +191 -0
- wxcli-1.2.0.dist-info/scm_file_list.json +751 -0
- wxcli-1.2.0.dist-info/scm_version.json +8 -0
- wxcli-1.2.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,426 @@
|
|
|
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 get_org_id, get_cc_base_url, get_cc_org_id
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
app = typer.Typer(help="Manage Webex Contact Center cc-subscriptions.")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@app.command("list")
|
|
13
|
+
def cmd_list(
|
|
14
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
15
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
16
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
17
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
18
|
+
):
|
|
19
|
+
"""List Subscriptions."""
|
|
20
|
+
api = get_api(debug=debug)
|
|
21
|
+
cc_base_url = get_cc_base_url()
|
|
22
|
+
url = f"{cc_base_url}/subscriptions"
|
|
23
|
+
params = {}
|
|
24
|
+
if limit > 0:
|
|
25
|
+
params["max"] = limit
|
|
26
|
+
if offset > 0:
|
|
27
|
+
params["start"] = offset
|
|
28
|
+
org_id = get_org_id()
|
|
29
|
+
if org_id is not None:
|
|
30
|
+
params["orgId"] = org_id
|
|
31
|
+
result = None
|
|
32
|
+
try:
|
|
33
|
+
result = api.session.rest_get(url, params=params)
|
|
34
|
+
except WebexError as e:
|
|
35
|
+
handle_rest_error(e)
|
|
36
|
+
result = result or []
|
|
37
|
+
items = result.get("data", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
38
|
+
if output == "json":
|
|
39
|
+
print_json(items)
|
|
40
|
+
else:
|
|
41
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@app.command("create")
|
|
46
|
+
def create(
|
|
47
|
+
name: str = typer.Option(None, "--name", help="(required) Client-defined string naming the subscription."),
|
|
48
|
+
description: str = typer.Option(None, "--description", help="Client-defined string describing the subscription."),
|
|
49
|
+
destination_url: str = typer.Option(None, "--destination-url", help="(required) URL to which webhooks will be posted. Must be HTTPS on an IA"),
|
|
50
|
+
secret: str = typer.Option(None, "--secret", help="Secret string used to sign payloads sent to the destination"),
|
|
51
|
+
org_id: str = typer.Option(None, "--org-id", help="Organization ID to be used for this operation. If unspecifie"),
|
|
52
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
53
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
54
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
55
|
+
):
|
|
56
|
+
"""Register Subscription\n\nExample --json-body:\n '{"name":"...","eventTypes":["..."],"destinationUrl":"...","description":"...","secret":"...","orgId":"..."}'."""
|
|
57
|
+
api = get_api(debug=debug)
|
|
58
|
+
cc_base_url = get_cc_base_url()
|
|
59
|
+
url = f"{cc_base_url}/subscriptions"
|
|
60
|
+
if json_body:
|
|
61
|
+
body = json.loads(json_body)
|
|
62
|
+
else:
|
|
63
|
+
body = {}
|
|
64
|
+
if name is not None:
|
|
65
|
+
body["name"] = name
|
|
66
|
+
if description is not None:
|
|
67
|
+
body["description"] = description
|
|
68
|
+
if destination_url is not None:
|
|
69
|
+
body["destinationUrl"] = destination_url
|
|
70
|
+
if secret is not None:
|
|
71
|
+
body["secret"] = secret
|
|
72
|
+
if org_id is not None:
|
|
73
|
+
body["orgId"] = org_id
|
|
74
|
+
_missing = [f for f in ['name', 'destinationUrl'] if f not in body or body[f] is None]
|
|
75
|
+
if _missing:
|
|
76
|
+
typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
|
|
77
|
+
raise typer.Exit(1)
|
|
78
|
+
try:
|
|
79
|
+
result = api.session.rest_post(url, json=body)
|
|
80
|
+
except WebexError as e:
|
|
81
|
+
handle_rest_error(e)
|
|
82
|
+
if output == "json":
|
|
83
|
+
print_json(result)
|
|
84
|
+
elif isinstance(result, dict) and "id" in result:
|
|
85
|
+
typer.echo(f"Created: {result['id']}")
|
|
86
|
+
elif not result or result == {}:
|
|
87
|
+
typer.echo("Created.")
|
|
88
|
+
else:
|
|
89
|
+
print_json(result)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@app.command("show")
|
|
94
|
+
def show(
|
|
95
|
+
id: str = typer.Argument(help="id"),
|
|
96
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
97
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
98
|
+
):
|
|
99
|
+
"""Get Subscription."""
|
|
100
|
+
api = get_api(debug=debug)
|
|
101
|
+
cc_base_url = get_cc_base_url()
|
|
102
|
+
url = f"{cc_base_url}/subscriptions/{id}"
|
|
103
|
+
params = {}
|
|
104
|
+
org_id = get_org_id()
|
|
105
|
+
if org_id is not None:
|
|
106
|
+
params["orgId"] = org_id
|
|
107
|
+
try:
|
|
108
|
+
result = api.session.rest_get(url, params=params)
|
|
109
|
+
except WebexError as e:
|
|
110
|
+
handle_rest_error(e)
|
|
111
|
+
if output == "json":
|
|
112
|
+
print_json(result)
|
|
113
|
+
else:
|
|
114
|
+
if isinstance(result, dict):
|
|
115
|
+
print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
|
|
116
|
+
elif isinstance(result, list):
|
|
117
|
+
print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
|
|
118
|
+
else:
|
|
119
|
+
print_json(result)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
@app.command("update")
|
|
124
|
+
def update(
|
|
125
|
+
id: str = typer.Argument(help="id"),
|
|
126
|
+
description: str = typer.Option(None, "--description", help="Client-defined string describing the subscription."),
|
|
127
|
+
destination_url: str = typer.Option(None, "--destination-url", help="URL to which webhooks will be posted. Must be HTTPS on an IA"),
|
|
128
|
+
status: str = typer.Option(None, "--status", help="Choices: active, inactive"),
|
|
129
|
+
secret: str = typer.Option(None, "--secret", help="Secret string used to sign payloads sent to the destination"),
|
|
130
|
+
org_id: str = typer.Option(None, "--org-id", help="Organization ID to be used for this operation. If unspecifie"),
|
|
131
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
132
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
133
|
+
):
|
|
134
|
+
"""Update Subscription\n\nExample --json-body:\n '{"description":"...","eventTypes":["..."],"destinationUrl":"...","status":"active","secret":"...","orgId":"..."}'."""
|
|
135
|
+
api = get_api(debug=debug)
|
|
136
|
+
cc_base_url = get_cc_base_url()
|
|
137
|
+
url = f"{cc_base_url}/subscriptions/{id}"
|
|
138
|
+
if json_body:
|
|
139
|
+
body = json.loads(json_body)
|
|
140
|
+
else:
|
|
141
|
+
body = {}
|
|
142
|
+
if description is not None:
|
|
143
|
+
body["description"] = description
|
|
144
|
+
if destination_url is not None:
|
|
145
|
+
body["destinationUrl"] = destination_url
|
|
146
|
+
if status is not None:
|
|
147
|
+
body["status"] = status
|
|
148
|
+
if secret is not None:
|
|
149
|
+
body["secret"] = secret
|
|
150
|
+
if org_id is not None:
|
|
151
|
+
body["orgId"] = org_id
|
|
152
|
+
try:
|
|
153
|
+
result = api.session.rest_patch(url, json=body)
|
|
154
|
+
except WebexError as e:
|
|
155
|
+
handle_rest_error(e)
|
|
156
|
+
typer.echo(f"Updated.")
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
@app.command("delete")
|
|
161
|
+
def delete(
|
|
162
|
+
id: str = typer.Argument(help="id"),
|
|
163
|
+
force: bool = typer.Option(False, "--force", help="Skip confirmation"),
|
|
164
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
165
|
+
):
|
|
166
|
+
"""Delete Subscription."""
|
|
167
|
+
if not force:
|
|
168
|
+
typer.confirm(f"Delete {id}?", abort=True)
|
|
169
|
+
api = get_api(debug=debug)
|
|
170
|
+
cc_base_url = get_cc_base_url()
|
|
171
|
+
url = f"{cc_base_url}/subscriptions/{id}"
|
|
172
|
+
params = {}
|
|
173
|
+
org_id = get_org_id()
|
|
174
|
+
if org_id is not None:
|
|
175
|
+
params["orgId"] = org_id
|
|
176
|
+
try:
|
|
177
|
+
api.session.rest_delete(url, params=params)
|
|
178
|
+
except WebexError as e:
|
|
179
|
+
handle_rest_error(e)
|
|
180
|
+
typer.echo(f"Deleted: {id}")
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
@app.command("list-event-types-v1")
|
|
185
|
+
def list_event_types_v1(
|
|
186
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
187
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
188
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
189
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
190
|
+
):
|
|
191
|
+
"""List Event Types."""
|
|
192
|
+
api = get_api(debug=debug)
|
|
193
|
+
cc_base_url = get_cc_base_url()
|
|
194
|
+
url = f"{cc_base_url}/event-types"
|
|
195
|
+
params = {}
|
|
196
|
+
if limit > 0:
|
|
197
|
+
params["max"] = limit
|
|
198
|
+
if offset > 0:
|
|
199
|
+
params["start"] = offset
|
|
200
|
+
org_id = get_org_id()
|
|
201
|
+
if org_id is not None:
|
|
202
|
+
params["orgId"] = org_id
|
|
203
|
+
result = None
|
|
204
|
+
try:
|
|
205
|
+
result = api.session.rest_get(url, params=params)
|
|
206
|
+
except WebexError as e:
|
|
207
|
+
handle_rest_error(e)
|
|
208
|
+
result = result or []
|
|
209
|
+
items = result.get("data", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
210
|
+
if output == "json":
|
|
211
|
+
print_json(items)
|
|
212
|
+
else:
|
|
213
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
@app.command("list-subscriptions")
|
|
218
|
+
def list_subscriptions(
|
|
219
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
220
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
221
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
222
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
223
|
+
):
|
|
224
|
+
"""List Subscriptions."""
|
|
225
|
+
api = get_api(debug=debug)
|
|
226
|
+
cc_base_url = get_cc_base_url()
|
|
227
|
+
url = f"{cc_base_url}/v2/subscriptions"
|
|
228
|
+
params = {}
|
|
229
|
+
if limit > 0:
|
|
230
|
+
params["max"] = limit
|
|
231
|
+
if offset > 0:
|
|
232
|
+
params["start"] = offset
|
|
233
|
+
org_id = get_org_id()
|
|
234
|
+
if org_id is not None:
|
|
235
|
+
params["orgId"] = org_id
|
|
236
|
+
result = None
|
|
237
|
+
try:
|
|
238
|
+
result = api.session.rest_get(url, params=params)
|
|
239
|
+
except WebexError as e:
|
|
240
|
+
handle_rest_error(e)
|
|
241
|
+
result = result or []
|
|
242
|
+
items = result.get("data", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
243
|
+
if output == "json":
|
|
244
|
+
print_json(items)
|
|
245
|
+
else:
|
|
246
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
@app.command("create-subscriptions")
|
|
251
|
+
def create_subscriptions(
|
|
252
|
+
name: str = typer.Option(None, "--name", help="(required) Client-defined string naming the subscription."),
|
|
253
|
+
description: str = typer.Option(None, "--description", help="Client-defined string describing the subscription."),
|
|
254
|
+
destination_url: str = typer.Option(None, "--destination-url", help="(required) URL to which webhooks will be posted. Must be HTTPS on an IA"),
|
|
255
|
+
secret: str = typer.Option(None, "--secret", help="Secret string used to sign payloads sent to the destination"),
|
|
256
|
+
org_id: str = typer.Option(None, "--org-id", help="Organization ID to be used for this operation. If unspecifie"),
|
|
257
|
+
resource_version: str = typer.Option(None, "--resource-version", help="(required) Represents version of the resource client is interested in."),
|
|
258
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
259
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
260
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
261
|
+
):
|
|
262
|
+
"""Register Subscription\n\nExample --json-body:\n '{"name":"...","eventTypes":["..."],"destinationUrl":"...","resourceVersion":"...","description":"...","secret":"...","orgId":"..."}'."""
|
|
263
|
+
api = get_api(debug=debug)
|
|
264
|
+
cc_base_url = get_cc_base_url()
|
|
265
|
+
url = f"{cc_base_url}/v2/subscriptions"
|
|
266
|
+
if json_body:
|
|
267
|
+
body = json.loads(json_body)
|
|
268
|
+
else:
|
|
269
|
+
body = {}
|
|
270
|
+
if name is not None:
|
|
271
|
+
body["name"] = name
|
|
272
|
+
if description is not None:
|
|
273
|
+
body["description"] = description
|
|
274
|
+
if destination_url is not None:
|
|
275
|
+
body["destinationUrl"] = destination_url
|
|
276
|
+
if secret is not None:
|
|
277
|
+
body["secret"] = secret
|
|
278
|
+
if org_id is not None:
|
|
279
|
+
body["orgId"] = org_id
|
|
280
|
+
if resource_version is not None:
|
|
281
|
+
body["resourceVersion"] = resource_version
|
|
282
|
+
_missing = [f for f in ['name', 'destinationUrl', 'resourceVersion'] if f not in body or body[f] is None]
|
|
283
|
+
if _missing:
|
|
284
|
+
typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
|
|
285
|
+
raise typer.Exit(1)
|
|
286
|
+
try:
|
|
287
|
+
result = api.session.rest_post(url, json=body)
|
|
288
|
+
except WebexError as e:
|
|
289
|
+
handle_rest_error(e)
|
|
290
|
+
if output == "json":
|
|
291
|
+
print_json(result)
|
|
292
|
+
elif isinstance(result, dict) and "id" in result:
|
|
293
|
+
typer.echo(f"Created: {result['id']}")
|
|
294
|
+
elif not result or result == {}:
|
|
295
|
+
typer.echo("Created.")
|
|
296
|
+
else:
|
|
297
|
+
print_json(result)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
@app.command("show-subscriptions")
|
|
302
|
+
def show_subscriptions(
|
|
303
|
+
id: str = typer.Argument(help="id"),
|
|
304
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
305
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
306
|
+
):
|
|
307
|
+
"""Get Subscription."""
|
|
308
|
+
api = get_api(debug=debug)
|
|
309
|
+
cc_base_url = get_cc_base_url()
|
|
310
|
+
url = f"{cc_base_url}/v2/subscriptions/{id}"
|
|
311
|
+
params = {}
|
|
312
|
+
org_id = get_org_id()
|
|
313
|
+
if org_id is not None:
|
|
314
|
+
params["orgId"] = org_id
|
|
315
|
+
try:
|
|
316
|
+
result = api.session.rest_get(url, params=params)
|
|
317
|
+
except WebexError as e:
|
|
318
|
+
handle_rest_error(e)
|
|
319
|
+
if output == "json":
|
|
320
|
+
print_json(result)
|
|
321
|
+
else:
|
|
322
|
+
if isinstance(result, dict):
|
|
323
|
+
print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
|
|
324
|
+
elif isinstance(result, list):
|
|
325
|
+
print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
|
|
326
|
+
else:
|
|
327
|
+
print_json(result)
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
@app.command("update-subscriptions")
|
|
332
|
+
def update_subscriptions(
|
|
333
|
+
id: str = typer.Argument(help="id"),
|
|
334
|
+
description: str = typer.Option(None, "--description", help="Client-defined string describing the subscription."),
|
|
335
|
+
destination_url: str = typer.Option(None, "--destination-url", help="URL to which webhooks will be posted. Must be HTTPS on an IA"),
|
|
336
|
+
status: str = typer.Option(None, "--status", help="Choices: active, inactive"),
|
|
337
|
+
secret: str = typer.Option(None, "--secret", help="Secret string used to sign payloads sent to the destination"),
|
|
338
|
+
org_id: str = typer.Option(None, "--org-id", help="Organization ID to be used for this operation. If unspecifie"),
|
|
339
|
+
resource_version: str = typer.Option(None, "--resource-version", help="Represents version of the resource client is interested in."),
|
|
340
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
341
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
342
|
+
):
|
|
343
|
+
"""Update Subscription\n\nExample --json-body:\n '{"resourceVersion":"...","description":"...","eventTypes":["..."],"destinationUrl":"...","status":"active","secret":"...","orgId":"..."}'."""
|
|
344
|
+
api = get_api(debug=debug)
|
|
345
|
+
cc_base_url = get_cc_base_url()
|
|
346
|
+
url = f"{cc_base_url}/v2/subscriptions/{id}"
|
|
347
|
+
if json_body:
|
|
348
|
+
body = json.loads(json_body)
|
|
349
|
+
else:
|
|
350
|
+
body = {}
|
|
351
|
+
if description is not None:
|
|
352
|
+
body["description"] = description
|
|
353
|
+
if destination_url is not None:
|
|
354
|
+
body["destinationUrl"] = destination_url
|
|
355
|
+
if status is not None:
|
|
356
|
+
body["status"] = status
|
|
357
|
+
if secret is not None:
|
|
358
|
+
body["secret"] = secret
|
|
359
|
+
if org_id is not None:
|
|
360
|
+
body["orgId"] = org_id
|
|
361
|
+
if resource_version is not None:
|
|
362
|
+
body["resourceVersion"] = resource_version
|
|
363
|
+
try:
|
|
364
|
+
result = api.session.rest_patch(url, json=body)
|
|
365
|
+
except WebexError as e:
|
|
366
|
+
handle_rest_error(e)
|
|
367
|
+
typer.echo(f"Updated.")
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
@app.command("delete-subscriptions")
|
|
372
|
+
def delete_subscriptions(
|
|
373
|
+
id: str = typer.Argument(help="id"),
|
|
374
|
+
force: bool = typer.Option(False, "--force", help="Skip confirmation"),
|
|
375
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
376
|
+
):
|
|
377
|
+
"""Delete Subscription."""
|
|
378
|
+
if not force:
|
|
379
|
+
typer.confirm(f"Delete {id}?", abort=True)
|
|
380
|
+
api = get_api(debug=debug)
|
|
381
|
+
cc_base_url = get_cc_base_url()
|
|
382
|
+
url = f"{cc_base_url}/v2/subscriptions/{id}"
|
|
383
|
+
params = {}
|
|
384
|
+
org_id = get_org_id()
|
|
385
|
+
if org_id is not None:
|
|
386
|
+
params["orgId"] = org_id
|
|
387
|
+
try:
|
|
388
|
+
api.session.rest_delete(url, params=params)
|
|
389
|
+
except WebexError as e:
|
|
390
|
+
handle_rest_error(e)
|
|
391
|
+
typer.echo(f"Deleted: {id}")
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
@app.command("list-event-types-v2")
|
|
396
|
+
def list_event_types_v2(
|
|
397
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
398
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
399
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
400
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
401
|
+
):
|
|
402
|
+
"""List Event Types."""
|
|
403
|
+
api = get_api(debug=debug)
|
|
404
|
+
cc_base_url = get_cc_base_url()
|
|
405
|
+
url = f"{cc_base_url}/v2/event-types"
|
|
406
|
+
params = {}
|
|
407
|
+
if limit > 0:
|
|
408
|
+
params["max"] = limit
|
|
409
|
+
if offset > 0:
|
|
410
|
+
params["start"] = offset
|
|
411
|
+
org_id = get_org_id()
|
|
412
|
+
if org_id is not None:
|
|
413
|
+
params["orgId"] = org_id
|
|
414
|
+
result = None
|
|
415
|
+
try:
|
|
416
|
+
result = api.session.rest_get(url, params=params)
|
|
417
|
+
except WebexError as e:
|
|
418
|
+
handle_rest_error(e)
|
|
419
|
+
result = result or []
|
|
420
|
+
items = result.get("data", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
421
|
+
if output == "json":
|
|
422
|
+
print_json(items)
|
|
423
|
+
else:
|
|
424
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
425
|
+
|
|
426
|
+
|
|
@@ -0,0 +1,130 @@
|
|
|
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-summaries.")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@app.command("show")
|
|
13
|
+
def show(
|
|
14
|
+
id: str = typer.Argument(help="id"),
|
|
15
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
16
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
17
|
+
):
|
|
18
|
+
"""Get specific Generated Summaries resource by ID."""
|
|
19
|
+
api = get_api(debug=debug)
|
|
20
|
+
cc_base_url = get_cc_base_url()
|
|
21
|
+
orgid = get_cc_org_id(api.session)
|
|
22
|
+
url = f"{cc_base_url}/organization/{orgid}/generated-summaries/{id}"
|
|
23
|
+
try:
|
|
24
|
+
result = api.session.rest_get(url)
|
|
25
|
+
except WebexError as e:
|
|
26
|
+
handle_rest_error(e)
|
|
27
|
+
if output == "json":
|
|
28
|
+
print_json(result)
|
|
29
|
+
else:
|
|
30
|
+
if isinstance(result, dict):
|
|
31
|
+
print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
|
|
32
|
+
elif isinstance(result, list):
|
|
33
|
+
print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
|
|
34
|
+
else:
|
|
35
|
+
print_json(result)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@app.command("update")
|
|
40
|
+
def update(
|
|
41
|
+
id: str = typer.Argument(help="id"),
|
|
42
|
+
organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. This field is require"),
|
|
43
|
+
id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
|
|
44
|
+
version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
|
|
45
|
+
call_drop_summaries_enabled: bool = typer.Option(None, "--call-drop-summaries-enabled/--no-call-drop-summaries-enabled", help="Used to toggle the enable/disable call drop summaries for Ge"),
|
|
46
|
+
virtual_agent_transfer_summaries_enabled: bool = typer.Option(None, "--virtual-agent-transfer-summaries-enabled/--no-virtual-agent-transfer-summaries-enabled", help="Used to toggle the enable/disable virtual agent transfer sum"),
|
|
47
|
+
consult_transfer_summaries_enabled: bool = typer.Option(None, "--consult-transfer-summaries-enabled/--no-consult-transfer-summaries-enabled", help="Used to toggle the enable/disable mid call consult/transfer"),
|
|
48
|
+
agent_inclusion_type: str = typer.Option(None, "--agent-inclusion-type", help="Choices: ALL, SPECIFIC"),
|
|
49
|
+
created_time: str = typer.Option(None, "--created-time", help="This is the created time of the entity."),
|
|
50
|
+
last_updated_time: str = typer.Option(None, "--last-updated-time", help="This is the updated time of the entity."),
|
|
51
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
52
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
53
|
+
):
|
|
54
|
+
"""Update specific Generated Summaries resource by ID."""
|
|
55
|
+
api = get_api(debug=debug)
|
|
56
|
+
cc_base_url = get_cc_base_url()
|
|
57
|
+
orgid = get_cc_org_id(api.session)
|
|
58
|
+
url = f"{cc_base_url}/organization/{orgid}/generated-summaries/{id}"
|
|
59
|
+
if json_body:
|
|
60
|
+
body = json.loads(json_body)
|
|
61
|
+
else:
|
|
62
|
+
body = {}
|
|
63
|
+
if organization_id is not None:
|
|
64
|
+
body["organizationId"] = organization_id
|
|
65
|
+
if id_param is not None:
|
|
66
|
+
body["id"] = id_param
|
|
67
|
+
if version is not None:
|
|
68
|
+
body["version"] = version
|
|
69
|
+
if call_drop_summaries_enabled is not None:
|
|
70
|
+
body["callDropSummariesEnabled"] = call_drop_summaries_enabled
|
|
71
|
+
if virtual_agent_transfer_summaries_enabled is not None:
|
|
72
|
+
body["virtualAgentTransferSummariesEnabled"] = virtual_agent_transfer_summaries_enabled
|
|
73
|
+
if consult_transfer_summaries_enabled is not None:
|
|
74
|
+
body["consultTransferSummariesEnabled"] = consult_transfer_summaries_enabled
|
|
75
|
+
if agent_inclusion_type is not None:
|
|
76
|
+
body["agentInclusionType"] = agent_inclusion_type
|
|
77
|
+
if created_time is not None:
|
|
78
|
+
body["createdTime"] = created_time
|
|
79
|
+
if last_updated_time is not None:
|
|
80
|
+
body["lastUpdatedTime"] = last_updated_time
|
|
81
|
+
try:
|
|
82
|
+
result = api.session.rest_put(url, json=body)
|
|
83
|
+
except WebexError as e:
|
|
84
|
+
handle_rest_error(e)
|
|
85
|
+
typer.echo(f"Updated.")
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@app.command("list")
|
|
90
|
+
def cmd_list(
|
|
91
|
+
filter_param: str = typer.Option(None, "--filter", help="Specify a filter based on which the results will be fetched."),
|
|
92
|
+
attributes: str = typer.Option(None, "--attributes", help="Specify the attributes to be returned. By default, all attri"),
|
|
93
|
+
page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
|
|
94
|
+
page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
|
|
95
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
96
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
97
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
98
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
99
|
+
):
|
|
100
|
+
"""List Generated Summaries resource(s)."""
|
|
101
|
+
api = get_api(debug=debug)
|
|
102
|
+
cc_base_url = get_cc_base_url()
|
|
103
|
+
orgid = get_cc_org_id(api.session)
|
|
104
|
+
url = f"{cc_base_url}/organization/{orgid}/v2/generated-summaries"
|
|
105
|
+
params = {}
|
|
106
|
+
if filter_param is not None:
|
|
107
|
+
params["filter"] = filter_param
|
|
108
|
+
if attributes is not None:
|
|
109
|
+
params["attributes"] = attributes
|
|
110
|
+
if page is not None:
|
|
111
|
+
params["page"] = page
|
|
112
|
+
if page_size is not None:
|
|
113
|
+
params["pageSize"] = page_size
|
|
114
|
+
if limit > 0:
|
|
115
|
+
params["max"] = limit
|
|
116
|
+
if offset > 0:
|
|
117
|
+
params["start"] = offset
|
|
118
|
+
result = None
|
|
119
|
+
try:
|
|
120
|
+
result = api.session.rest_get(url, params=params)
|
|
121
|
+
except WebexError as e:
|
|
122
|
+
handle_rest_error(e)
|
|
123
|
+
result = result or []
|
|
124
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
125
|
+
if output == "json":
|
|
126
|
+
print_json(items)
|
|
127
|
+
else:
|
|
128
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
129
|
+
|
|
130
|
+
|