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,353 @@
|
|
|
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-business-hour.")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@app.command("list")
|
|
13
|
+
def cmd_list(
|
|
14
|
+
filter_param: str = typer.Option(None, "--filter", help="Specify a filter based on which the results will be fetched."),
|
|
15
|
+
attributes: str = typer.Option(None, "--attributes", help="Specify the attributes to be returned. By default, all attri"),
|
|
16
|
+
page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
|
|
17
|
+
page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
|
|
18
|
+
single_object_response: str = typer.Option(None, "--single-object-response", help="Specify whether to include array fields in the response. Thi"),
|
|
19
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
20
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
21
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
22
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
23
|
+
):
|
|
24
|
+
"""List Business Hours resources."""
|
|
25
|
+
api = get_api(debug=debug)
|
|
26
|
+
cc_base_url = get_cc_base_url()
|
|
27
|
+
orgid = get_cc_org_id(api.session)
|
|
28
|
+
url = f"{cc_base_url}/organization/{orgid}/business-hours"
|
|
29
|
+
params = {}
|
|
30
|
+
if filter_param is not None:
|
|
31
|
+
params["filter"] = filter_param
|
|
32
|
+
if attributes is not None:
|
|
33
|
+
params["attributes"] = attributes
|
|
34
|
+
if page is not None:
|
|
35
|
+
params["page"] = page
|
|
36
|
+
if page_size is not None:
|
|
37
|
+
params["pageSize"] = page_size
|
|
38
|
+
if single_object_response is not None:
|
|
39
|
+
params["singleObjectResponse"] = single_object_response
|
|
40
|
+
if limit > 0:
|
|
41
|
+
params["max"] = limit
|
|
42
|
+
if offset > 0:
|
|
43
|
+
params["start"] = offset
|
|
44
|
+
result = None
|
|
45
|
+
try:
|
|
46
|
+
result = api.session.rest_get(url, params=params)
|
|
47
|
+
except WebexError as e:
|
|
48
|
+
handle_rest_error(e)
|
|
49
|
+
result = result or []
|
|
50
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
51
|
+
if output == "json":
|
|
52
|
+
print_json(items)
|
|
53
|
+
else:
|
|
54
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@app.command("create")
|
|
59
|
+
def create(
|
|
60
|
+
organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. This field is require"),
|
|
61
|
+
id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
|
|
62
|
+
version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
|
|
63
|
+
name: str = typer.Option(None, "--name", help="(required) Enter a name for the agent profile."),
|
|
64
|
+
description: str = typer.Option(None, "--description", help="(Optional) Enter a description of the profile."),
|
|
65
|
+
timezone: str = typer.Option(None, "--timezone", help="(required) The time zone that you provision for your business hour."),
|
|
66
|
+
holidays_id: str = typer.Option(None, "--holidays-id", help="Holidays Id."),
|
|
67
|
+
overrides_id: str = typer.Option(None, "--overrides-id", help="Overrides Id."),
|
|
68
|
+
working_hours_count: str = typer.Option(None, "--working-hours-count", help="Working Hours Count."),
|
|
69
|
+
created_time: str = typer.Option(None, "--created-time", help="This is the created time of the entity."),
|
|
70
|
+
last_updated_time: str = typer.Option(None, "--last-updated-time", help="This is the updated time of the entity."),
|
|
71
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
72
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
73
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
74
|
+
):
|
|
75
|
+
"""Create a new Business Hours resource\n\nExample --json-body:\n '{"name":"...","timezone":"...","workingHours":[{"name":"...","days":"...","startTime":"...","endTime":"..."}],"organizationId":"...","id":"...","version":0,"description":"...","holidaysId":"..."}'."""
|
|
76
|
+
api = get_api(debug=debug)
|
|
77
|
+
cc_base_url = get_cc_base_url()
|
|
78
|
+
orgid = get_cc_org_id(api.session)
|
|
79
|
+
url = f"{cc_base_url}/organization/{orgid}/business-hours"
|
|
80
|
+
if json_body:
|
|
81
|
+
body = json.loads(json_body)
|
|
82
|
+
else:
|
|
83
|
+
body = {}
|
|
84
|
+
if organization_id is not None:
|
|
85
|
+
body["organizationId"] = organization_id
|
|
86
|
+
if id_param is not None:
|
|
87
|
+
body["id"] = id_param
|
|
88
|
+
if version is not None:
|
|
89
|
+
body["version"] = version
|
|
90
|
+
if name is not None:
|
|
91
|
+
body["name"] = name
|
|
92
|
+
if description is not None:
|
|
93
|
+
body["description"] = description
|
|
94
|
+
if timezone is not None:
|
|
95
|
+
body["timezone"] = timezone
|
|
96
|
+
if holidays_id is not None:
|
|
97
|
+
body["holidaysId"] = holidays_id
|
|
98
|
+
if overrides_id is not None:
|
|
99
|
+
body["overridesId"] = overrides_id
|
|
100
|
+
if working_hours_count is not None:
|
|
101
|
+
body["workingHoursCount"] = working_hours_count
|
|
102
|
+
if created_time is not None:
|
|
103
|
+
body["createdTime"] = created_time
|
|
104
|
+
if last_updated_time is not None:
|
|
105
|
+
body["lastUpdatedTime"] = last_updated_time
|
|
106
|
+
_missing = [f for f in ['name', 'timezone'] if f not in body or body[f] is None]
|
|
107
|
+
if _missing:
|
|
108
|
+
typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
|
|
109
|
+
raise typer.Exit(1)
|
|
110
|
+
try:
|
|
111
|
+
result = api.session.rest_post(url, json=body)
|
|
112
|
+
except WebexError as e:
|
|
113
|
+
handle_rest_error(e)
|
|
114
|
+
if output == "json":
|
|
115
|
+
print_json(result)
|
|
116
|
+
elif isinstance(result, dict) and "id" in result:
|
|
117
|
+
typer.echo(f"Created: {result['id']}")
|
|
118
|
+
elif not result or result == {}:
|
|
119
|
+
typer.echo("Created.")
|
|
120
|
+
else:
|
|
121
|
+
print_json(result)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
@app.command("create-bulk")
|
|
126
|
+
def create_bulk(
|
|
127
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
128
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
129
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
130
|
+
):
|
|
131
|
+
"""Bulk save Business Hours resources\n\nExample --json-body:\n '{"items":[{"itemIdentifier":"...","item":"...","requestAction":"..."}]}'."""
|
|
132
|
+
api = get_api(debug=debug)
|
|
133
|
+
cc_base_url = get_cc_base_url()
|
|
134
|
+
orgid = get_cc_org_id(api.session)
|
|
135
|
+
url = f"{cc_base_url}/organization/{orgid}/business-hours/bulk"
|
|
136
|
+
if json_body:
|
|
137
|
+
body = json.loads(json_body)
|
|
138
|
+
else:
|
|
139
|
+
body = {}
|
|
140
|
+
try:
|
|
141
|
+
result = api.session.rest_post(url, json=body)
|
|
142
|
+
except WebexError as e:
|
|
143
|
+
handle_rest_error(e)
|
|
144
|
+
if output == "json":
|
|
145
|
+
print_json(result)
|
|
146
|
+
elif isinstance(result, dict) and "id" in result:
|
|
147
|
+
typer.echo(f"Created: {result['id']}")
|
|
148
|
+
elif not result or result == {}:
|
|
149
|
+
typer.echo("Created.")
|
|
150
|
+
else:
|
|
151
|
+
print_json(result)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
@app.command("show")
|
|
156
|
+
def show(
|
|
157
|
+
id: str = typer.Argument(help="id"),
|
|
158
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
159
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
160
|
+
):
|
|
161
|
+
"""Get specific Business Hours resource by ID."""
|
|
162
|
+
api = get_api(debug=debug)
|
|
163
|
+
cc_base_url = get_cc_base_url()
|
|
164
|
+
orgid = get_cc_org_id(api.session)
|
|
165
|
+
url = f"{cc_base_url}/organization/{orgid}/business-hours/{id}"
|
|
166
|
+
try:
|
|
167
|
+
result = api.session.rest_get(url)
|
|
168
|
+
except WebexError as e:
|
|
169
|
+
handle_rest_error(e)
|
|
170
|
+
if output == "json":
|
|
171
|
+
print_json(result)
|
|
172
|
+
else:
|
|
173
|
+
if isinstance(result, dict):
|
|
174
|
+
print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
|
|
175
|
+
elif isinstance(result, list):
|
|
176
|
+
print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
|
|
177
|
+
else:
|
|
178
|
+
print_json(result)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
@app.command("update")
|
|
183
|
+
def update(
|
|
184
|
+
id: str = typer.Argument(help="id"),
|
|
185
|
+
organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. This field is require"),
|
|
186
|
+
id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
|
|
187
|
+
version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
|
|
188
|
+
name: str = typer.Option(None, "--name", help="Enter a name for the agent profile."),
|
|
189
|
+
description: str = typer.Option(None, "--description", help="(Optional) Enter a description of the profile."),
|
|
190
|
+
timezone: str = typer.Option(None, "--timezone", help="The time zone that you provision for your business hour."),
|
|
191
|
+
holidays_id: str = typer.Option(None, "--holidays-id", help="Holidays Id."),
|
|
192
|
+
overrides_id: str = typer.Option(None, "--overrides-id", help="Overrides Id."),
|
|
193
|
+
working_hours_count: str = typer.Option(None, "--working-hours-count", help="Working Hours Count."),
|
|
194
|
+
created_time: str = typer.Option(None, "--created-time", help="This is the created time of the entity."),
|
|
195
|
+
last_updated_time: str = typer.Option(None, "--last-updated-time", help="This is the updated time of the entity."),
|
|
196
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
197
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
198
|
+
):
|
|
199
|
+
"""Update specific Business Hours resource by ID\n\nExample --json-body:\n '{"name":"...","timezone":"...","workingHours":[{"name":"...","days":"...","startTime":"...","endTime":"..."}],"organizationId":"...","id":"...","version":0,"description":"...","holidaysId":"..."}'."""
|
|
200
|
+
api = get_api(debug=debug)
|
|
201
|
+
cc_base_url = get_cc_base_url()
|
|
202
|
+
orgid = get_cc_org_id(api.session)
|
|
203
|
+
url = f"{cc_base_url}/organization/{orgid}/business-hours/{id}"
|
|
204
|
+
if json_body:
|
|
205
|
+
body = json.loads(json_body)
|
|
206
|
+
else:
|
|
207
|
+
body = {}
|
|
208
|
+
if organization_id is not None:
|
|
209
|
+
body["organizationId"] = organization_id
|
|
210
|
+
if id_param is not None:
|
|
211
|
+
body["id"] = id_param
|
|
212
|
+
if version is not None:
|
|
213
|
+
body["version"] = version
|
|
214
|
+
if name is not None:
|
|
215
|
+
body["name"] = name
|
|
216
|
+
if description is not None:
|
|
217
|
+
body["description"] = description
|
|
218
|
+
if timezone is not None:
|
|
219
|
+
body["timezone"] = timezone
|
|
220
|
+
if holidays_id is not None:
|
|
221
|
+
body["holidaysId"] = holidays_id
|
|
222
|
+
if overrides_id is not None:
|
|
223
|
+
body["overridesId"] = overrides_id
|
|
224
|
+
if working_hours_count is not None:
|
|
225
|
+
body["workingHoursCount"] = working_hours_count
|
|
226
|
+
if created_time is not None:
|
|
227
|
+
body["createdTime"] = created_time
|
|
228
|
+
if last_updated_time is not None:
|
|
229
|
+
body["lastUpdatedTime"] = last_updated_time
|
|
230
|
+
try:
|
|
231
|
+
result = api.session.rest_put(url, json=body)
|
|
232
|
+
except WebexError as e:
|
|
233
|
+
handle_rest_error(e)
|
|
234
|
+
typer.echo(f"Updated.")
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
@app.command("delete")
|
|
239
|
+
def delete(
|
|
240
|
+
id: str = typer.Argument(help="id"),
|
|
241
|
+
force: bool = typer.Option(False, "--force", help="Skip confirmation"),
|
|
242
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
243
|
+
):
|
|
244
|
+
"""Delete specific Business Hours resource by ID."""
|
|
245
|
+
if not force:
|
|
246
|
+
typer.confirm(f"Delete {id}?", abort=True)
|
|
247
|
+
api = get_api(debug=debug)
|
|
248
|
+
cc_base_url = get_cc_base_url()
|
|
249
|
+
orgid = get_cc_org_id(api.session)
|
|
250
|
+
url = f"{cc_base_url}/organization/{orgid}/business-hours/{id}"
|
|
251
|
+
try:
|
|
252
|
+
api.session.rest_delete(url)
|
|
253
|
+
except WebexError as e:
|
|
254
|
+
handle_rest_error(e)
|
|
255
|
+
typer.echo(f"Deleted: {id}")
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
@app.command("list-incoming-references")
|
|
260
|
+
def list_incoming_references(
|
|
261
|
+
id: str = typer.Argument(help="id"),
|
|
262
|
+
type_param: str = typer.Option(None, "--type", help="Entity type of the other entity that has a reference to this"),
|
|
263
|
+
page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
|
|
264
|
+
page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
|
|
265
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
266
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
267
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
268
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
269
|
+
):
|
|
270
|
+
"""List references for a specific Business Hours resource."""
|
|
271
|
+
api = get_api(debug=debug)
|
|
272
|
+
cc_base_url = get_cc_base_url()
|
|
273
|
+
orgid = get_cc_org_id(api.session)
|
|
274
|
+
url = f"{cc_base_url}/organization/{orgid}/business-hours/{id}/incoming-references"
|
|
275
|
+
params = {}
|
|
276
|
+
if type_param is not None:
|
|
277
|
+
params["type"] = type_param
|
|
278
|
+
if page is not None:
|
|
279
|
+
params["page"] = page
|
|
280
|
+
if page_size is not None:
|
|
281
|
+
params["pageSize"] = page_size
|
|
282
|
+
if limit > 0:
|
|
283
|
+
params["max"] = limit
|
|
284
|
+
if offset > 0:
|
|
285
|
+
params["start"] = offset
|
|
286
|
+
result = None
|
|
287
|
+
try:
|
|
288
|
+
result = api.session.rest_get(url, params=params)
|
|
289
|
+
except WebexError as e:
|
|
290
|
+
handle_rest_error(e)
|
|
291
|
+
result = result or []
|
|
292
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
293
|
+
if output == "json":
|
|
294
|
+
print_json(items)
|
|
295
|
+
else:
|
|
296
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
@app.command("list-business-hours")
|
|
301
|
+
def list_business_hours(
|
|
302
|
+
filter_param: str = typer.Option(None, "--filter", help="Specify a filter based on which the results will be fetched."),
|
|
303
|
+
attributes: str = typer.Option(None, "--attributes", help="Specify the attributes to be returned. By default, all attri"),
|
|
304
|
+
search: str = typer.Option(None, "--search", help="Filter data based on the search keyword.Supported search col"),
|
|
305
|
+
page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
|
|
306
|
+
page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
|
|
307
|
+
sort: str = typer.Option(None, "--sort", help="Sorting criteria in the format: property(, asc | desc). Defa"),
|
|
308
|
+
include_count: str = typer.Option(None, "--include-count", help="Enable this flag to get the count of working hours."),
|
|
309
|
+
single_object_response: str = typer.Option(None, "--single-object-response", help="Specify whether to include array fields in the response. Thi"),
|
|
310
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
311
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
312
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
313
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
314
|
+
):
|
|
315
|
+
"""List Business Hours resources."""
|
|
316
|
+
api = get_api(debug=debug)
|
|
317
|
+
cc_base_url = get_cc_base_url()
|
|
318
|
+
orgid = get_cc_org_id(api.session)
|
|
319
|
+
url = f"{cc_base_url}/organization/{orgid}/v2/business-hours"
|
|
320
|
+
params = {}
|
|
321
|
+
if filter_param is not None:
|
|
322
|
+
params["filter"] = filter_param
|
|
323
|
+
if attributes is not None:
|
|
324
|
+
params["attributes"] = attributes
|
|
325
|
+
if search is not None:
|
|
326
|
+
params["search"] = search
|
|
327
|
+
if page is not None:
|
|
328
|
+
params["page"] = page
|
|
329
|
+
if page_size is not None:
|
|
330
|
+
params["pageSize"] = page_size
|
|
331
|
+
if sort is not None:
|
|
332
|
+
params["sort"] = sort
|
|
333
|
+
if include_count is not None:
|
|
334
|
+
params["includeCount"] = include_count
|
|
335
|
+
if single_object_response is not None:
|
|
336
|
+
params["singleObjectResponse"] = single_object_response
|
|
337
|
+
if limit > 0:
|
|
338
|
+
params["max"] = limit
|
|
339
|
+
if offset > 0:
|
|
340
|
+
params["start"] = offset
|
|
341
|
+
result = None
|
|
342
|
+
try:
|
|
343
|
+
result = api.session.rest_get(url, params=params)
|
|
344
|
+
except WebexError as e:
|
|
345
|
+
handle_rest_error(e)
|
|
346
|
+
result = result or []
|
|
347
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
348
|
+
if output == "json":
|
|
349
|
+
print_json(items)
|
|
350
|
+
else:
|
|
351
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
352
|
+
|
|
353
|
+
|
|
@@ -0,0 +1,228 @@
|
|
|
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_cc_base_url
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
app = typer.Typer(help="Manage Webex Contact Center cc-call-monitoring.")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@app.command("create")
|
|
13
|
+
def create(
|
|
14
|
+
id_param: str = typer.Option(None, "--id", help="(required) The id represents the unique request id with which the Monit"),
|
|
15
|
+
monitor_type: str = typer.Option(None, "--monitor-type", help="(required) It represents the type of the monitoring request. It can to"),
|
|
16
|
+
task_id: str = typer.Option(None, "--task-id", help="The unique ID representing the task that needs to be monitor"),
|
|
17
|
+
tracking_id: str = typer.Option(None, "--tracking-id", help="An unique id to keep a track of events occurring during the"),
|
|
18
|
+
invisible_mode: bool = typer.Option(None, "--invisible-mode/--no-invisible-mode", help="This allows the supervisor to obfuscate their details from T"),
|
|
19
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
20
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
21
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
22
|
+
):
|
|
23
|
+
"""Create Monitoring Request\n\nExample --json-body:\n '{"id":"...","monitorType":"...","taskId":"...","queueIds":["..."],"teams":["..."],"sites":["..."],"agents":["..."],"trackingId":"..."}'."""
|
|
24
|
+
api = get_api(debug=debug)
|
|
25
|
+
cc_base_url = get_cc_base_url()
|
|
26
|
+
url = f"{cc_base_url}/monitor"
|
|
27
|
+
if json_body:
|
|
28
|
+
body = json.loads(json_body)
|
|
29
|
+
else:
|
|
30
|
+
body = {}
|
|
31
|
+
if id_param is not None:
|
|
32
|
+
body["id"] = id_param
|
|
33
|
+
if monitor_type is not None:
|
|
34
|
+
body["monitorType"] = monitor_type
|
|
35
|
+
if task_id is not None:
|
|
36
|
+
body["taskId"] = task_id
|
|
37
|
+
if tracking_id is not None:
|
|
38
|
+
body["trackingId"] = tracking_id
|
|
39
|
+
if invisible_mode is not None:
|
|
40
|
+
body["invisibleMode"] = invisible_mode
|
|
41
|
+
_missing = [f for f in ['id', 'monitorType'] if f not in body or body[f] is None]
|
|
42
|
+
if _missing:
|
|
43
|
+
typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
|
|
44
|
+
raise typer.Exit(1)
|
|
45
|
+
try:
|
|
46
|
+
result = api.session.rest_post(url, json=body)
|
|
47
|
+
except WebexError as e:
|
|
48
|
+
handle_rest_error(e)
|
|
49
|
+
if output == "json":
|
|
50
|
+
print_json(result)
|
|
51
|
+
elif isinstance(result, dict) and "id" in result:
|
|
52
|
+
typer.echo(f"Created: {result['id']}")
|
|
53
|
+
elif not result or result == {}:
|
|
54
|
+
typer.echo("Created.")
|
|
55
|
+
else:
|
|
56
|
+
print_json(result)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@app.command("create-barge-in")
|
|
61
|
+
def create_barge_in(
|
|
62
|
+
task_id: str = typer.Argument(help="taskId"),
|
|
63
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
64
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
65
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
66
|
+
):
|
|
67
|
+
"""BargeIn Request."""
|
|
68
|
+
api = get_api(debug=debug)
|
|
69
|
+
cc_base_url = get_cc_base_url()
|
|
70
|
+
url = f"{cc_base_url}/monitor/{task_id}/bargeIn"
|
|
71
|
+
if json_body:
|
|
72
|
+
body = json.loads(json_body)
|
|
73
|
+
else:
|
|
74
|
+
body = {}
|
|
75
|
+
try:
|
|
76
|
+
result = api.session.rest_post(url, json=body)
|
|
77
|
+
except WebexError as e:
|
|
78
|
+
handle_rest_error(e)
|
|
79
|
+
if output == "json":
|
|
80
|
+
print_json(result)
|
|
81
|
+
elif isinstance(result, dict) and "id" in result:
|
|
82
|
+
typer.echo(f"Created: {result['id']}")
|
|
83
|
+
elif not result or result == {}:
|
|
84
|
+
typer.echo("Created.")
|
|
85
|
+
else:
|
|
86
|
+
print_json(result)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@app.command("create-end")
|
|
91
|
+
def create_end(
|
|
92
|
+
task_id: str = typer.Argument(help="taskId"),
|
|
93
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
94
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
95
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
96
|
+
):
|
|
97
|
+
"""End Monitoring Request."""
|
|
98
|
+
api = get_api(debug=debug)
|
|
99
|
+
cc_base_url = get_cc_base_url()
|
|
100
|
+
url = f"{cc_base_url}/monitor/{task_id}/end"
|
|
101
|
+
if json_body:
|
|
102
|
+
body = json.loads(json_body)
|
|
103
|
+
else:
|
|
104
|
+
body = {}
|
|
105
|
+
try:
|
|
106
|
+
result = api.session.rest_post(url, json=body)
|
|
107
|
+
except WebexError as e:
|
|
108
|
+
handle_rest_error(e)
|
|
109
|
+
if output == "json":
|
|
110
|
+
print_json(result)
|
|
111
|
+
elif isinstance(result, dict) and "id" in result:
|
|
112
|
+
typer.echo(f"Created: {result['id']}")
|
|
113
|
+
elif not result or result == {}:
|
|
114
|
+
typer.echo("Created.")
|
|
115
|
+
else:
|
|
116
|
+
print_json(result)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@app.command("create-hold")
|
|
121
|
+
def create_hold(
|
|
122
|
+
task_id: str = typer.Argument(help="taskId"),
|
|
123
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
124
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
125
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
126
|
+
):
|
|
127
|
+
"""Hold Monitoring Request."""
|
|
128
|
+
api = get_api(debug=debug)
|
|
129
|
+
cc_base_url = get_cc_base_url()
|
|
130
|
+
url = f"{cc_base_url}/monitor/{task_id}/hold"
|
|
131
|
+
if json_body:
|
|
132
|
+
body = json.loads(json_body)
|
|
133
|
+
else:
|
|
134
|
+
body = {}
|
|
135
|
+
try:
|
|
136
|
+
result = api.session.rest_post(url, json=body)
|
|
137
|
+
except WebexError as e:
|
|
138
|
+
handle_rest_error(e)
|
|
139
|
+
if output == "json":
|
|
140
|
+
print_json(result)
|
|
141
|
+
elif isinstance(result, dict) and "id" in result:
|
|
142
|
+
typer.echo(f"Created: {result['id']}")
|
|
143
|
+
elif not result or result == {}:
|
|
144
|
+
typer.echo("Created.")
|
|
145
|
+
else:
|
|
146
|
+
print_json(result)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
@app.command("create-unhold")
|
|
151
|
+
def create_unhold(
|
|
152
|
+
task_id: str = typer.Argument(help="taskId"),
|
|
153
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
154
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
155
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
156
|
+
):
|
|
157
|
+
"""Unhold Monitoring Request."""
|
|
158
|
+
api = get_api(debug=debug)
|
|
159
|
+
cc_base_url = get_cc_base_url()
|
|
160
|
+
url = f"{cc_base_url}/monitor/{task_id}/unhold"
|
|
161
|
+
if json_body:
|
|
162
|
+
body = json.loads(json_body)
|
|
163
|
+
else:
|
|
164
|
+
body = {}
|
|
165
|
+
try:
|
|
166
|
+
result = api.session.rest_post(url, json=body)
|
|
167
|
+
except WebexError as e:
|
|
168
|
+
handle_rest_error(e)
|
|
169
|
+
if output == "json":
|
|
170
|
+
print_json(result)
|
|
171
|
+
elif isinstance(result, dict) and "id" in result:
|
|
172
|
+
typer.echo(f"Created: {result['id']}")
|
|
173
|
+
elif not result or result == {}:
|
|
174
|
+
typer.echo("Created.")
|
|
175
|
+
else:
|
|
176
|
+
print_json(result)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
@app.command("list")
|
|
181
|
+
def cmd_list(
|
|
182
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
183
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
184
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
185
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
186
|
+
):
|
|
187
|
+
"""Fetch Monitoring Sessions."""
|
|
188
|
+
api = get_api(debug=debug)
|
|
189
|
+
cc_base_url = get_cc_base_url()
|
|
190
|
+
url = f"{cc_base_url}/monitor/sessions"
|
|
191
|
+
params = {}
|
|
192
|
+
if limit > 0:
|
|
193
|
+
params["max"] = limit
|
|
194
|
+
if offset > 0:
|
|
195
|
+
params["start"] = offset
|
|
196
|
+
result = None
|
|
197
|
+
try:
|
|
198
|
+
result = api.session.rest_get(url, params=params)
|
|
199
|
+
except WebexError as e:
|
|
200
|
+
handle_rest_error(e)
|
|
201
|
+
result = result or []
|
|
202
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
203
|
+
if output == "json":
|
|
204
|
+
print_json(items)
|
|
205
|
+
else:
|
|
206
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
@app.command("delete")
|
|
211
|
+
def delete(
|
|
212
|
+
request_id: str = typer.Argument(help="requestId"),
|
|
213
|
+
force: bool = typer.Option(False, "--force", help="Skip confirmation"),
|
|
214
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
215
|
+
):
|
|
216
|
+
"""Delete Monitoring Request."""
|
|
217
|
+
if not force:
|
|
218
|
+
typer.confirm(f"Delete {request_id}?", abort=True)
|
|
219
|
+
api = get_api(debug=debug)
|
|
220
|
+
cc_base_url = get_cc_base_url()
|
|
221
|
+
url = f"{cc_base_url}/monitor/{request_id}"
|
|
222
|
+
try:
|
|
223
|
+
api.session.rest_delete(url)
|
|
224
|
+
except WebexError as e:
|
|
225
|
+
handle_rest_error(e)
|
|
226
|
+
typer.echo(f"Deleted: {request_id}")
|
|
227
|
+
|
|
228
|
+
|