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,164 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import typer
|
|
3
|
+
from wxcli.auth import get_api
|
|
4
|
+
from wxcli.errors import WebexError, handle_rest_error
|
|
5
|
+
from wxcli.output import print_table, print_json
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
app = typer.Typer(help="Manage Webex Calling memberships.")
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@app.command("list")
|
|
12
|
+
def cmd_list(
|
|
13
|
+
room_id: str = typer.Option(None, "--room-id", help="List memberships associated with a room, by ID."),
|
|
14
|
+
person_id: str = typer.Option(None, "--person-id", help="List memberships associated with a person, by ID. The `roomI"),
|
|
15
|
+
person_email: str = typer.Option(None, "--person-email", help="List memberships associated with a person, by email address."),
|
|
16
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
17
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
18
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
19
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
20
|
+
):
|
|
21
|
+
"""List Memberships."""
|
|
22
|
+
api = get_api(debug=debug)
|
|
23
|
+
url = f"https://webexapis.com/v1/memberships"
|
|
24
|
+
params = {}
|
|
25
|
+
if room_id is not None:
|
|
26
|
+
params["roomId"] = room_id
|
|
27
|
+
if person_id is not None:
|
|
28
|
+
params["personId"] = person_id
|
|
29
|
+
if person_email is not None:
|
|
30
|
+
params["personEmail"] = person_email
|
|
31
|
+
if limit > 0:
|
|
32
|
+
params["max"] = limit
|
|
33
|
+
if offset > 0:
|
|
34
|
+
params["start"] = offset
|
|
35
|
+
try:
|
|
36
|
+
if limit > 0:
|
|
37
|
+
result = api.session.rest_get(url, params=params)
|
|
38
|
+
result = result or {}
|
|
39
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
40
|
+
else:
|
|
41
|
+
items = list(api.session.follow_pagination(url=url, params=params, item_key="items"))
|
|
42
|
+
except WebexError as e:
|
|
43
|
+
handle_rest_error(e)
|
|
44
|
+
if output == "json":
|
|
45
|
+
print_json(items)
|
|
46
|
+
else:
|
|
47
|
+
print_table(items, columns=[('ID', 'id'), ('Person', 'personDisplayName'), ('Email', 'personEmail'), ('Moderator', 'isModerator')], limit=limit)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@app.command("create")
|
|
52
|
+
def create(
|
|
53
|
+
room_id: str = typer.Option(None, "--room-id", help="(required) The room ID."),
|
|
54
|
+
person_id: str = typer.Option(None, "--person-id", help="The person ID."),
|
|
55
|
+
person_email: str = typer.Option(None, "--person-email", help="The email address of the person."),
|
|
56
|
+
is_moderator: bool = typer.Option(None, "--is-moderator/--no-is-moderator", help="Whether or not the participant is a room moderator."),
|
|
57
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
58
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
59
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
60
|
+
):
|
|
61
|
+
"""Create a Membership."""
|
|
62
|
+
api = get_api(debug=debug)
|
|
63
|
+
url = f"https://webexapis.com/v1/memberships"
|
|
64
|
+
if json_body:
|
|
65
|
+
body = json.loads(json_body)
|
|
66
|
+
else:
|
|
67
|
+
body = {}
|
|
68
|
+
if room_id is not None:
|
|
69
|
+
body["roomId"] = room_id
|
|
70
|
+
if person_id is not None:
|
|
71
|
+
body["personId"] = person_id
|
|
72
|
+
if person_email is not None:
|
|
73
|
+
body["personEmail"] = person_email
|
|
74
|
+
if is_moderator is not None:
|
|
75
|
+
body["isModerator"] = is_moderator
|
|
76
|
+
_missing = [f for f in ['roomId'] if f not in body or body[f] is None]
|
|
77
|
+
if _missing:
|
|
78
|
+
typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
|
|
79
|
+
raise typer.Exit(1)
|
|
80
|
+
try:
|
|
81
|
+
result = api.session.rest_post(url, json=body)
|
|
82
|
+
except WebexError as e:
|
|
83
|
+
handle_rest_error(e)
|
|
84
|
+
if output == "json":
|
|
85
|
+
print_json(result)
|
|
86
|
+
elif isinstance(result, dict) and "id" in result:
|
|
87
|
+
typer.echo(f"Created: {result['id']}")
|
|
88
|
+
elif not result or result == {}:
|
|
89
|
+
typer.echo("Created.")
|
|
90
|
+
else:
|
|
91
|
+
print_json(result)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@app.command("show")
|
|
96
|
+
def show(
|
|
97
|
+
membership_id: str = typer.Argument(help="membershipId"),
|
|
98
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
99
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
100
|
+
):
|
|
101
|
+
"""Get Membership Details."""
|
|
102
|
+
api = get_api(debug=debug)
|
|
103
|
+
url = f"https://webexapis.com/v1/memberships/{membership_id}"
|
|
104
|
+
try:
|
|
105
|
+
result = api.session.rest_get(url)
|
|
106
|
+
except WebexError as e:
|
|
107
|
+
handle_rest_error(e)
|
|
108
|
+
if output == "json":
|
|
109
|
+
print_json(result)
|
|
110
|
+
else:
|
|
111
|
+
if isinstance(result, dict):
|
|
112
|
+
print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
|
|
113
|
+
elif isinstance(result, list):
|
|
114
|
+
print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
|
|
115
|
+
else:
|
|
116
|
+
print_json(result)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@app.command("update")
|
|
121
|
+
def update(
|
|
122
|
+
membership_id: str = typer.Argument(help="membershipId"),
|
|
123
|
+
is_moderator: bool = typer.Option(None, "--is-moderator/--no-is-moderator", help="Whether or not the participant is a room moderator."),
|
|
124
|
+
is_room_hidden: bool = typer.Option(None, "--is-room-hidden/--no-is-room-hidden", help="When set to true, hides direct spaces in the teams client. A"),
|
|
125
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
126
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
127
|
+
):
|
|
128
|
+
"""Update a Membership."""
|
|
129
|
+
api = get_api(debug=debug)
|
|
130
|
+
url = f"https://webexapis.com/v1/memberships/{membership_id}"
|
|
131
|
+
if json_body:
|
|
132
|
+
body = json.loads(json_body)
|
|
133
|
+
else:
|
|
134
|
+
body = {}
|
|
135
|
+
if is_moderator is not None:
|
|
136
|
+
body["isModerator"] = is_moderator
|
|
137
|
+
if is_room_hidden is not None:
|
|
138
|
+
body["isRoomHidden"] = is_room_hidden
|
|
139
|
+
try:
|
|
140
|
+
result = api.session.rest_put(url, json=body)
|
|
141
|
+
except WebexError as e:
|
|
142
|
+
handle_rest_error(e)
|
|
143
|
+
typer.echo(f"Updated.")
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
@app.command("delete")
|
|
148
|
+
def delete(
|
|
149
|
+
membership_id: str = typer.Argument(help="membershipId"),
|
|
150
|
+
force: bool = typer.Option(False, "--force", help="Skip confirmation"),
|
|
151
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
152
|
+
):
|
|
153
|
+
"""Delete a Membership."""
|
|
154
|
+
if not force:
|
|
155
|
+
typer.confirm(f"Delete {membership_id}?", abort=True)
|
|
156
|
+
api = get_api(debug=debug)
|
|
157
|
+
url = f"https://webexapis.com/v1/memberships/{membership_id}"
|
|
158
|
+
try:
|
|
159
|
+
api.session.rest_delete(url)
|
|
160
|
+
except WebexError as e:
|
|
161
|
+
handle_rest_error(e)
|
|
162
|
+
typer.echo(f"Deleted: {membership_id}")
|
|
163
|
+
|
|
164
|
+
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import typer
|
|
3
|
+
from wxcli.auth import get_api
|
|
4
|
+
from wxcli.errors import WebexError, handle_rest_error
|
|
5
|
+
from wxcli.output import print_table, print_json
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
app = typer.Typer(help="Manage Webex Calling messages.")
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@app.command("list")
|
|
12
|
+
def cmd_list(
|
|
13
|
+
room_id: str = typer.Option(..., "--room-id", help="List messages in a room, by ID."),
|
|
14
|
+
parent_id: str = typer.Option(None, "--parent-id", help="List messages with a parent, by ID."),
|
|
15
|
+
mentioned_people: str = typer.Option(None, "--mentioned-people", help="List messages with these people mentioned, by ID. Use `me` a"),
|
|
16
|
+
before: str = typer.Option(None, "--before", help="List messages sent before a date and time."),
|
|
17
|
+
before_message: str = typer.Option(None, "--before-message", help="List messages sent before a message, by ID."),
|
|
18
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
19
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
20
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
21
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
22
|
+
):
|
|
23
|
+
"""List Messages."""
|
|
24
|
+
api = get_api(debug=debug)
|
|
25
|
+
url = f"https://webexapis.com/v1/messages"
|
|
26
|
+
params = {}
|
|
27
|
+
if room_id is not None:
|
|
28
|
+
params["roomId"] = room_id
|
|
29
|
+
if parent_id is not None:
|
|
30
|
+
params["parentId"] = parent_id
|
|
31
|
+
if mentioned_people is not None:
|
|
32
|
+
params["mentionedPeople"] = mentioned_people
|
|
33
|
+
if before is not None:
|
|
34
|
+
params["before"] = before
|
|
35
|
+
if before_message is not None:
|
|
36
|
+
params["beforeMessage"] = before_message
|
|
37
|
+
if limit > 0:
|
|
38
|
+
params["max"] = limit
|
|
39
|
+
if offset > 0:
|
|
40
|
+
params["start"] = offset
|
|
41
|
+
try:
|
|
42
|
+
if limit > 0:
|
|
43
|
+
result = api.session.rest_get(url, params=params)
|
|
44
|
+
result = result or {}
|
|
45
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
46
|
+
else:
|
|
47
|
+
items = list(api.session.follow_pagination(url=url, params=params, item_key="items"))
|
|
48
|
+
except WebexError as e:
|
|
49
|
+
handle_rest_error(e)
|
|
50
|
+
if output == "json":
|
|
51
|
+
print_json(items)
|
|
52
|
+
else:
|
|
53
|
+
print_table(items, columns=[('ID', 'id'), ('Person Email', 'personEmail'), ('Text', 'text')], limit=limit)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@app.command("create")
|
|
58
|
+
def create(
|
|
59
|
+
room_id: str = typer.Option(None, "--room-id", help="The room ID of the message."),
|
|
60
|
+
parent_id: str = typer.Option(None, "--parent-id", help="The parent message to reply to."),
|
|
61
|
+
to_person_id: str = typer.Option(None, "--to-person-id", help="The person ID of the recipient when sending a private 1:1 me"),
|
|
62
|
+
to_person_email: str = typer.Option(None, "--to-person-email", help="The email address of the recipient when sending a private 1:"),
|
|
63
|
+
text: str = typer.Option(None, "--text", help="The message, in plain text. If `markdown` is specified this"),
|
|
64
|
+
markdown: str = typer.Option(None, "--markdown", help="The message, in Markdown format. The maximum message length"),
|
|
65
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
66
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
67
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
68
|
+
):
|
|
69
|
+
"""Create a Message\n\nExample --json-body:\n '{"roomId":"...","parentId":"...","toPersonId":"...","toPersonEmail":"...","text":"...","markdown":"...","files":["..."],"attachments":[{"content":"..."}]}'."""
|
|
70
|
+
api = get_api(debug=debug)
|
|
71
|
+
url = f"https://webexapis.com/v1/messages"
|
|
72
|
+
if json_body:
|
|
73
|
+
body = json.loads(json_body)
|
|
74
|
+
else:
|
|
75
|
+
body = {}
|
|
76
|
+
if room_id is not None:
|
|
77
|
+
body["roomId"] = room_id
|
|
78
|
+
if parent_id is not None:
|
|
79
|
+
body["parentId"] = parent_id
|
|
80
|
+
if to_person_id is not None:
|
|
81
|
+
body["toPersonId"] = to_person_id
|
|
82
|
+
if to_person_email is not None:
|
|
83
|
+
body["toPersonEmail"] = to_person_email
|
|
84
|
+
if text is not None:
|
|
85
|
+
body["text"] = text
|
|
86
|
+
if markdown is not None:
|
|
87
|
+
body["markdown"] = markdown
|
|
88
|
+
try:
|
|
89
|
+
result = api.session.rest_post(url, json=body)
|
|
90
|
+
except WebexError as e:
|
|
91
|
+
handle_rest_error(e)
|
|
92
|
+
if output == "json":
|
|
93
|
+
print_json(result)
|
|
94
|
+
elif isinstance(result, dict) and "id" in result:
|
|
95
|
+
typer.echo(f"Created: {result['id']}")
|
|
96
|
+
elif not result or result == {}:
|
|
97
|
+
typer.echo("Created.")
|
|
98
|
+
else:
|
|
99
|
+
print_json(result)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
@app.command("list-direct")
|
|
104
|
+
def list_direct(
|
|
105
|
+
parent_id: str = typer.Option(None, "--parent-id", help="List messages with a parent, by ID."),
|
|
106
|
+
person_id: str = typer.Option(None, "--person-id", help="List messages in a 1:1 room, by person ID."),
|
|
107
|
+
person_email: str = typer.Option(None, "--person-email", help="List messages in a 1:1 room, by person email."),
|
|
108
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
109
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
110
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
111
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
112
|
+
):
|
|
113
|
+
"""List Direct Messages."""
|
|
114
|
+
api = get_api(debug=debug)
|
|
115
|
+
url = f"https://webexapis.com/v1/messages/direct"
|
|
116
|
+
params = {}
|
|
117
|
+
if parent_id is not None:
|
|
118
|
+
params["parentId"] = parent_id
|
|
119
|
+
if person_id is not None:
|
|
120
|
+
params["personId"] = person_id
|
|
121
|
+
if person_email is not None:
|
|
122
|
+
params["personEmail"] = person_email
|
|
123
|
+
if limit > 0:
|
|
124
|
+
params["max"] = limit
|
|
125
|
+
if offset > 0:
|
|
126
|
+
params["start"] = offset
|
|
127
|
+
result = None
|
|
128
|
+
try:
|
|
129
|
+
result = api.session.rest_get(url, params=params)
|
|
130
|
+
except WebexError as e:
|
|
131
|
+
handle_rest_error(e)
|
|
132
|
+
result = result or []
|
|
133
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
134
|
+
if output == "json":
|
|
135
|
+
print_json(items)
|
|
136
|
+
else:
|
|
137
|
+
print_table(items, columns=[('ID', 'id'), ('Person Email', 'personEmail'), ('Text', 'text')], limit=limit)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@app.command("show")
|
|
142
|
+
def show(
|
|
143
|
+
message_id: str = typer.Argument(help="messageId"),
|
|
144
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
145
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
146
|
+
):
|
|
147
|
+
"""Get Message Details."""
|
|
148
|
+
api = get_api(debug=debug)
|
|
149
|
+
url = f"https://webexapis.com/v1/messages/{message_id}"
|
|
150
|
+
try:
|
|
151
|
+
result = api.session.rest_get(url)
|
|
152
|
+
except WebexError as e:
|
|
153
|
+
handle_rest_error(e)
|
|
154
|
+
if output == "json":
|
|
155
|
+
print_json(result)
|
|
156
|
+
else:
|
|
157
|
+
if isinstance(result, dict):
|
|
158
|
+
print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
|
|
159
|
+
elif isinstance(result, list):
|
|
160
|
+
print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
|
|
161
|
+
else:
|
|
162
|
+
print_json(result)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
@app.command("update")
|
|
167
|
+
def update(
|
|
168
|
+
message_id: str = typer.Argument(help="messageId"),
|
|
169
|
+
room_id: str = typer.Option(None, "--room-id", help="The room ID of the message."),
|
|
170
|
+
text: str = typer.Option(None, "--text", help="The message, in plain text. If `markdown` is specified this"),
|
|
171
|
+
markdown: str = typer.Option(None, "--markdown", help="The message, in Markdown format. If this attribute is set en"),
|
|
172
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
173
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
174
|
+
):
|
|
175
|
+
"""Edit a Message."""
|
|
176
|
+
api = get_api(debug=debug)
|
|
177
|
+
url = f"https://webexapis.com/v1/messages/{message_id}"
|
|
178
|
+
if json_body:
|
|
179
|
+
body = json.loads(json_body)
|
|
180
|
+
else:
|
|
181
|
+
body = {}
|
|
182
|
+
if room_id is not None:
|
|
183
|
+
body["roomId"] = room_id
|
|
184
|
+
if text is not None:
|
|
185
|
+
body["text"] = text
|
|
186
|
+
if markdown is not None:
|
|
187
|
+
body["markdown"] = markdown
|
|
188
|
+
try:
|
|
189
|
+
result = api.session.rest_put(url, json=body)
|
|
190
|
+
except WebexError as e:
|
|
191
|
+
handle_rest_error(e)
|
|
192
|
+
typer.echo(f"Updated.")
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
@app.command("delete")
|
|
197
|
+
def delete(
|
|
198
|
+
message_id: str = typer.Argument(help="messageId"),
|
|
199
|
+
force: bool = typer.Option(False, "--force", help="Skip confirmation"),
|
|
200
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
201
|
+
):
|
|
202
|
+
"""Delete a Message."""
|
|
203
|
+
if not force:
|
|
204
|
+
typer.confirm(f"Delete {message_id}?", abort=True)
|
|
205
|
+
api = get_api(debug=debug)
|
|
206
|
+
url = f"https://webexapis.com/v1/messages/{message_id}"
|
|
207
|
+
try:
|
|
208
|
+
api.session.rest_delete(url)
|
|
209
|
+
except WebexError as e:
|
|
210
|
+
handle_rest_error(e)
|
|
211
|
+
typer.echo(f"Deleted: {message_id}")
|
|
212
|
+
|
|
213
|
+
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import typer
|
|
3
|
+
from wxcli.auth import get_api
|
|
4
|
+
from wxcli.errors import WebexError, handle_rest_error
|
|
5
|
+
from wxcli.output import print_table, print_json
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
app = typer.Typer(help="Manage Webex Calling mode-management.")
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@app.command("list")
|
|
12
|
+
def cmd_list(
|
|
13
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
14
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
15
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
16
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
17
|
+
):
|
|
18
|
+
"""Get Mode Management Features."""
|
|
19
|
+
api = get_api(debug=debug)
|
|
20
|
+
url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features"
|
|
21
|
+
params = {}
|
|
22
|
+
if limit > 0:
|
|
23
|
+
params["max"] = limit
|
|
24
|
+
if offset > 0:
|
|
25
|
+
params["start"] = offset
|
|
26
|
+
result = None
|
|
27
|
+
try:
|
|
28
|
+
result = api.session.rest_get(url, params=params)
|
|
29
|
+
except WebexError as e:
|
|
30
|
+
handle_rest_error(e)
|
|
31
|
+
result = result or []
|
|
32
|
+
items = result.get("features", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
33
|
+
if output == "json":
|
|
34
|
+
print_json(items)
|
|
35
|
+
else:
|
|
36
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@app.command("list-common-modes")
|
|
41
|
+
def list_common_modes(
|
|
42
|
+
feature_ids: str = typer.Option(..., "--feature-ids", help="List of feature IDs (comma-separated) for auto attendants, c"),
|
|
43
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
44
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
45
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
46
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
47
|
+
):
|
|
48
|
+
"""Get Common Modes."""
|
|
49
|
+
api = get_api(debug=debug)
|
|
50
|
+
url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/commonModes"
|
|
51
|
+
params = {}
|
|
52
|
+
if feature_ids is not None:
|
|
53
|
+
params["featureIds"] = feature_ids
|
|
54
|
+
if limit > 0:
|
|
55
|
+
params["max"] = limit
|
|
56
|
+
if offset > 0:
|
|
57
|
+
params["start"] = offset
|
|
58
|
+
result = None
|
|
59
|
+
try:
|
|
60
|
+
result = api.session.rest_get(url, params=params)
|
|
61
|
+
except WebexError as e:
|
|
62
|
+
handle_rest_error(e)
|
|
63
|
+
result = result or []
|
|
64
|
+
items = result.get("commonModeNames", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
65
|
+
if output == "json":
|
|
66
|
+
print_json(items)
|
|
67
|
+
else:
|
|
68
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@app.command("switch-mode-for-invoke")
|
|
73
|
+
def switch_mode_for_invoke(
|
|
74
|
+
operating_mode_name: str = typer.Option(None, "--operating-mode-name", help="Name of the common operating mode to be set as current opera"),
|
|
75
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body"),
|
|
76
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
77
|
+
):
|
|
78
|
+
"""Switch Mode for Multiple Features\n\nExample --json-body:\n '{"featureIds":["..."],"operatingModeName":"..."}'."""
|
|
79
|
+
api = get_api(debug=debug)
|
|
80
|
+
url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/actions/switchMode/invoke"
|
|
81
|
+
if json_body:
|
|
82
|
+
body = json.loads(json_body)
|
|
83
|
+
else:
|
|
84
|
+
body = {}
|
|
85
|
+
if operating_mode_name is not None:
|
|
86
|
+
body["operatingModeName"] = operating_mode_name
|
|
87
|
+
try:
|
|
88
|
+
result = api.session.rest_post(url, json=body)
|
|
89
|
+
except WebexError as e:
|
|
90
|
+
handle_rest_error(e)
|
|
91
|
+
print_json(result)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@app.command("show")
|
|
96
|
+
def show(
|
|
97
|
+
feature_id: str = typer.Argument(help="featureId"),
|
|
98
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
99
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
100
|
+
):
|
|
101
|
+
"""Get Mode Management Feature."""
|
|
102
|
+
api = get_api(debug=debug)
|
|
103
|
+
url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/{feature_id}"
|
|
104
|
+
try:
|
|
105
|
+
result = api.session.rest_get(url)
|
|
106
|
+
except WebexError as e:
|
|
107
|
+
handle_rest_error(e)
|
|
108
|
+
if output == "json":
|
|
109
|
+
print_json(result)
|
|
110
|
+
else:
|
|
111
|
+
if isinstance(result, dict):
|
|
112
|
+
print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
|
|
113
|
+
elif isinstance(result, list):
|
|
114
|
+
print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
|
|
115
|
+
else:
|
|
116
|
+
print_json(result)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@app.command("show-normal-operation-mode")
|
|
121
|
+
def show_normal_operation_mode(
|
|
122
|
+
feature_id: str = typer.Argument(help="featureId"),
|
|
123
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
124
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
125
|
+
):
|
|
126
|
+
"""Get Normal Operation Mode."""
|
|
127
|
+
api = get_api(debug=debug)
|
|
128
|
+
url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/{feature_id}/normalOperationMode"
|
|
129
|
+
try:
|
|
130
|
+
result = api.session.rest_get(url)
|
|
131
|
+
except WebexError as e:
|
|
132
|
+
handle_rest_error(e)
|
|
133
|
+
if output == "json":
|
|
134
|
+
print_json(result)
|
|
135
|
+
else:
|
|
136
|
+
if isinstance(result, dict):
|
|
137
|
+
print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
|
|
138
|
+
elif isinstance(result, list):
|
|
139
|
+
print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
|
|
140
|
+
else:
|
|
141
|
+
print_json(result)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
@app.command("show-modes")
|
|
146
|
+
def show_modes(
|
|
147
|
+
feature_id: str = typer.Argument(help="featureId"),
|
|
148
|
+
mode_id: str = typer.Argument(help="modeId"),
|
|
149
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
150
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
151
|
+
):
|
|
152
|
+
"""Get Operating Mode."""
|
|
153
|
+
api = get_api(debug=debug)
|
|
154
|
+
url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/{feature_id}/modes/{mode_id}"
|
|
155
|
+
try:
|
|
156
|
+
result = api.session.rest_get(url)
|
|
157
|
+
except WebexError as e:
|
|
158
|
+
handle_rest_error(e)
|
|
159
|
+
if output == "json":
|
|
160
|
+
print_json(result)
|
|
161
|
+
else:
|
|
162
|
+
if isinstance(result, dict):
|
|
163
|
+
print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
|
|
164
|
+
elif isinstance(result, list):
|
|
165
|
+
print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
|
|
166
|
+
else:
|
|
167
|
+
print_json(result)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
@app.command("switch-to-normal")
|
|
172
|
+
def switch_to_normal(
|
|
173
|
+
feature_id: str = typer.Argument(help="featureId"),
|
|
174
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body"),
|
|
175
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
176
|
+
):
|
|
177
|
+
"""Switch to Normal Operation."""
|
|
178
|
+
api = get_api(debug=debug)
|
|
179
|
+
url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/{feature_id}/actions/switchToNormalOperation/invoke"
|
|
180
|
+
if json_body:
|
|
181
|
+
body = json.loads(json_body)
|
|
182
|
+
else:
|
|
183
|
+
body = {}
|
|
184
|
+
try:
|
|
185
|
+
result = api.session.rest_post(url, json=body)
|
|
186
|
+
except WebexError as e:
|
|
187
|
+
handle_rest_error(e)
|
|
188
|
+
print_json(result)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
@app.command("switch-mode-for-invoke-1")
|
|
193
|
+
def switch_mode_for_invoke_1(
|
|
194
|
+
feature_id: str = typer.Argument(help="featureId"),
|
|
195
|
+
operating_mode_id: str = typer.Option(None, "--operating-mode-id", help="Operating mode ID to switch to"),
|
|
196
|
+
is_manual_switchback_enabled: str = typer.Option(None, "--is-manual-switchback-enabled", help="Determines if switch back will be manual (if true) or automa"),
|
|
197
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body"),
|
|
198
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
199
|
+
):
|
|
200
|
+
"""Switch Mode for Single Feature."""
|
|
201
|
+
api = get_api(debug=debug)
|
|
202
|
+
url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/{feature_id}/actions/switchMode/invoke"
|
|
203
|
+
if json_body:
|
|
204
|
+
body = json.loads(json_body)
|
|
205
|
+
else:
|
|
206
|
+
body = {}
|
|
207
|
+
if operating_mode_id is not None:
|
|
208
|
+
body["operatingModeId"] = operating_mode_id
|
|
209
|
+
if is_manual_switchback_enabled is not None:
|
|
210
|
+
body["isManualSwitchbackEnabled"] = is_manual_switchback_enabled
|
|
211
|
+
try:
|
|
212
|
+
result = api.session.rest_post(url, json=body)
|
|
213
|
+
except WebexError as e:
|
|
214
|
+
handle_rest_error(e)
|
|
215
|
+
print_json(result)
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
@app.command("extend-current-operating")
|
|
220
|
+
def extend_current_operating(
|
|
221
|
+
feature_id: str = typer.Argument(help="featureId"),
|
|
222
|
+
operating_mode_id: str = typer.Option(None, "--operating-mode-id", help="Unique identifier for the operating mode for which the exten"),
|
|
223
|
+
extension_time: str = typer.Option(None, "--extension-time", help="Extension time in minutes (must be multiple of 30). If not s"),
|
|
224
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body"),
|
|
225
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
226
|
+
):
|
|
227
|
+
"""Extend Current Operating Mode Duration."""
|
|
228
|
+
api = get_api(debug=debug)
|
|
229
|
+
url = f"https://webexapis.com/v1/telephony/config/people/me/settings/modeManagement/features/{feature_id}/actions/extendMode/invoke"
|
|
230
|
+
if json_body:
|
|
231
|
+
body = json.loads(json_body)
|
|
232
|
+
else:
|
|
233
|
+
body = {}
|
|
234
|
+
if operating_mode_id is not None:
|
|
235
|
+
body["operatingModeId"] = operating_mode_id
|
|
236
|
+
if extension_time is not None:
|
|
237
|
+
body["extensionTime"] = extension_time
|
|
238
|
+
try:
|
|
239
|
+
result = api.session.rest_post(url, json=body)
|
|
240
|
+
except WebexError as e:
|
|
241
|
+
handle_rest_error(e)
|
|
242
|
+
print_json(result)
|
|
243
|
+
|
|
244
|
+
|