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
wxcli/commands/events.py
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
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 events.")
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@app.command("list")
|
|
12
|
+
def cmd_list(
|
|
13
|
+
resource: str = typer.Option(None, "--resource", help="List events with a specific resource type. (use --help for choices)"),
|
|
14
|
+
type_param: str = typer.Option(None, "--type", help="Choices: created, updated, deleted, ended"),
|
|
15
|
+
actor_id: str = typer.Option(None, "--actor-id", help="List events performed by this person, by person ID."),
|
|
16
|
+
from_param: str = typer.Option(None, "--from", help="List events which occurred after a specific date and time."),
|
|
17
|
+
to: str = typer.Option(None, "--to", help="List events that occurred before a specific date and time. I"),
|
|
18
|
+
service_type: str = typer.Option(None, "--service-type", help="Choices: calling"),
|
|
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 Events."""
|
|
25
|
+
api = get_api(debug=debug)
|
|
26
|
+
url = f"https://webexapis.com/v1/events"
|
|
27
|
+
params = {}
|
|
28
|
+
if resource is not None:
|
|
29
|
+
params["resource"] = resource
|
|
30
|
+
if type_param is not None:
|
|
31
|
+
params["type"] = type_param
|
|
32
|
+
if actor_id is not None:
|
|
33
|
+
params["actorId"] = actor_id
|
|
34
|
+
if from_param is not None:
|
|
35
|
+
params["from"] = from_param
|
|
36
|
+
if to is not None:
|
|
37
|
+
params["to"] = to
|
|
38
|
+
if service_type is not None:
|
|
39
|
+
params["serviceType"] = service_type
|
|
40
|
+
if limit > 0:
|
|
41
|
+
params["max"] = limit
|
|
42
|
+
if offset > 0:
|
|
43
|
+
params["start"] = offset
|
|
44
|
+
try:
|
|
45
|
+
if limit > 0:
|
|
46
|
+
result = api.session.rest_get(url, params=params)
|
|
47
|
+
result = result or {}
|
|
48
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
49
|
+
else:
|
|
50
|
+
items = list(api.session.follow_pagination(url=url, params=params, item_key="items"))
|
|
51
|
+
except WebexError as e:
|
|
52
|
+
handle_rest_error(e)
|
|
53
|
+
if output == "json":
|
|
54
|
+
print_json(items)
|
|
55
|
+
else:
|
|
56
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@app.command("show")
|
|
61
|
+
def show(
|
|
62
|
+
event_id: str = typer.Argument(help="eventId"),
|
|
63
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
64
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
65
|
+
):
|
|
66
|
+
"""Get Event Details."""
|
|
67
|
+
api = get_api(debug=debug)
|
|
68
|
+
url = f"https://webexapis.com/v1/events/{event_id}"
|
|
69
|
+
try:
|
|
70
|
+
result = api.session.rest_get(url)
|
|
71
|
+
except WebexError as e:
|
|
72
|
+
handle_rest_error(e)
|
|
73
|
+
if output == "json":
|
|
74
|
+
print_json(result)
|
|
75
|
+
else:
|
|
76
|
+
if isinstance(result, dict):
|
|
77
|
+
print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
|
|
78
|
+
elif isinstance(result, list):
|
|
79
|
+
print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
|
|
80
|
+
else:
|
|
81
|
+
print_json(result)
|
|
82
|
+
|
|
83
|
+
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import typer
|
|
3
|
+
from wxcli.auth import get_api
|
|
4
|
+
from wxcli.errors import WebexError, handle_rest_error
|
|
5
|
+
from wxcli.output import print_table, print_json
|
|
6
|
+
from wxcli.config import get_org_id
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
app = typer.Typer(help="Manage Webex Calling external-voicemail.")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@app.command("create")
|
|
13
|
+
def create(
|
|
14
|
+
id_param: str = typer.Option(..., "--id", help="Unique identifier for the user or workspace."),
|
|
15
|
+
action: str = typer.Option(None, "--action", help="(required) Choices: SET, CLEAR"),
|
|
16
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
17
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
18
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
19
|
+
):
|
|
20
|
+
"""Set or Clear Message Waiting Indicator (MWI) Status."""
|
|
21
|
+
api = get_api(debug=debug)
|
|
22
|
+
url = f"https://webexapis.com/v1/telephony/externalVoicemail/mwi"
|
|
23
|
+
params = {}
|
|
24
|
+
if id_param is not None:
|
|
25
|
+
params["id"] = id_param
|
|
26
|
+
org_id = get_org_id()
|
|
27
|
+
if org_id is not None:
|
|
28
|
+
params["orgId"] = org_id
|
|
29
|
+
if json_body:
|
|
30
|
+
body = json.loads(json_body)
|
|
31
|
+
else:
|
|
32
|
+
body = {}
|
|
33
|
+
if action is not None:
|
|
34
|
+
body["action"] = action
|
|
35
|
+
_missing = [f for f in ['action'] if f not in body or body[f] is None]
|
|
36
|
+
if _missing:
|
|
37
|
+
typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
|
|
38
|
+
raise typer.Exit(1)
|
|
39
|
+
try:
|
|
40
|
+
result = api.session.rest_post(url, json=body, params=params)
|
|
41
|
+
except WebexError as e:
|
|
42
|
+
handle_rest_error(e)
|
|
43
|
+
if output == "json":
|
|
44
|
+
print_json(result)
|
|
45
|
+
elif isinstance(result, dict) and "id" in result:
|
|
46
|
+
typer.echo(f"Created: {result['id']}")
|
|
47
|
+
elif not result or result == {}:
|
|
48
|
+
typer.echo("Created.")
|
|
49
|
+
else:
|
|
50
|
+
print_json(result)
|
|
51
|
+
|
|
52
|
+
|
wxcli/commands/groups.py
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import typer
|
|
3
|
+
from wxcli.auth import get_api
|
|
4
|
+
from wxcli.errors import WebexError, handle_rest_error
|
|
5
|
+
from wxcli.output import print_table, print_json
|
|
6
|
+
from wxcli.config import get_org_id
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
app = typer.Typer(help="Manage Webex Calling groups.")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@app.command("list")
|
|
13
|
+
def cmd_list(
|
|
14
|
+
filter_param: str = typer.Option(None, "--filter", help="Searches the group by `displayName` with an operator and a v"),
|
|
15
|
+
attributes: str = typer.Option(None, "--attributes", help="The attributes to return."),
|
|
16
|
+
sort_by: str = typer.Option(None, "--sort-by", help="Sort the results based by group `displayName`."),
|
|
17
|
+
sort_order: str = typer.Option(None, "--sort-order", help="Sort results alphabetically by group display name, in ascend"),
|
|
18
|
+
include_members: str = typer.Option(None, "--include-members", help="Optionally return group members in the response. The maximum"),
|
|
19
|
+
start_index: str = typer.Option(None, "--start-index", help="The index to start for group pagination."),
|
|
20
|
+
count: str = typer.Option(None, "--count", help="Specifies the desired number of search results per page."),
|
|
21
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
22
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
23
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
24
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
25
|
+
):
|
|
26
|
+
"""List and Search Groups."""
|
|
27
|
+
api = get_api(debug=debug)
|
|
28
|
+
url = f"https://webexapis.com/v1/groups"
|
|
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 sort_by is not None:
|
|
35
|
+
params["sortBy"] = sort_by
|
|
36
|
+
if sort_order is not None:
|
|
37
|
+
params["sortOrder"] = sort_order
|
|
38
|
+
if include_members is not None:
|
|
39
|
+
params["includeMembers"] = include_members
|
|
40
|
+
if start_index is not None:
|
|
41
|
+
params["startIndex"] = start_index
|
|
42
|
+
if count is not None:
|
|
43
|
+
params["count"] = count
|
|
44
|
+
if limit > 0:
|
|
45
|
+
params["max"] = limit
|
|
46
|
+
if offset > 0:
|
|
47
|
+
params["start"] = offset
|
|
48
|
+
org_id = get_org_id()
|
|
49
|
+
if org_id is not None:
|
|
50
|
+
params["orgId"] = org_id
|
|
51
|
+
result = None
|
|
52
|
+
try:
|
|
53
|
+
result = api.session.rest_get(url, params=params)
|
|
54
|
+
except WebexError as e:
|
|
55
|
+
handle_rest_error(e)
|
|
56
|
+
result = result or []
|
|
57
|
+
items = result.get("groups", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
58
|
+
if output == "json":
|
|
59
|
+
print_json(items)
|
|
60
|
+
else:
|
|
61
|
+
print_table(items, columns=[('ID', 'id'), ('Display Name', 'displayName'), ('Member Count', 'memberSize')], limit=limit)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@app.command("create")
|
|
66
|
+
def create(
|
|
67
|
+
display_name: str = typer.Option(None, "--display-name", help="(required) A human-readable name for the Group."),
|
|
68
|
+
external_id: str = typer.Option(None, "--external-id", help="An identifier for the resource as defined by the provisionin"),
|
|
69
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
70
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
71
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
72
|
+
):
|
|
73
|
+
"""Create a Group\n\nExample --json-body:\n '{"schemas":["..."],"displayName":"...","externalId":"...","members":[{"value":"...","type":"..."}],"urn:scim:schemas:extension:cisco:webexidentity:2.0:Group":{"usage":"...","owners":["..."],"inheritances":["..."],"managedBy":["..."]}}'."""
|
|
74
|
+
api = get_api(debug=debug)
|
|
75
|
+
url = f"https://webexapis.com/v1/groups"
|
|
76
|
+
if json_body:
|
|
77
|
+
body = json.loads(json_body)
|
|
78
|
+
else:
|
|
79
|
+
body = {}
|
|
80
|
+
if display_name is not None:
|
|
81
|
+
body["displayName"] = display_name
|
|
82
|
+
if external_id is not None:
|
|
83
|
+
body["externalId"] = external_id
|
|
84
|
+
_missing = [f for f in ['displayName'] if f not in body or body[f] is None]
|
|
85
|
+
if _missing:
|
|
86
|
+
typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
|
|
87
|
+
raise typer.Exit(1)
|
|
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("show")
|
|
104
|
+
def show(
|
|
105
|
+
group_id: str = typer.Argument(help="groupId"),
|
|
106
|
+
include_members: str = typer.Option(None, "--include-members", help="Include the members as part of the response."),
|
|
107
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
108
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
109
|
+
):
|
|
110
|
+
"""Get Group Details."""
|
|
111
|
+
api = get_api(debug=debug)
|
|
112
|
+
url = f"https://webexapis.com/v1/groups/{group_id}"
|
|
113
|
+
params = {}
|
|
114
|
+
if include_members is not None:
|
|
115
|
+
params["includeMembers"] = include_members
|
|
116
|
+
try:
|
|
117
|
+
result = api.session.rest_get(url, params=params)
|
|
118
|
+
except WebexError as e:
|
|
119
|
+
handle_rest_error(e)
|
|
120
|
+
if output == "json":
|
|
121
|
+
print_json(result)
|
|
122
|
+
else:
|
|
123
|
+
if isinstance(result, dict):
|
|
124
|
+
print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
|
|
125
|
+
elif isinstance(result, list):
|
|
126
|
+
print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
|
|
127
|
+
else:
|
|
128
|
+
print_json(result)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
@app.command("update")
|
|
133
|
+
def update(
|
|
134
|
+
group_id: str = typer.Argument(help="groupId"),
|
|
135
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
136
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
137
|
+
):
|
|
138
|
+
"""Update a Group\n\nExample --json-body:\n '{"schemas":["..."],"Operations":[{"op":"...","path":"...","value":"..."}]}'."""
|
|
139
|
+
api = get_api(debug=debug)
|
|
140
|
+
url = f"https://webexapis.com/v1/groups/{group_id}"
|
|
141
|
+
if json_body:
|
|
142
|
+
body = json.loads(json_body)
|
|
143
|
+
else:
|
|
144
|
+
body = {}
|
|
145
|
+
try:
|
|
146
|
+
result = api.session.rest_patch(url, json=body)
|
|
147
|
+
except WebexError as e:
|
|
148
|
+
handle_rest_error(e)
|
|
149
|
+
typer.echo(f"Updated.")
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@app.command("delete")
|
|
154
|
+
def delete(
|
|
155
|
+
group_id: str = typer.Argument(help="groupId"),
|
|
156
|
+
force: bool = typer.Option(False, "--force", help="Skip confirmation"),
|
|
157
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
158
|
+
):
|
|
159
|
+
"""Delete a Group."""
|
|
160
|
+
if not force:
|
|
161
|
+
typer.confirm(f"Delete {group_id}?", abort=True)
|
|
162
|
+
api = get_api(debug=debug)
|
|
163
|
+
url = f"https://webexapis.com/v1/groups/{group_id}"
|
|
164
|
+
try:
|
|
165
|
+
api.session.rest_delete(url)
|
|
166
|
+
except WebexError as e:
|
|
167
|
+
handle_rest_error(e)
|
|
168
|
+
typer.echo(f"Deleted: {group_id}")
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
@app.command("list-members")
|
|
173
|
+
def list_members(
|
|
174
|
+
group_id: str = typer.Argument(help="groupId"),
|
|
175
|
+
start_index: str = typer.Option(None, "--start-index", help="The index to start for group pagination."),
|
|
176
|
+
count: str = typer.Option(None, "--count", help="Non-negative integer that specifies the desired number of se"),
|
|
177
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
178
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
179
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
180
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
181
|
+
):
|
|
182
|
+
"""Get Group Members."""
|
|
183
|
+
api = get_api(debug=debug)
|
|
184
|
+
url = f"https://webexapis.com/v1/groups/{group_id}/members"
|
|
185
|
+
params = {}
|
|
186
|
+
if start_index is not None:
|
|
187
|
+
params["startIndex"] = start_index
|
|
188
|
+
if count is not None:
|
|
189
|
+
params["count"] = count
|
|
190
|
+
if limit > 0:
|
|
191
|
+
params["max"] = limit
|
|
192
|
+
if offset > 0:
|
|
193
|
+
params["start"] = offset
|
|
194
|
+
result = None
|
|
195
|
+
try:
|
|
196
|
+
result = api.session.rest_get(url, params=params)
|
|
197
|
+
except WebexError as e:
|
|
198
|
+
handle_rest_error(e)
|
|
199
|
+
result = result or []
|
|
200
|
+
items = result.get("members", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
201
|
+
if output == "json":
|
|
202
|
+
print_json(items)
|
|
203
|
+
else:
|
|
204
|
+
print_table(items, columns=[('ID', 'id'), ('Display Name', 'displayName'), ('Member Count', 'memberSize')], limit=limit)
|
|
205
|
+
|
|
206
|
+
|
|
@@ -0,0 +1,76 @@
|
|
|
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 guest-management.")
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@app.command("create")
|
|
12
|
+
def create(
|
|
13
|
+
subject: str = typer.Option(None, "--subject", help="(required) The unique and external identifier of the guest."),
|
|
14
|
+
display_name: str = typer.Option(None, "--display-name", help="(required) The display name shown in the Webex application."),
|
|
15
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
16
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
17
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
18
|
+
):
|
|
19
|
+
"""Create a Guest."""
|
|
20
|
+
api = get_api(debug=debug)
|
|
21
|
+
url = f"https://webexapis.com/v1/guests/token"
|
|
22
|
+
if json_body:
|
|
23
|
+
body = json.loads(json_body)
|
|
24
|
+
else:
|
|
25
|
+
body = {}
|
|
26
|
+
if subject is not None:
|
|
27
|
+
body["subject"] = subject
|
|
28
|
+
if display_name is not None:
|
|
29
|
+
body["displayName"] = display_name
|
|
30
|
+
_missing = [f for f in ['subject', 'displayName'] if f not in body or body[f] is None]
|
|
31
|
+
if _missing:
|
|
32
|
+
typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
|
|
33
|
+
raise typer.Exit(1)
|
|
34
|
+
try:
|
|
35
|
+
result = api.session.rest_post(url, json=body)
|
|
36
|
+
except WebexError as e:
|
|
37
|
+
handle_rest_error(e)
|
|
38
|
+
if output == "json":
|
|
39
|
+
print_json(result)
|
|
40
|
+
elif isinstance(result, dict) and "id" in result:
|
|
41
|
+
typer.echo(f"Created: {result['id']}")
|
|
42
|
+
elif not result or result == {}:
|
|
43
|
+
typer.echo("Created.")
|
|
44
|
+
else:
|
|
45
|
+
print_json(result)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@app.command("list")
|
|
50
|
+
def cmd_list(
|
|
51
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
52
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
53
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
54
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
55
|
+
):
|
|
56
|
+
"""Get Guest Count."""
|
|
57
|
+
api = get_api(debug=debug)
|
|
58
|
+
url = f"https://webexapis.com/v1/guests/count"
|
|
59
|
+
params = {}
|
|
60
|
+
if limit > 0:
|
|
61
|
+
params["max"] = limit
|
|
62
|
+
if offset > 0:
|
|
63
|
+
params["start"] = offset
|
|
64
|
+
result = None
|
|
65
|
+
try:
|
|
66
|
+
result = api.session.rest_get(url, params=params)
|
|
67
|
+
except WebexError as e:
|
|
68
|
+
handle_rest_error(e)
|
|
69
|
+
result = result or []
|
|
70
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
71
|
+
if output == "json":
|
|
72
|
+
print_json(items)
|
|
73
|
+
else:
|
|
74
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
75
|
+
|
|
76
|
+
|