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,295 @@
|
|
|
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-contact-number.")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@app.command("create")
|
|
13
|
+
def create(
|
|
14
|
+
organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. It is required to def"),
|
|
15
|
+
id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
|
|
16
|
+
version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
|
|
17
|
+
number: str = typer.Option(None, "--number", help="(required) The customized ani number."),
|
|
18
|
+
created_time: str = typer.Option(None, "--created-time", help="Creation time(in epoch millis) of this resource."),
|
|
19
|
+
last_updated_time: str = typer.Option(None, "--last-updated-time", help="Time(in epoch millis) when this resource was last updated."),
|
|
20
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
21
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
22
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
23
|
+
):
|
|
24
|
+
"""Create a new Contact Number."""
|
|
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}/contact-number"
|
|
29
|
+
if json_body:
|
|
30
|
+
body = json.loads(json_body)
|
|
31
|
+
else:
|
|
32
|
+
body = {}
|
|
33
|
+
if organization_id is not None:
|
|
34
|
+
body["organizationId"] = organization_id
|
|
35
|
+
if id_param is not None:
|
|
36
|
+
body["id"] = id_param
|
|
37
|
+
if version is not None:
|
|
38
|
+
body["version"] = version
|
|
39
|
+
if number is not None:
|
|
40
|
+
body["number"] = number
|
|
41
|
+
if created_time is not None:
|
|
42
|
+
body["createdTime"] = created_time
|
|
43
|
+
if last_updated_time is not None:
|
|
44
|
+
body["lastUpdatedTime"] = last_updated_time
|
|
45
|
+
_missing = [f for f in ['number'] if f not in body or body[f] is None]
|
|
46
|
+
if _missing:
|
|
47
|
+
typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
|
|
48
|
+
raise typer.Exit(1)
|
|
49
|
+
try:
|
|
50
|
+
result = api.session.rest_post(url, json=body)
|
|
51
|
+
except WebexError as e:
|
|
52
|
+
handle_rest_error(e)
|
|
53
|
+
if output == "json":
|
|
54
|
+
print_json(result)
|
|
55
|
+
elif isinstance(result, dict) and "id" in result:
|
|
56
|
+
typer.echo(f"Created: {result['id']}")
|
|
57
|
+
elif not result or result == {}:
|
|
58
|
+
typer.echo("Created.")
|
|
59
|
+
else:
|
|
60
|
+
print_json(result)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@app.command("list")
|
|
65
|
+
def cmd_list(
|
|
66
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
67
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
68
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
69
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
70
|
+
):
|
|
71
|
+
"""List all contact numbers(property - number)."""
|
|
72
|
+
api = get_api(debug=debug)
|
|
73
|
+
cc_base_url = get_cc_base_url()
|
|
74
|
+
orgid = get_cc_org_id(api.session)
|
|
75
|
+
url = f"{cc_base_url}/organization/{orgid}/contact-number/all-numbers"
|
|
76
|
+
params = {}
|
|
77
|
+
if limit > 0:
|
|
78
|
+
params["max"] = limit
|
|
79
|
+
if offset > 0:
|
|
80
|
+
params["start"] = offset
|
|
81
|
+
result = None
|
|
82
|
+
try:
|
|
83
|
+
result = api.session.rest_get(url, params=params)
|
|
84
|
+
except WebexError as e:
|
|
85
|
+
handle_rest_error(e)
|
|
86
|
+
result = result or []
|
|
87
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
88
|
+
if output == "json":
|
|
89
|
+
print_json(items)
|
|
90
|
+
else:
|
|
91
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@app.command("create-bulk")
|
|
96
|
+
def create_bulk(
|
|
97
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
98
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
99
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
100
|
+
):
|
|
101
|
+
"""Bulk save Contact Number(s)\n\nExample --json-body:\n '{"items":[{"itemIdentifier":"...","item":"...","requestAction":"..."}]}'."""
|
|
102
|
+
api = get_api(debug=debug)
|
|
103
|
+
cc_base_url = get_cc_base_url()
|
|
104
|
+
orgid = get_cc_org_id(api.session)
|
|
105
|
+
url = f"{cc_base_url}/organization/{orgid}/contact-number/bulk"
|
|
106
|
+
if json_body:
|
|
107
|
+
body = json.loads(json_body)
|
|
108
|
+
else:
|
|
109
|
+
body = {}
|
|
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("list-bulk-export")
|
|
126
|
+
def list_bulk_export(
|
|
127
|
+
page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
|
|
128
|
+
page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
|
|
129
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
130
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
131
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
132
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
133
|
+
):
|
|
134
|
+
"""Bulk export Contact Number(s)."""
|
|
135
|
+
api = get_api(debug=debug)
|
|
136
|
+
cc_base_url = get_cc_base_url()
|
|
137
|
+
orgid = get_cc_org_id(api.session)
|
|
138
|
+
url = f"{cc_base_url}/organization/{orgid}/contact-number/bulk-export"
|
|
139
|
+
params = {}
|
|
140
|
+
if page is not None:
|
|
141
|
+
params["page"] = page
|
|
142
|
+
if page_size is not None:
|
|
143
|
+
params["pageSize"] = page_size
|
|
144
|
+
if limit > 0:
|
|
145
|
+
params["max"] = limit
|
|
146
|
+
if offset > 0:
|
|
147
|
+
params["start"] = offset
|
|
148
|
+
result = None
|
|
149
|
+
try:
|
|
150
|
+
result = api.session.rest_get(url, params=params)
|
|
151
|
+
except WebexError as e:
|
|
152
|
+
handle_rest_error(e)
|
|
153
|
+
result = result or []
|
|
154
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
155
|
+
if output == "json":
|
|
156
|
+
print_json(items)
|
|
157
|
+
else:
|
|
158
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
@app.command("show")
|
|
163
|
+
def show(
|
|
164
|
+
id: str = typer.Argument(help="id"),
|
|
165
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
166
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
167
|
+
):
|
|
168
|
+
"""Get specific Contact Number by ID."""
|
|
169
|
+
api = get_api(debug=debug)
|
|
170
|
+
cc_base_url = get_cc_base_url()
|
|
171
|
+
orgid = get_cc_org_id(api.session)
|
|
172
|
+
url = f"{cc_base_url}/organization/{orgid}/contact-number/{id}"
|
|
173
|
+
try:
|
|
174
|
+
result = api.session.rest_get(url)
|
|
175
|
+
except WebexError as e:
|
|
176
|
+
handle_rest_error(e)
|
|
177
|
+
if output == "json":
|
|
178
|
+
print_json(result)
|
|
179
|
+
else:
|
|
180
|
+
if isinstance(result, dict):
|
|
181
|
+
print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
|
|
182
|
+
elif isinstance(result, list):
|
|
183
|
+
print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
|
|
184
|
+
else:
|
|
185
|
+
print_json(result)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
@app.command("update")
|
|
190
|
+
def update(
|
|
191
|
+
id: str = typer.Argument(help="id"),
|
|
192
|
+
organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. It is required to def"),
|
|
193
|
+
id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
|
|
194
|
+
version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
|
|
195
|
+
number: str = typer.Option(None, "--number", help="The customized ani number."),
|
|
196
|
+
created_time: str = typer.Option(None, "--created-time", help="Creation time(in epoch millis) of this resource."),
|
|
197
|
+
last_updated_time: str = typer.Option(None, "--last-updated-time", help="Time(in epoch millis) when this resource was last updated."),
|
|
198
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
199
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
200
|
+
):
|
|
201
|
+
"""Update specific Contact Number by ID."""
|
|
202
|
+
api = get_api(debug=debug)
|
|
203
|
+
cc_base_url = get_cc_base_url()
|
|
204
|
+
orgid = get_cc_org_id(api.session)
|
|
205
|
+
url = f"{cc_base_url}/organization/{orgid}/contact-number/{id}"
|
|
206
|
+
if json_body:
|
|
207
|
+
body = json.loads(json_body)
|
|
208
|
+
else:
|
|
209
|
+
body = {}
|
|
210
|
+
if organization_id is not None:
|
|
211
|
+
body["organizationId"] = organization_id
|
|
212
|
+
if id_param is not None:
|
|
213
|
+
body["id"] = id_param
|
|
214
|
+
if version is not None:
|
|
215
|
+
body["version"] = version
|
|
216
|
+
if number is not None:
|
|
217
|
+
body["number"] = number
|
|
218
|
+
if created_time is not None:
|
|
219
|
+
body["createdTime"] = created_time
|
|
220
|
+
if last_updated_time is not None:
|
|
221
|
+
body["lastUpdatedTime"] = last_updated_time
|
|
222
|
+
try:
|
|
223
|
+
result = api.session.rest_put(url, json=body)
|
|
224
|
+
except WebexError as e:
|
|
225
|
+
handle_rest_error(e)
|
|
226
|
+
typer.echo(f"Updated.")
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
@app.command("delete")
|
|
231
|
+
def delete(
|
|
232
|
+
id: str = typer.Argument(help="id"),
|
|
233
|
+
force: bool = typer.Option(False, "--force", help="Skip confirmation"),
|
|
234
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
235
|
+
):
|
|
236
|
+
"""Delete specific Contact Number by ID."""
|
|
237
|
+
if not force:
|
|
238
|
+
typer.confirm(f"Delete {id}?", abort=True)
|
|
239
|
+
api = get_api(debug=debug)
|
|
240
|
+
cc_base_url = get_cc_base_url()
|
|
241
|
+
orgid = get_cc_org_id(api.session)
|
|
242
|
+
url = f"{cc_base_url}/organization/{orgid}/contact-number/{id}"
|
|
243
|
+
try:
|
|
244
|
+
api.session.rest_delete(url)
|
|
245
|
+
except WebexError as e:
|
|
246
|
+
handle_rest_error(e)
|
|
247
|
+
typer.echo(f"Deleted: {id}")
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
@app.command("list-contact-number")
|
|
252
|
+
def list_contact_number(
|
|
253
|
+
filter_param: str = typer.Option(None, "--filter", help="Specify a filter based on which the results will be fetched."),
|
|
254
|
+
attributes: str = typer.Option(None, "--attributes", help="Specify the attributes to be returned.Default all attributes"),
|
|
255
|
+
search: str = typer.Option(None, "--search", help="Filter data based on the search keyword."),
|
|
256
|
+
page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
|
|
257
|
+
page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
|
|
258
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
259
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
260
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
261
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
262
|
+
):
|
|
263
|
+
"""List Contact Number(s)."""
|
|
264
|
+
api = get_api(debug=debug)
|
|
265
|
+
cc_base_url = get_cc_base_url()
|
|
266
|
+
orgid = get_cc_org_id(api.session)
|
|
267
|
+
url = f"{cc_base_url}/organization/{orgid}/v2/contact-number"
|
|
268
|
+
params = {}
|
|
269
|
+
if filter_param is not None:
|
|
270
|
+
params["filter"] = filter_param
|
|
271
|
+
if attributes is not None:
|
|
272
|
+
params["attributes"] = attributes
|
|
273
|
+
if search is not None:
|
|
274
|
+
params["search"] = search
|
|
275
|
+
if page is not None:
|
|
276
|
+
params["page"] = page
|
|
277
|
+
if page_size is not None:
|
|
278
|
+
params["pageSize"] = page_size
|
|
279
|
+
if limit > 0:
|
|
280
|
+
params["max"] = limit
|
|
281
|
+
if offset > 0:
|
|
282
|
+
params["start"] = offset
|
|
283
|
+
result = None
|
|
284
|
+
try:
|
|
285
|
+
result = api.session.rest_get(url, params=params)
|
|
286
|
+
except WebexError as e:
|
|
287
|
+
handle_rest_error(e)
|
|
288
|
+
result = result or []
|
|
289
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
290
|
+
if output == "json":
|
|
291
|
+
print_json(items)
|
|
292
|
+
else:
|
|
293
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
294
|
+
|
|
295
|
+
|
|
@@ -0,0 +1,235 @@
|
|
|
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-data-sources.")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@app.command("create")
|
|
13
|
+
def create(
|
|
14
|
+
audience: str = typer.Option(None, "--audience", help="The audience field in the JWT token. Usually, the DAPs app n"),
|
|
15
|
+
nonce: str = typer.Option(None, "--nonce", help="Unique nonce used in the encryption of the JWT token."),
|
|
16
|
+
schema_id: str = typer.Option(None, "--schema-id", help="The schema id used for the data exchange."),
|
|
17
|
+
subject: str = typer.Option(None, "--subject", help="Rhe subject field in the JWT token. Usually, an indication o"),
|
|
18
|
+
token_lifetime_minutes: str = typer.Option(None, "--token-lifetime-minutes", help="The validity of the created token in minutes. Before the tok"),
|
|
19
|
+
url: str = typer.Option(None, "--url", help="The URL of the endpoint where Webex will send the data."),
|
|
20
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
21
|
+
output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
|
|
22
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
23
|
+
):
|
|
24
|
+
"""Register a Data Source."""
|
|
25
|
+
api = get_api(debug=debug)
|
|
26
|
+
cc_base_url = get_cc_base_url()
|
|
27
|
+
url = f"{cc_base_url}/dataSources"
|
|
28
|
+
if json_body:
|
|
29
|
+
body = json.loads(json_body)
|
|
30
|
+
else:
|
|
31
|
+
body = {}
|
|
32
|
+
if audience is not None:
|
|
33
|
+
body["audience"] = audience
|
|
34
|
+
if nonce is not None:
|
|
35
|
+
body["nonce"] = nonce
|
|
36
|
+
if schema_id is not None:
|
|
37
|
+
body["schemaId"] = schema_id
|
|
38
|
+
if subject is not None:
|
|
39
|
+
body["subject"] = subject
|
|
40
|
+
if token_lifetime_minutes is not None:
|
|
41
|
+
body["tokenLifetimeMinutes"] = token_lifetime_minutes
|
|
42
|
+
if url is not None:
|
|
43
|
+
body["url"] = url
|
|
44
|
+
try:
|
|
45
|
+
result = api.session.rest_post(url, json=body)
|
|
46
|
+
except WebexError as e:
|
|
47
|
+
handle_rest_error(e)
|
|
48
|
+
if output == "json":
|
|
49
|
+
print_json(result)
|
|
50
|
+
elif isinstance(result, dict) and "id" in result:
|
|
51
|
+
typer.echo(f"Created: {result['id']}")
|
|
52
|
+
elif not result or result == {}:
|
|
53
|
+
typer.echo("Created.")
|
|
54
|
+
else:
|
|
55
|
+
print_json(result)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@app.command("list")
|
|
60
|
+
def cmd_list(
|
|
61
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
62
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
63
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
64
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
65
|
+
):
|
|
66
|
+
"""Retrieve All Data Sources."""
|
|
67
|
+
api = get_api(debug=debug)
|
|
68
|
+
cc_base_url = get_cc_base_url()
|
|
69
|
+
url = f"{cc_base_url}/dataSources/"
|
|
70
|
+
params = {}
|
|
71
|
+
if limit > 0:
|
|
72
|
+
params["max"] = limit
|
|
73
|
+
if offset > 0:
|
|
74
|
+
params["start"] = offset
|
|
75
|
+
result = None
|
|
76
|
+
try:
|
|
77
|
+
result = api.session.rest_get(url, params=params)
|
|
78
|
+
except WebexError as e:
|
|
79
|
+
handle_rest_error(e)
|
|
80
|
+
result = result or []
|
|
81
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
82
|
+
if output == "json":
|
|
83
|
+
print_json(items)
|
|
84
|
+
else:
|
|
85
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@app.command("list-schemas")
|
|
90
|
+
def list_schemas(
|
|
91
|
+
output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
|
|
92
|
+
limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
|
|
93
|
+
offset: int = typer.Option(0, "--offset", help="Start offset"),
|
|
94
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
95
|
+
):
|
|
96
|
+
"""Retrieve Data Source Schemas."""
|
|
97
|
+
api = get_api(debug=debug)
|
|
98
|
+
cc_base_url = get_cc_base_url()
|
|
99
|
+
url = f"{cc_base_url}/dataSources/schemas"
|
|
100
|
+
params = {}
|
|
101
|
+
if limit > 0:
|
|
102
|
+
params["max"] = limit
|
|
103
|
+
if offset > 0:
|
|
104
|
+
params["start"] = offset
|
|
105
|
+
result = None
|
|
106
|
+
try:
|
|
107
|
+
result = api.session.rest_get(url, params=params)
|
|
108
|
+
except WebexError as e:
|
|
109
|
+
handle_rest_error(e)
|
|
110
|
+
result = result or []
|
|
111
|
+
items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
|
|
112
|
+
if output == "json":
|
|
113
|
+
print_json(items)
|
|
114
|
+
else:
|
|
115
|
+
print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
@app.command("show")
|
|
120
|
+
def show(
|
|
121
|
+
schema_id: str = typer.Argument(help="schemaId"),
|
|
122
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
123
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
124
|
+
):
|
|
125
|
+
"""Retrieve Details of a Specific Data Source Schema."""
|
|
126
|
+
api = get_api(debug=debug)
|
|
127
|
+
cc_base_url = get_cc_base_url()
|
|
128
|
+
url = f"{cc_base_url}/dataSources/schemas/{schema_id}"
|
|
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-data-sources")
|
|
146
|
+
def show_data_sources(
|
|
147
|
+
data_source_id: str = typer.Argument(help="dataSourceId"),
|
|
148
|
+
output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
|
|
149
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
150
|
+
):
|
|
151
|
+
"""Retrieve Data Source Details."""
|
|
152
|
+
api = get_api(debug=debug)
|
|
153
|
+
cc_base_url = get_cc_base_url()
|
|
154
|
+
url = f"{cc_base_url}/dataSources/{data_source_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("update")
|
|
172
|
+
def update(
|
|
173
|
+
data_source_id: str = typer.Argument(help="dataSourceId"),
|
|
174
|
+
audience: str = typer.Option(None, "--audience", help="The audience field in the JWT token. Usually, the DAPs app n"),
|
|
175
|
+
error_message: str = typer.Option(None, "--error-message", help="Error Message shown in Control Hub when status is set to `di"),
|
|
176
|
+
nonce: str = typer.Option(None, "--nonce", help="Unique nonce used in the encryption of the JWT token."),
|
|
177
|
+
schema_id: str = typer.Option(None, "--schema-id", help="The schema id used for the data exchange."),
|
|
178
|
+
status: str = typer.Option(None, "--status", help="The status of the Data Source; `active` or `disabled`."),
|
|
179
|
+
subject: str = typer.Option(None, "--subject", help="The subject field in the JWT token. Usually, an indication o"),
|
|
180
|
+
token_lifetime_minutes: str = typer.Option(None, "--token-lifetime-minutes", help="The validity of the created token in minutes. Before the tok"),
|
|
181
|
+
url: str = typer.Option(None, "--url", help="The URL of the endpoint where Webex will send the data."),
|
|
182
|
+
json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
|
|
183
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
184
|
+
):
|
|
185
|
+
"""Update a Data Source."""
|
|
186
|
+
api = get_api(debug=debug)
|
|
187
|
+
cc_base_url = get_cc_base_url()
|
|
188
|
+
url = f"{cc_base_url}/dataSources/{data_source_id}"
|
|
189
|
+
if json_body:
|
|
190
|
+
body = json.loads(json_body)
|
|
191
|
+
else:
|
|
192
|
+
body = {}
|
|
193
|
+
if audience is not None:
|
|
194
|
+
body["audience"] = audience
|
|
195
|
+
if error_message is not None:
|
|
196
|
+
body["errorMessage"] = error_message
|
|
197
|
+
if nonce is not None:
|
|
198
|
+
body["nonce"] = nonce
|
|
199
|
+
if schema_id is not None:
|
|
200
|
+
body["schemaId"] = schema_id
|
|
201
|
+
if status is not None:
|
|
202
|
+
body["status"] = status
|
|
203
|
+
if subject is not None:
|
|
204
|
+
body["subject"] = subject
|
|
205
|
+
if token_lifetime_minutes is not None:
|
|
206
|
+
body["tokenLifetimeMinutes"] = token_lifetime_minutes
|
|
207
|
+
if url is not None:
|
|
208
|
+
body["url"] = url
|
|
209
|
+
try:
|
|
210
|
+
result = api.session.rest_put(url, json=body)
|
|
211
|
+
except WebexError as e:
|
|
212
|
+
handle_rest_error(e)
|
|
213
|
+
typer.echo(f"Updated.")
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
@app.command("delete")
|
|
218
|
+
def delete(
|
|
219
|
+
data_source_id: str = typer.Argument(help="dataSourceId"),
|
|
220
|
+
force: bool = typer.Option(False, "--force", help="Skip confirmation"),
|
|
221
|
+
debug: bool = typer.Option(False, "--debug"),
|
|
222
|
+
):
|
|
223
|
+
"""Delete a Data Source."""
|
|
224
|
+
if not force:
|
|
225
|
+
typer.confirm(f"Delete {data_source_id}?", abort=True)
|
|
226
|
+
api = get_api(debug=debug)
|
|
227
|
+
cc_base_url = get_cc_base_url()
|
|
228
|
+
url = f"{cc_base_url}/dataSources/{data_source_id}"
|
|
229
|
+
try:
|
|
230
|
+
api.session.rest_delete(url)
|
|
231
|
+
except WebexError as e:
|
|
232
|
+
handle_rest_error(e)
|
|
233
|
+
typer.echo(f"Deleted: {data_source_id}")
|
|
234
|
+
|
|
235
|
+
|