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,1150 @@
|
|
|
1
|
+
<!-- Updated by playbook session 2026-03-18 -->
|
|
2
|
+
|
|
3
|
+
# DECT Devices & Hot Desking Reference
|
|
4
|
+
|
|
5
|
+
## Sources
|
|
6
|
+
|
|
7
|
+
- wxc_sdk v1.30.0
|
|
8
|
+
- OpenAPI spec: specs/webex-device.json
|
|
9
|
+
- developer.webex.com DECT Device APIs
|
|
10
|
+
|
|
11
|
+
DECT network management (networks, base stations, handsets, line assignment) and hot desk session management via the `wxc_sdk` Python SDK.
|
|
12
|
+
|
|
13
|
+
**Not supported for Webex for Government (FedRAMP).** See [authentication.md → FedRAMP](authentication.md#webex-for-government-fedramp) for all FedRAMP restrictions.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Table of Contents
|
|
18
|
+
|
|
19
|
+
1. [Required Scopes](#required-scopes)
|
|
20
|
+
2. [API Access Path](#api-access-path)
|
|
21
|
+
3. [DECT Network Management](#dect-network-management)
|
|
22
|
+
4. [Base Station Management](#base-station-management)
|
|
23
|
+
5. [Handset Management](#handset-management)
|
|
24
|
+
6. [Association Queries](#association-queries)
|
|
25
|
+
7. [Available Members Search](#available-members-search)
|
|
26
|
+
8. [Serviceability Password](#serviceability-password)
|
|
27
|
+
9. [Hot Desking](#hot-desking)
|
|
28
|
+
10. [Data Models](#data-models)
|
|
29
|
+
11. [Raw HTTP](#raw-http)
|
|
30
|
+
12. [Common Gotchas](#common-gotchas)
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Required Scopes
|
|
35
|
+
|
|
36
|
+
| Operation | Scope(s) Required |
|
|
37
|
+
|-----------|-------------------|
|
|
38
|
+
| List/view DECT networks, base stations, handsets | `spark-admin:telephony_config_read` |
|
|
39
|
+
| Create/update/delete DECT networks, base stations, handsets | `spark-admin:telephony_config_write` |
|
|
40
|
+
| Generate serviceability password | `spark-admin:telephony_config_write` **or** `spark-admin:devices_write` |
|
|
41
|
+
| Get serviceability password status | `spark-admin:telephony_config_read` **or** `spark-admin:devices_read` |
|
|
42
|
+
| Update serviceability password status | `spark-admin:telephony_config_write` **or** `spark-admin:devices_write` |
|
|
43
|
+
| List/delete hot desk sessions | Admin token required (scopes not explicitly documented in OpenAPI spec, but the endpoints work with a full admin token). The hot desk session endpoints are at `/v1/hotdesk/sessions`, separate from the DECT/telephony config scope. |
|
|
44
|
+
|
|
45
|
+
All DECT operations require a **full or read-only administrator auth token**.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## API Access Path
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
from wxc_sdk import WebexSimpleApi
|
|
53
|
+
|
|
54
|
+
api = WebexSimpleApi(tokens='<token>')
|
|
55
|
+
|
|
56
|
+
# DECT devices API
|
|
57
|
+
dect = api.telephony.dect_devices
|
|
58
|
+
|
|
59
|
+
# Hot desk API
|
|
60
|
+
hotdesk = api.telephony.hotdesk #
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## DECT Network Management
|
|
66
|
+
|
|
67
|
+
DECT networks provide roaming voice services via base stations and wireless handsets. A network can be provisioned with up to 1000 lines across up to 254 base stations.
|
|
68
|
+
|
|
69
|
+
### Supported Device Models
|
|
70
|
+
|
|
71
|
+
| Enum Value | Display Name | Base Stations | Line Ports |
|
|
72
|
+
|------------|-------------|---------------|------------|
|
|
73
|
+
| `DECTNetworkModel.dms_cisco_dbs110` | DMS Cisco DBS110 | 1 | 30 |
|
|
74
|
+
| `DECTNetworkModel.cisco_dect_110_base` | Cisco DECT 110 Base | 1 | 30 |
|
|
75
|
+
| `DECTNetworkModel.dms_cisco_dbs210` | DMS Cisco DBS210 | 250 | 1000 |
|
|
76
|
+
| `DECTNetworkModel.cisco_dect_210_base` | Cisco DECT 210 Base | 250 | 1000 |
|
|
77
|
+
|
|
78
|
+
Only Cisco DECT device models are currently supported.
|
|
79
|
+
|
|
80
|
+
### List Supported Device Types
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
def device_type_list(
|
|
84
|
+
self,
|
|
85
|
+
org_id: str = None
|
|
86
|
+
) -> list[DectDevice]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Returns a static list of DECT device types with base station and line port counts.
|
|
90
|
+
|
|
91
|
+
### Create a DECT Network
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
def create_dect_network(
|
|
95
|
+
self,
|
|
96
|
+
location_id: str,
|
|
97
|
+
name: str,
|
|
98
|
+
model: DECTNetworkModel,
|
|
99
|
+
default_access_code_enabled: bool,
|
|
100
|
+
default_access_code: str,
|
|
101
|
+
display_name: str = None,
|
|
102
|
+
org_id: str = None
|
|
103
|
+
) -> str # returns dect_network_id
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
| Parameter | Notes |
|
|
107
|
+
|-----------|-------|
|
|
108
|
+
| `name` | Must be unique across the location. 1-40 characters. |
|
|
109
|
+
| `display_name` | Shown on handsets. 11 characters max. If omitted, defaults to indexed number + network name. |
|
|
110
|
+
| `default_access_code_enabled` | `True` = shared 4-digit access code for all users. `False` = auto-generated per-handset codes. |
|
|
111
|
+
| `default_access_code` | Required when `default_access_code_enabled` is `True`. Must be 4 numeric digits, unique within the location. |
|
|
112
|
+
|
|
113
|
+
**Note:** There is currently no public API to retrieve auto-generated access codes for handsets when `default_access_code_enabled` is `False`. Use Control Hub instead.
|
|
114
|
+
|
|
115
|
+
### List DECT Networks
|
|
116
|
+
|
|
117
|
+
```python
|
|
118
|
+
def list_dect_networks(
|
|
119
|
+
self,
|
|
120
|
+
name: str = None,
|
|
121
|
+
location_id: str = None,
|
|
122
|
+
org_id: str = None
|
|
123
|
+
) -> list[DECTNetworkDetail]
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Lists all DECT networks in an organization. Both `name` and `location_id` are optional filters.
|
|
127
|
+
|
|
128
|
+
### Get DECT Network Details
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
def dect_network_details(
|
|
132
|
+
self,
|
|
133
|
+
location_id: str,
|
|
134
|
+
dect_network_id: str,
|
|
135
|
+
org_id: str = None
|
|
136
|
+
) -> DECTNetworkDetail
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Update a DECT Network
|
|
140
|
+
|
|
141
|
+
```python
|
|
142
|
+
def update_dect_network(
|
|
143
|
+
self,
|
|
144
|
+
location_id: str,
|
|
145
|
+
dect_network_id: str,
|
|
146
|
+
name: str,
|
|
147
|
+
default_access_code_enabled: bool,
|
|
148
|
+
default_access_code: str = None,
|
|
149
|
+
display_name: str = None,
|
|
150
|
+
org_id: str = None
|
|
151
|
+
) -> None
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
`name` and `default_access_code_enabled` are required. `default_access_code` is mandatory when `default_access_code_enabled` is `True`.
|
|
155
|
+
|
|
156
|
+
### Update DECT Network from Settings Object
|
|
157
|
+
|
|
158
|
+
```python
|
|
159
|
+
def update_dect_network_settings(
|
|
160
|
+
self,
|
|
161
|
+
settings: DECTNetworkDetail,
|
|
162
|
+
org_id: str = None
|
|
163
|
+
) -> None
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Convenience method. Uses `settings.location.id` and `settings.id` to address the network. Only `name`, `display_name`, `default_access_code_enabled`, and `default_access_code` fields are sent in the update.
|
|
167
|
+
|
|
168
|
+
### Delete a DECT Network
|
|
169
|
+
|
|
170
|
+
```python
|
|
171
|
+
def delete_dect_network(
|
|
172
|
+
self,
|
|
173
|
+
location_id: str,
|
|
174
|
+
dect_network_id: str,
|
|
175
|
+
org_id: str = None
|
|
176
|
+
) -> None
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### CLI Examples
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
# List all DECT networks in the org
|
|
183
|
+
wxcli dect-devices list
|
|
184
|
+
|
|
185
|
+
# List DECT networks filtered by location
|
|
186
|
+
wxcli dect-devices list --location-id <location_id>
|
|
187
|
+
|
|
188
|
+
# List DECT networks filtered by name
|
|
189
|
+
wxcli dect-devices list --name "Building A"
|
|
190
|
+
|
|
191
|
+
# Show details of a specific DECT network
|
|
192
|
+
wxcli dect-devices show <location_id> <dect_network_id>
|
|
193
|
+
|
|
194
|
+
# Show details as JSON
|
|
195
|
+
wxcli dect-devices show <location_id> <dect_network_id> -o json
|
|
196
|
+
|
|
197
|
+
# Create a DECT network (DBS-210 multi-cell with shared access code)
|
|
198
|
+
wxcli dect-devices create <location_id> \
|
|
199
|
+
--name "Building A DECT" \
|
|
200
|
+
--model "DMS Cisco DBS210" \
|
|
201
|
+
--default-access-code-enabled \
|
|
202
|
+
--default-access-code "1234"
|
|
203
|
+
|
|
204
|
+
# Create a DECT network (DBS-110 single-cell with display name)
|
|
205
|
+
wxcli dect-devices create <location_id> \
|
|
206
|
+
--name "Lobby DECT" \
|
|
207
|
+
--model "DMS Cisco DBS110" \
|
|
208
|
+
--default-access-code-enabled \
|
|
209
|
+
--default-access-code "5678" \
|
|
210
|
+
--display-name "Lobby"
|
|
211
|
+
|
|
212
|
+
# Update a DECT network name and access code
|
|
213
|
+
wxcli dect-devices update <location_id> <dect_network_id> \
|
|
214
|
+
--name "Building A DECT v2" \
|
|
215
|
+
--default-access-code-enabled \
|
|
216
|
+
--default-access-code "9999"
|
|
217
|
+
|
|
218
|
+
# Disable shared access code (switches to per-handset auto-generated codes)
|
|
219
|
+
wxcli dect-devices update <location_id> <dect_network_id> \
|
|
220
|
+
--no-default-access-code-enabled
|
|
221
|
+
|
|
222
|
+
# Delete a DECT network (with confirmation prompt)
|
|
223
|
+
wxcli dect-devices delete <location_id> <dect_network_id>
|
|
224
|
+
|
|
225
|
+
# Delete a DECT network (skip confirmation)
|
|
226
|
+
wxcli dect-devices delete <location_id> <dect_network_id> --force
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Base Station Management
|
|
232
|
+
|
|
233
|
+
Two types of base stations:
|
|
234
|
+
- **DBS-110 (Single-Cell):** 1 base station, up to 30 line registrations
|
|
235
|
+
- **DBS-210 (Multi-Cell):** Up to 254 base stations, up to 1000 line registrations
|
|
236
|
+
|
|
237
|
+
### Create Multiple Base Stations
|
|
238
|
+
|
|
239
|
+
```python
|
|
240
|
+
def create_base_stations(
|
|
241
|
+
self,
|
|
242
|
+
location_id: str,
|
|
243
|
+
dect_id: str,
|
|
244
|
+
base_station_macs: list[str],
|
|
245
|
+
org_id: str = None
|
|
246
|
+
) -> list[BaseStationResponse]
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Pass a list of MAC addresses. Returns a list of `BaseStationResponse` objects, each containing the MAC and a result with HTTP status code and base station ID.
|
|
250
|
+
|
|
251
|
+
### List Base Stations
|
|
252
|
+
|
|
253
|
+
```python
|
|
254
|
+
def list_base_stations(
|
|
255
|
+
self,
|
|
256
|
+
location_id: str,
|
|
257
|
+
dect_network_id: str,
|
|
258
|
+
org_id: str = None
|
|
259
|
+
) -> list[BaseStationsResponse]
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Returns base station IDs, MACs, and registered line counts.
|
|
263
|
+
|
|
264
|
+
### Get Base Station Details
|
|
265
|
+
|
|
266
|
+
```python
|
|
267
|
+
def base_station_details(
|
|
268
|
+
self,
|
|
269
|
+
location_id: str,
|
|
270
|
+
dect_network_id: str,
|
|
271
|
+
base_station_id: str,
|
|
272
|
+
org_id: str = None
|
|
273
|
+
) -> BaseStationDetail
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
Returns the base station with its registered handsets and their line member details.
|
|
277
|
+
|
|
278
|
+
### Delete All Base Stations
|
|
279
|
+
|
|
280
|
+
```python
|
|
281
|
+
def delete_bulk_base_stations(
|
|
282
|
+
self,
|
|
283
|
+
location_id: str,
|
|
284
|
+
dect_network_id: str,
|
|
285
|
+
org_id: str = None
|
|
286
|
+
) -> None
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Deletes **all** base stations in the specified DECT network.
|
|
290
|
+
|
|
291
|
+
### Delete a Specific Base Station
|
|
292
|
+
|
|
293
|
+
```python
|
|
294
|
+
def delete_base_station(
|
|
295
|
+
self,
|
|
296
|
+
location_id: str,
|
|
297
|
+
dect_network_id: str,
|
|
298
|
+
base_station_id: str,
|
|
299
|
+
org_id: str = None
|
|
300
|
+
) -> None
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### CLI Examples
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
# List base stations in a DECT network
|
|
307
|
+
wxcli dect-devices list-base-stations <location_id> <dect_network_id>
|
|
308
|
+
|
|
309
|
+
# List base stations as JSON
|
|
310
|
+
wxcli dect-devices list-base-stations <location_id> <dect_network_id> -o json
|
|
311
|
+
|
|
312
|
+
# Show details of a specific base station
|
|
313
|
+
wxcli dect-devices show-base-stations <location_id> <dect_network_id> <base_station_id>
|
|
314
|
+
|
|
315
|
+
# Create base stations (bulk by MAC, requires --json-body)
|
|
316
|
+
wxcli dect-devices create-base-stations <location_id> <dect_network_id> \
|
|
317
|
+
--json-body '{"baseStationMacs":["AABBCCDDEEFF","112233445566"]}'
|
|
318
|
+
|
|
319
|
+
# Delete a specific base station
|
|
320
|
+
wxcli dect-devices delete-base-stations-dect-networks-1 <location_id> <dect_network_id> <base_station_id>
|
|
321
|
+
|
|
322
|
+
# Delete a specific base station (skip confirmation)
|
|
323
|
+
wxcli dect-devices delete-base-stations-dect-networks-1 <location_id> <dect_network_id> <base_station_id> --force
|
|
324
|
+
|
|
325
|
+
# Delete ALL base stations in a DECT network
|
|
326
|
+
wxcli dect-devices delete-base-stations-dect-networks <location_id> <dect_network_id>
|
|
327
|
+
|
|
328
|
+
# Delete ALL base stations (skip confirmation)
|
|
329
|
+
wxcli dect-devices delete-base-stations-dect-networks <location_id> <dect_network_id> --force
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## Handset Management
|
|
335
|
+
|
|
336
|
+
Each handset supports up to **2 lines**. A DECT network supports a total of 120 lines across all handsets.
|
|
337
|
+
|
|
338
|
+
- **Line 1:** Member type can be PEOPLE or PLACE
|
|
339
|
+
- **Line 2:** Member type can be PEOPLE, PLACE, or VIRTUAL_LINE
|
|
340
|
+
|
|
341
|
+
### Add a Single Handset
|
|
342
|
+
|
|
343
|
+
```python
|
|
344
|
+
def add_a_handset(
|
|
345
|
+
self,
|
|
346
|
+
location_id: str,
|
|
347
|
+
dect_network_id: str,
|
|
348
|
+
line1_member_id: str,
|
|
349
|
+
line2_member_id: str = None,
|
|
350
|
+
custom_display_name: str = None,
|
|
351
|
+
org_id: str = None
|
|
352
|
+
) -> None
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
`custom_display_name` is mandatory (1-16 characters). Raises `ValueError` if `None`.
|
|
356
|
+
|
|
357
|
+
### Add a List of Handsets (Bulk)
|
|
358
|
+
|
|
359
|
+
```python
|
|
360
|
+
def add_list_of_handsets(
|
|
361
|
+
self,
|
|
362
|
+
location_id: str,
|
|
363
|
+
dect_network_id: str,
|
|
364
|
+
items: list[AddDECTHandset],
|
|
365
|
+
org_id: str = None
|
|
366
|
+
) -> list[AddDECTHandsetBulkResponse]
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
Add up to **50 handsets** in a single call. Each `AddDECTHandset` contains `line1_member_id`, `line2_member_id` (optional), and `custom_display_name` (optional).
|
|
370
|
+
|
|
371
|
+
Returns per-item results with status codes and error details if any failed.
|
|
372
|
+
|
|
373
|
+
### List Handsets
|
|
374
|
+
|
|
375
|
+
```python
|
|
376
|
+
def list_handsets(
|
|
377
|
+
self,
|
|
378
|
+
location_id: str,
|
|
379
|
+
dect_network_id: str,
|
|
380
|
+
basestation_id: str = None,
|
|
381
|
+
member_id: str = None,
|
|
382
|
+
org_id: str = None
|
|
383
|
+
) -> DECTHandsetList
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
Returns a `DECTHandsetList` containing `number_of_handsets_assigned`, `number_of_lines_assigned`, and the list of `DECTHandsetItem` objects. Filter by `basestation_id` or `member_id`.
|
|
387
|
+
|
|
388
|
+
### Get Handset Details
|
|
389
|
+
|
|
390
|
+
```python
|
|
391
|
+
def handset_details(
|
|
392
|
+
self,
|
|
393
|
+
location_id: str,
|
|
394
|
+
dect_network_id: str,
|
|
395
|
+
handset_id: str,
|
|
396
|
+
org_id: str = None
|
|
397
|
+
) -> DECTHandsetItem
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### Update Handset (Line Assignment)
|
|
401
|
+
|
|
402
|
+
```python
|
|
403
|
+
def update_handset(
|
|
404
|
+
self,
|
|
405
|
+
location_id: str,
|
|
406
|
+
dect_network_id: str,
|
|
407
|
+
handset_id: str,
|
|
408
|
+
line1_member_id: str,
|
|
409
|
+
custom_display_name: str,
|
|
410
|
+
line2_member_id: str = None,
|
|
411
|
+
org_id: str = None
|
|
412
|
+
) -> None
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
Updates the line assignment on a handset. `line1_member_id` and `custom_display_name` are required.
|
|
416
|
+
|
|
417
|
+
### Delete a Single Handset
|
|
418
|
+
|
|
419
|
+
```python
|
|
420
|
+
def delete_handset(
|
|
421
|
+
self,
|
|
422
|
+
location_id: str,
|
|
423
|
+
dect_network_id: str,
|
|
424
|
+
handset_id: str,
|
|
425
|
+
org_id: str = None
|
|
426
|
+
) -> None
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### Delete Multiple Handsets
|
|
430
|
+
|
|
431
|
+
```python
|
|
432
|
+
def delete_handsets(
|
|
433
|
+
self,
|
|
434
|
+
location_id: str,
|
|
435
|
+
dect_network_id: str,
|
|
436
|
+
handset_ids: list[str],
|
|
437
|
+
delete_all: bool = None,
|
|
438
|
+
org_id: str = None
|
|
439
|
+
) -> None
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
If `delete_all` is `True`, the `handset_ids` array is ignored and all handsets in the network are deleted.
|
|
443
|
+
|
|
444
|
+
### CLI Examples
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
# List all handsets in a DECT network
|
|
448
|
+
wxcli dect-devices list-handsets <location_id> <dect_network_id>
|
|
449
|
+
|
|
450
|
+
# List handsets as JSON
|
|
451
|
+
wxcli dect-devices list-handsets <location_id> <dect_network_id> -o json
|
|
452
|
+
|
|
453
|
+
# List handsets filtered by base station
|
|
454
|
+
wxcli dect-devices list-handsets <location_id> <dect_network_id> \
|
|
455
|
+
--basestation-id <base_station_id>
|
|
456
|
+
|
|
457
|
+
# List handsets filtered by member (person, workspace, or virtual line)
|
|
458
|
+
wxcli dect-devices list-handsets <location_id> <dect_network_id> \
|
|
459
|
+
--member-id <person_id>
|
|
460
|
+
|
|
461
|
+
# Show details of a specific handset
|
|
462
|
+
wxcli dect-devices show-handsets <location_id> <dect_network_id> <handset_id>
|
|
463
|
+
|
|
464
|
+
# Add a single handset with one line
|
|
465
|
+
wxcli dect-devices create-handsets <location_id> <dect_network_id> \
|
|
466
|
+
--line1-member-id <person_id> \
|
|
467
|
+
--custom-display-name "Reception"
|
|
468
|
+
|
|
469
|
+
# Add a single handset with two lines (line 2 can be a virtual line)
|
|
470
|
+
wxcli dect-devices create-handsets <location_id> <dect_network_id> \
|
|
471
|
+
--line1-member-id <person_id> \
|
|
472
|
+
--line2-member-id <virtual_line_id> \
|
|
473
|
+
--custom-display-name "Front Desk"
|
|
474
|
+
|
|
475
|
+
# Update handset line assignment and display name
|
|
476
|
+
wxcli dect-devices update-handsets <location_id> <dect_network_id> <handset_id> \
|
|
477
|
+
--line1-member-id <new_person_id> \
|
|
478
|
+
--custom-display-name "Updated Name"
|
|
479
|
+
|
|
480
|
+
# Update handset to add a second line
|
|
481
|
+
wxcli dect-devices update-handsets <location_id> <dect_network_id> <handset_id> \
|
|
482
|
+
--line2-member-id <virtual_line_id>
|
|
483
|
+
|
|
484
|
+
# Delete a single handset
|
|
485
|
+
wxcli dect-devices delete-handsets-dect-networks <location_id> <dect_network_id> <handset_id>
|
|
486
|
+
|
|
487
|
+
# Delete a single handset (skip confirmation)
|
|
488
|
+
wxcli dect-devices delete-handsets-dect-networks <location_id> <dect_network_id> <handset_id> --force
|
|
489
|
+
|
|
490
|
+
# Delete multiple handsets (bulk)
|
|
491
|
+
wxcli dect-devices delete-handsets-dect-networks-1 <location_id> <dect_network_id>
|
|
492
|
+
|
|
493
|
+
# Delete multiple handsets (skip confirmation)
|
|
494
|
+
wxcli dect-devices delete-handsets-dect-networks-1 <location_id> <dect_network_id> --force
|
|
495
|
+
|
|
496
|
+
# Bulk add handsets (up to 50, requires --json-body)
|
|
497
|
+
wxcli dect-devices create-bulk <location_id> <dect_network_id> \
|
|
498
|
+
--json-body '{"items":[{"line1MemberId":"<person_id_1>","customDisplayName":"User 1"},{"line1MemberId":"<person_id_2>","line2MemberId":"<vl_id>","customDisplayName":"User 2"}]}'
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
## Association Queries
|
|
504
|
+
|
|
505
|
+
Query which DECT networks are associated with a specific person, workspace, or virtual line.
|
|
506
|
+
|
|
507
|
+
### DECT Networks for a Person
|
|
508
|
+
|
|
509
|
+
```python
|
|
510
|
+
def dect_networks_associated_with_person(
|
|
511
|
+
self,
|
|
512
|
+
person_id: str,
|
|
513
|
+
org_id: str = None
|
|
514
|
+
) -> list[AssignedDectNetwork]
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
### DECT Networks for a Workspace
|
|
518
|
+
|
|
519
|
+
```python
|
|
520
|
+
def dect_networks_associated_with_workspace(
|
|
521
|
+
self,
|
|
522
|
+
workspace_id: str,
|
|
523
|
+
org_id: str = None
|
|
524
|
+
) -> list[AssignedDectNetwork]
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
### DECT Networks for a Virtual Line
|
|
528
|
+
|
|
529
|
+
```python
|
|
530
|
+
def dect_networks_associated_with_virtual_line(
|
|
531
|
+
self,
|
|
532
|
+
virtual_line_id: str,
|
|
533
|
+
org_id: str = None
|
|
534
|
+
) -> list[AssignedDectNetwork]
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
### CLI Examples
|
|
538
|
+
|
|
539
|
+
```bash
|
|
540
|
+
# List DECT networks associated with a person
|
|
541
|
+
wxcli dect-devices list-dect-networks-people <person_id>
|
|
542
|
+
|
|
543
|
+
# List DECT networks associated with a workspace
|
|
544
|
+
wxcli dect-devices list-dect-networks-workspaces <workspace_id>
|
|
545
|
+
|
|
546
|
+
# Output as JSON
|
|
547
|
+
wxcli dect-devices list-dect-networks-people <person_id> -o json
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
## Available Members Search
|
|
553
|
+
|
|
554
|
+
Search for members that can be assigned to DECT handset lines.
|
|
555
|
+
|
|
556
|
+
```python
|
|
557
|
+
def available_members(
|
|
558
|
+
self,
|
|
559
|
+
member_name: str = None,
|
|
560
|
+
phone_number: str = None,
|
|
561
|
+
extension: str = None,
|
|
562
|
+
location_id: str = None,
|
|
563
|
+
order: str = None,
|
|
564
|
+
exclude_virtual_line: bool = None,
|
|
565
|
+
usage_type: UsageType = None,
|
|
566
|
+
org_id: str = None,
|
|
567
|
+
**params
|
|
568
|
+
) -> Generator[AvailableMember, None, None]
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
| Parameter | Notes |
|
|
572
|
+
|-----------|-------|
|
|
573
|
+
| `member_name` | Contains-match on member name |
|
|
574
|
+
| `phone_number` | Contains-match on number |
|
|
575
|
+
| `extension` | Contains-match on extension |
|
|
576
|
+
| `order` | Sort by `lname` (last name, default) or `fname` (first name), ascending |
|
|
577
|
+
| `exclude_virtual_line` | If `True`, virtual lines are excluded. Virtual lines cannot be the primary line. |
|
|
578
|
+
| `usage_type` | Filter by `UsageType` -- eligible as device owner or shared line |
|
|
579
|
+
|
|
580
|
+
Returns a **Generator** (paginated). Yields `AvailableMember` instances.
|
|
581
|
+
|
|
582
|
+
### CLI Examples
|
|
583
|
+
|
|
584
|
+
```bash
|
|
585
|
+
# Search all available members for DECT line assignment
|
|
586
|
+
wxcli dect-devices list-available-members
|
|
587
|
+
|
|
588
|
+
# Search by member name
|
|
589
|
+
wxcli dect-devices list-available-members --member-name "Jane"
|
|
590
|
+
|
|
591
|
+
# Search by phone number
|
|
592
|
+
wxcli dect-devices list-available-members --phone-number "+1555"
|
|
593
|
+
|
|
594
|
+
# Search by extension
|
|
595
|
+
wxcli dect-devices list-available-members --extension "1001"
|
|
596
|
+
|
|
597
|
+
# Filter by location
|
|
598
|
+
wxcli dect-devices list-available-members --location-id <location_id>
|
|
599
|
+
|
|
600
|
+
# Exclude virtual lines (for line 1 assignment — virtual lines can only be line 2)
|
|
601
|
+
wxcli dect-devices list-available-members --exclude-virtual-line true
|
|
602
|
+
|
|
603
|
+
# Filter by usage type (device owner vs shared line)
|
|
604
|
+
wxcli dect-devices list-available-members --usage-type DEVICE_OWNER
|
|
605
|
+
|
|
606
|
+
# Sort by first name instead of last name (default)
|
|
607
|
+
wxcli dect-devices list-available-members --order fname
|
|
608
|
+
|
|
609
|
+
# Output as JSON
|
|
610
|
+
wxcli dect-devices list-available-members --member-name "Jane" -o json
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
---
|
|
614
|
+
|
|
615
|
+
## Serviceability Password
|
|
616
|
+
|
|
617
|
+
The DECT serviceability password (also called the admin override password) provides read/write access to DECT base stations for system serviceability and troubleshooting.
|
|
618
|
+
|
|
619
|
+
### Generate and Enable Password
|
|
620
|
+
|
|
621
|
+
```python
|
|
622
|
+
def generate_and_enable_dect_serviceability_password(
|
|
623
|
+
self,
|
|
624
|
+
location_id: str,
|
|
625
|
+
dect_network_id: str,
|
|
626
|
+
org_id: str = None
|
|
627
|
+
) -> str # returns the 16-character password
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
**Warning:** Generating a new password and transmitting it to the DECT network can **reboot the entire network**. Choose an appropriate maintenance window.
|
|
631
|
+
|
|
632
|
+
### Get Password Status
|
|
633
|
+
|
|
634
|
+
```python
|
|
635
|
+
def get_dect_serviceability_password_status(
|
|
636
|
+
self,
|
|
637
|
+
location_id: str,
|
|
638
|
+
dect_network_id: str,
|
|
639
|
+
org_id: str = None
|
|
640
|
+
) -> bool # True if enabled
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
Note: If the password is enabled but has not been generated, status still returns `True` even though there is no active password.
|
|
644
|
+
|
|
645
|
+
### Update Password Status (Enable/Disable)
|
|
646
|
+
|
|
647
|
+
```python
|
|
648
|
+
def update_dect_serviceability_password_status(
|
|
649
|
+
self,
|
|
650
|
+
location_id: str,
|
|
651
|
+
dect_network_id: str,
|
|
652
|
+
enabled: bool,
|
|
653
|
+
org_id: str = None
|
|
654
|
+
) -> None
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
When `enabled` is `False`, the Cisco-owned password is required for serviceability access instead.
|
|
658
|
+
|
|
659
|
+
**Warning:** Enabling or disabling the password can **reboot the entire network**.
|
|
660
|
+
|
|
661
|
+
### CLI Examples
|
|
662
|
+
|
|
663
|
+
```bash
|
|
664
|
+
# Generate and enable a serviceability password (WARNING: may reboot DECT network)
|
|
665
|
+
wxcli dect-devices generate-and-enable <location_id> <dect_network_id>
|
|
666
|
+
|
|
667
|
+
# Check serviceability password status (enabled/disabled)
|
|
668
|
+
wxcli dect-devices show-serviceability-password <location_id> <dect_network_id>
|
|
669
|
+
|
|
670
|
+
# Enable serviceability password (WARNING: may reboot DECT network)
|
|
671
|
+
wxcli dect-devices update-serviceability-password <location_id> <dect_network_id> --enabled
|
|
672
|
+
|
|
673
|
+
# Disable serviceability password (WARNING: may reboot DECT network)
|
|
674
|
+
wxcli dect-devices update-serviceability-password <location_id> <dect_network_id> --no-enabled
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
---
|
|
678
|
+
|
|
679
|
+
## Hot Desking
|
|
680
|
+
|
|
681
|
+
Hot desking allows users to temporarily sign into a shared workspace device and use it as their own phone. The `HotDeskApi` manages active hot desk sessions.
|
|
682
|
+
|
|
683
|
+
### API Access
|
|
684
|
+
|
|
685
|
+
```python
|
|
686
|
+
hotdesk = api.telephony.hotdesk #
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
### Data Model
|
|
690
|
+
|
|
691
|
+
```python
|
|
692
|
+
class HotDesk(ApiModel):
|
|
693
|
+
session_id: Optional[str] = None # Unique session identifier
|
|
694
|
+
workspace_id: Optional[str] = None # Workspace where session is active
|
|
695
|
+
person_id: Optional[str] = None # Person who initiated the session
|
|
696
|
+
booking_start_time: Optional[datetime] = None
|
|
697
|
+
booking_end_time: Optional[datetime] = None
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
### List Sessions
|
|
701
|
+
|
|
702
|
+
```python
|
|
703
|
+
def list_sessions(
|
|
704
|
+
self,
|
|
705
|
+
person_id: str = None,
|
|
706
|
+
workspace_id: str = None,
|
|
707
|
+
org_id: str = None
|
|
708
|
+
) -> list[HotDesk]
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
Both `person_id` and `workspace_id` are optional filters. When used together, they act as an AND filter. The `org_id` parameter is for partner administrators acting on a managed organization.
|
|
712
|
+
|
|
713
|
+
### Delete Session
|
|
714
|
+
|
|
715
|
+
```python
|
|
716
|
+
def delete_session(
|
|
717
|
+
self,
|
|
718
|
+
session_id: str
|
|
719
|
+
) -> None
|
|
720
|
+
```
|
|
721
|
+
|
|
722
|
+
Ends a hot desk session by its unique session ID.
|
|
723
|
+
|
|
724
|
+
---
|
|
725
|
+
|
|
726
|
+
## Data Models
|
|
727
|
+
|
|
728
|
+
### DECT Network Models
|
|
729
|
+
|
|
730
|
+
#### `DECTNetworkModel` (Enum)
|
|
731
|
+
|
|
732
|
+
| Value | String |
|
|
733
|
+
|-------|--------|
|
|
734
|
+
| `dms_cisco_dbs110` | `'DMS Cisco DBS110'` |
|
|
735
|
+
| `cisco_dect_110_base` | `'Cisco DECT 110 Base'` |
|
|
736
|
+
| `dms_cisco_dbs210` | `'DMS Cisco DBS210'` |
|
|
737
|
+
| `cisco_dect_210_base` | `'Cisco DECT 210 Base'` |
|
|
738
|
+
|
|
739
|
+
#### `DECTNetworkDetail`
|
|
740
|
+
|
|
741
|
+
| Field | Type | Description |
|
|
742
|
+
|-------|------|-------------|
|
|
743
|
+
| `id` | `str` | Unique identifier |
|
|
744
|
+
| `name` | `str` | Network name (unique per location) |
|
|
745
|
+
| `display_name` | `str` | Name shown on handsets |
|
|
746
|
+
| `chain_id` | `int` | Chain ID of the network |
|
|
747
|
+
| `model` | `DECTNetworkModel` | Base station model deployed |
|
|
748
|
+
| `default_access_code_enabled` | `bool` | Whether a shared access code is used |
|
|
749
|
+
| `default_access_code` | `str` | 4-digit shared access code (if enabled) |
|
|
750
|
+
| `number_of_base_stations` | `int` | Count of base stations |
|
|
751
|
+
| `number_of_handsets_assigned` | `int` | Count of assigned handsets |
|
|
752
|
+
| `number_of_lines` | `int` | Count of lines |
|
|
753
|
+
| `location` | `IdAndName` | Location id and name |
|
|
754
|
+
|
|
755
|
+
#### `DectDevice`
|
|
756
|
+
|
|
757
|
+
| Field | Type | Description |
|
|
758
|
+
|-------|------|-------------|
|
|
759
|
+
| `model` | `str` | Model name |
|
|
760
|
+
| `display_name` | `str` | Display name |
|
|
761
|
+
| `number_of_base_stations` | `int` | Supported base station count |
|
|
762
|
+
| `number_of_line_ports` | `int` | Supported line port count |
|
|
763
|
+
| `number_of_registrations_supported` | `int` | Supported registration count |
|
|
764
|
+
|
|
765
|
+
### Base Station Models
|
|
766
|
+
|
|
767
|
+
#### `BaseStationResponse` (creation result)
|
|
768
|
+
|
|
769
|
+
| Field | Type | Description |
|
|
770
|
+
|-------|------|-------------|
|
|
771
|
+
| `mac` | `str` | MAC address added |
|
|
772
|
+
| `result` | `BaseStationResult` | Contains `status` (int) and `id` (str) |
|
|
773
|
+
|
|
774
|
+
#### `BaseStationsResponse` (list item)
|
|
775
|
+
|
|
776
|
+
| Field | Type | Description |
|
|
777
|
+
|-------|------|-------------|
|
|
778
|
+
| `id` | `str` | Base station ID |
|
|
779
|
+
| `mac` | `str` | MAC address |
|
|
780
|
+
| `number_of_lines_registered` | `int` | Registered handset line count |
|
|
781
|
+
|
|
782
|
+
#### `BaseStationDetail`
|
|
783
|
+
|
|
784
|
+
| Field | Type | Description |
|
|
785
|
+
|-------|------|-------------|
|
|
786
|
+
| `id` | `str` | Base station ID |
|
|
787
|
+
| `mac` | `str` | MAC address |
|
|
788
|
+
| `handsets` | `list[Handset]` | Registered handsets with line details |
|
|
789
|
+
|
|
790
|
+
### Handset Models
|
|
791
|
+
|
|
792
|
+
#### `DECTHandsetLine`
|
|
793
|
+
|
|
794
|
+
| Field | Type | Description |
|
|
795
|
+
|-------|------|-------------|
|
|
796
|
+
| `member_id` | `str` | Member ID (PEOPLE or PLACE) |
|
|
797
|
+
| `first_name` | `str` | Member's first name |
|
|
798
|
+
| `last_name` | `str` | Member's last name |
|
|
799
|
+
| `external` | `str` | Primary phone number |
|
|
800
|
+
| `extension` | `str` | Extension |
|
|
801
|
+
| `routing_prefix` | `str` | Location routing prefix |
|
|
802
|
+
| `esn` | `str` | Routing prefix + extension |
|
|
803
|
+
| `last_registration_time` | `str` | Last registration timestamp |
|
|
804
|
+
| `host_ip` | `str` | Registration host IP (JSON alias: `hostIP`) |
|
|
805
|
+
| `remote_ip` | `str` | Registration remote IP (JSON alias: `remoteIP`) |
|
|
806
|
+
| `location` | `IdAndName` | Location id and name |
|
|
807
|
+
| `member_type` | `UserType` | Member type indicator |
|
|
808
|
+
|
|
809
|
+
#### `Handset`
|
|
810
|
+
|
|
811
|
+
| Field | Type | Description |
|
|
812
|
+
|-------|------|-------------|
|
|
813
|
+
| `id` | `str` | Handset unique identifier |
|
|
814
|
+
| `display_name` | `str` | Display name |
|
|
815
|
+
| `access_code` | `str` | Access code for pairing |
|
|
816
|
+
| `lines` | `list[DECTHandsetLine]` | Up to 2 line members |
|
|
817
|
+
|
|
818
|
+
#### `DECTHandsetItem`
|
|
819
|
+
|
|
820
|
+
| Field | Type | Description |
|
|
821
|
+
|-------|------|-------------|
|
|
822
|
+
| `id` | `str` | Handset unique identifier |
|
|
823
|
+
| `index` | `int` | Handset index |
|
|
824
|
+
| `default_display_name` | `str` | Default display name |
|
|
825
|
+
| `custom_display_name` | `str` | Custom display name set by admin |
|
|
826
|
+
| `base_station_id` | `str` | Associated base station ID |
|
|
827
|
+
| `mac` | `str` | MAC address |
|
|
828
|
+
| `access_code` | `str` | Access code for pairing |
|
|
829
|
+
| `primary_enabled` | `bool` | Whether this is a primary line |
|
|
830
|
+
| `lines` | `list[DECTHandsetLine]` | Up to 2 line members |
|
|
831
|
+
|
|
832
|
+
#### `DECTHandsetList`
|
|
833
|
+
|
|
834
|
+
| Field | Type | Description |
|
|
835
|
+
|-------|------|-------------|
|
|
836
|
+
| `number_of_handsets_assigned` | `int` | Total handsets |
|
|
837
|
+
| `number_of_lines_assigned` | `int` | Total lines |
|
|
838
|
+
| `handsets` | `list[DECTHandsetItem]` | Handset details |
|
|
839
|
+
|
|
840
|
+
#### `AddDECTHandset` (for bulk add)
|
|
841
|
+
|
|
842
|
+
| Field | Type | Description |
|
|
843
|
+
|-------|------|-------------|
|
|
844
|
+
| `line1_member_id` | `str` | Line 1 member (PEOPLE or PLACE) |
|
|
845
|
+
| `line2_member_id` | `str` | Line 2 member (PEOPLE, PLACE, or VIRTUAL_LINE) |
|
|
846
|
+
| `custom_display_name` | `str` | Custom name (1-16 characters) |
|
|
847
|
+
|
|
848
|
+
#### `AddDECTHandsetBulkResponse`
|
|
849
|
+
|
|
850
|
+
| Field | Type | Description |
|
|
851
|
+
|-------|------|-------------|
|
|
852
|
+
| `custom_display_name` | `str` | The custom display name submitted |
|
|
853
|
+
| `result` | `AddDECTHandsetBulkResult` | Contains `status` (int) and `error` (`AddDECTHandsetBulkError` with `message` and `error_code`) |
|
|
854
|
+
|
|
855
|
+
---
|
|
856
|
+
|
|
857
|
+
## Raw HTTP
|
|
858
|
+
|
|
859
|
+
All examples use:
|
|
860
|
+
|
|
861
|
+
```python
|
|
862
|
+
from wxc_sdk import WebexSimpleApi
|
|
863
|
+
api = WebexSimpleApi()
|
|
864
|
+
BASE = "https://webexapis.com/v1"
|
|
865
|
+
```
|
|
866
|
+
|
|
867
|
+
No auto-pagination -- pass `max=1000` explicitly. All responses are JSON dicts. Errors raise `RestError`.
|
|
868
|
+
|
|
869
|
+
### DECT Networks
|
|
870
|
+
|
|
871
|
+
#### Create a DECT network
|
|
872
|
+
|
|
873
|
+
```python
|
|
874
|
+
body = {
|
|
875
|
+
"name": "Building A DECT",
|
|
876
|
+
"model": "DMS Cisco DBS210",
|
|
877
|
+
"defaultAccessCodeEnabled": True,
|
|
878
|
+
"defaultAccessCode": "1234",
|
|
879
|
+
"displayName": "Bldg A" # max 11 chars
|
|
880
|
+
}
|
|
881
|
+
result = api.session.rest_post(f"{BASE}/telephony/config/locations/{location_id}/dectNetworks", json=body)
|
|
882
|
+
network_id = result.get("dectNetworkId") # NOTE: key is "dectNetworkId", not "id"
|
|
883
|
+
```
|
|
884
|
+
|
|
885
|
+
#### List DECT networks (org-wide)
|
|
886
|
+
|
|
887
|
+
```python
|
|
888
|
+
result = api.session.rest_get(f"{BASE}/telephony/config/dectNetworks", params={
|
|
889
|
+
"max": 1000,
|
|
890
|
+
"name": "Building A", # optional filter
|
|
891
|
+
"locationId": location_id, # optional filter
|
|
892
|
+
})
|
|
893
|
+
networks = result.get("dectNetworks", [])
|
|
894
|
+
# Each: {id, name, displayName, model, defaultAccessCodeEnabled, numberOfBaseStations, numberOfHandsetsAssigned, numberOfLines, location: {id, name}}
|
|
895
|
+
```
|
|
896
|
+
|
|
897
|
+
#### Get DECT network details
|
|
898
|
+
|
|
899
|
+
```python
|
|
900
|
+
result = api.session.rest_get(f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}")
|
|
901
|
+
# Returns full DECTNetworkDetail object
|
|
902
|
+
```
|
|
903
|
+
|
|
904
|
+
#### Update a DECT network
|
|
905
|
+
|
|
906
|
+
```python
|
|
907
|
+
body = {
|
|
908
|
+
"name": "Building A DECT Updated",
|
|
909
|
+
"defaultAccessCodeEnabled": True,
|
|
910
|
+
"defaultAccessCode": "5678",
|
|
911
|
+
"displayName": "Bldg A v2"
|
|
912
|
+
}
|
|
913
|
+
api.session.rest_put(f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}", json=body)
|
|
914
|
+
```
|
|
915
|
+
|
|
916
|
+
#### Delete a DECT network
|
|
917
|
+
|
|
918
|
+
```python
|
|
919
|
+
api.session.rest_delete(f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}")
|
|
920
|
+
```
|
|
921
|
+
|
|
922
|
+
### Base Stations
|
|
923
|
+
|
|
924
|
+
#### Create base stations (bulk by MAC)
|
|
925
|
+
|
|
926
|
+
```python
|
|
927
|
+
body = {"baseStationMacs": ["AABBCCDDEEFF", "112233445566"]}
|
|
928
|
+
result = api.session.rest_post(
|
|
929
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/baseStations",
|
|
930
|
+
json=body
|
|
931
|
+
)
|
|
932
|
+
# Returns list of results: [{mac, result: {status, id}}, ...]
|
|
933
|
+
```
|
|
934
|
+
|
|
935
|
+
#### List base stations
|
|
936
|
+
|
|
937
|
+
```python
|
|
938
|
+
result = api.session.rest_get(
|
|
939
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/baseStations"
|
|
940
|
+
)
|
|
941
|
+
stations = result.get("baseStations", [])
|
|
942
|
+
# Each: {id, mac, numberOfLinesRegistered}
|
|
943
|
+
```
|
|
944
|
+
|
|
945
|
+
#### Get base station details
|
|
946
|
+
|
|
947
|
+
```python
|
|
948
|
+
result = api.session.rest_get(
|
|
949
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/baseStations/{base_station_id}"
|
|
950
|
+
)
|
|
951
|
+
# Returns: {id, mac, handsets: [{id, displayName, accessCode, lines: [...]}]}
|
|
952
|
+
```
|
|
953
|
+
|
|
954
|
+
#### Delete a specific base station
|
|
955
|
+
|
|
956
|
+
```python
|
|
957
|
+
api.session.rest_delete(
|
|
958
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/baseStations/{base_station_id}"
|
|
959
|
+
)
|
|
960
|
+
```
|
|
961
|
+
|
|
962
|
+
#### Delete all base stations in a network
|
|
963
|
+
|
|
964
|
+
```python
|
|
965
|
+
api.session.rest_delete(
|
|
966
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/baseStations"
|
|
967
|
+
)
|
|
968
|
+
```
|
|
969
|
+
|
|
970
|
+
### Handsets
|
|
971
|
+
|
|
972
|
+
#### Add a single handset
|
|
973
|
+
|
|
974
|
+
```python
|
|
975
|
+
body = {
|
|
976
|
+
"line1MemberId": person_id,
|
|
977
|
+
"line2MemberId": virtual_line_id, # optional
|
|
978
|
+
"customDisplayName": "Reception" # 1-16 chars, required
|
|
979
|
+
}
|
|
980
|
+
api.session.rest_post(
|
|
981
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets",
|
|
982
|
+
json=body
|
|
983
|
+
)
|
|
984
|
+
```
|
|
985
|
+
|
|
986
|
+
#### Add handsets in bulk (up to 50)
|
|
987
|
+
|
|
988
|
+
```python
|
|
989
|
+
body = {
|
|
990
|
+
"items": [
|
|
991
|
+
{"line1MemberId": person_id_1, "customDisplayName": "User 1"},
|
|
992
|
+
{"line1MemberId": person_id_2, "line2MemberId": vl_id, "customDisplayName": "User 2"}
|
|
993
|
+
]
|
|
994
|
+
}
|
|
995
|
+
result = api.session.rest_post(
|
|
996
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets/bulk",
|
|
997
|
+
json=body
|
|
998
|
+
)
|
|
999
|
+
# Returns per-item results: [{customDisplayName, result: {status, error: {message, errorCode}}}]
|
|
1000
|
+
```
|
|
1001
|
+
|
|
1002
|
+
#### List handsets
|
|
1003
|
+
|
|
1004
|
+
```python
|
|
1005
|
+
result = api.session.rest_get(
|
|
1006
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets",
|
|
1007
|
+
params={
|
|
1008
|
+
"basestationId": base_station_id, # optional filter
|
|
1009
|
+
"memberId": person_id, # optional filter
|
|
1010
|
+
}
|
|
1011
|
+
)
|
|
1012
|
+
handsets = result.get("handsets", [])
|
|
1013
|
+
# Also: result["numberOfHandsetsAssigned"], result["numberOfLinesAssigned"]
|
|
1014
|
+
```
|
|
1015
|
+
|
|
1016
|
+
#### Get handset details
|
|
1017
|
+
|
|
1018
|
+
```python
|
|
1019
|
+
result = api.session.rest_get(
|
|
1020
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets/{handset_id}"
|
|
1021
|
+
)
|
|
1022
|
+
# Returns: {id, index, defaultDisplayName, customDisplayName, baseStationId, mac, accessCode, primaryEnabled, lines: [...]}
|
|
1023
|
+
```
|
|
1024
|
+
|
|
1025
|
+
#### Update handset
|
|
1026
|
+
|
|
1027
|
+
```python
|
|
1028
|
+
body = {
|
|
1029
|
+
"line1MemberId": new_person_id,
|
|
1030
|
+
"customDisplayName": "Updated Name",
|
|
1031
|
+
"line2MemberId": new_vl_id # optional
|
|
1032
|
+
}
|
|
1033
|
+
api.session.rest_put(
|
|
1034
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets/{handset_id}",
|
|
1035
|
+
json=body
|
|
1036
|
+
)
|
|
1037
|
+
```
|
|
1038
|
+
|
|
1039
|
+
#### Delete a single handset
|
|
1040
|
+
|
|
1041
|
+
```python
|
|
1042
|
+
api.session.rest_delete(
|
|
1043
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets/{handset_id}"
|
|
1044
|
+
)
|
|
1045
|
+
```
|
|
1046
|
+
|
|
1047
|
+
#### Delete multiple handsets
|
|
1048
|
+
|
|
1049
|
+
```python
|
|
1050
|
+
body = {
|
|
1051
|
+
"handsetIds": [handset_id_1, handset_id_2],
|
|
1052
|
+
"deleteAll": False # set True to delete all handsets (ignores handsetIds)
|
|
1053
|
+
}
|
|
1054
|
+
api.session.rest_delete(
|
|
1055
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets/",
|
|
1056
|
+
json=body
|
|
1057
|
+
)
|
|
1058
|
+
```
|
|
1059
|
+
|
|
1060
|
+
### Association Queries
|
|
1061
|
+
|
|
1062
|
+
```python
|
|
1063
|
+
# DECT networks for a person
|
|
1064
|
+
result = api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/dectNetworks")
|
|
1065
|
+
networks = result.get("dectNetworks", [])
|
|
1066
|
+
|
|
1067
|
+
# DECT networks for a workspace
|
|
1068
|
+
result = api.session.rest_get(f"{BASE}/telephony/config/workspaces/{workspace_id}/dectNetworks")
|
|
1069
|
+
networks = result.get("dectNetworks", [])
|
|
1070
|
+
```
|
|
1071
|
+
|
|
1072
|
+
### Available Members
|
|
1073
|
+
|
|
1074
|
+
```python
|
|
1075
|
+
result = api.session.rest_get(f"{BASE}/telephony/config/devices/availableMembers", params={
|
|
1076
|
+
"max": 1000,
|
|
1077
|
+
"memberName": "Jane",
|
|
1078
|
+
"locationId": location_id,
|
|
1079
|
+
"excludeVirtualLine": True, # virtual lines can't be line 1
|
|
1080
|
+
})
|
|
1081
|
+
members = result.get("members", [])
|
|
1082
|
+
# Each: {id, firstName, lastName, phoneNumber, extension, memberType}
|
|
1083
|
+
```
|
|
1084
|
+
|
|
1085
|
+
### Serviceability Password
|
|
1086
|
+
|
|
1087
|
+
```python
|
|
1088
|
+
# Generate and enable password (WARNING: may reboot entire DECT network)
|
|
1089
|
+
result = api.session.rest_post(
|
|
1090
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/serviceabilityPassword/actions/generate/invoke"
|
|
1091
|
+
)
|
|
1092
|
+
password = result.get("password") # 16-character string
|
|
1093
|
+
|
|
1094
|
+
# Get password status
|
|
1095
|
+
result = api.session.rest_get(
|
|
1096
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/serviceabilityPassword"
|
|
1097
|
+
)
|
|
1098
|
+
enabled = result.get("enabled") # bool
|
|
1099
|
+
|
|
1100
|
+
# Update password status (WARNING: may reboot entire DECT network)
|
|
1101
|
+
api.session.rest_put(
|
|
1102
|
+
f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/serviceabilityPassword",
|
|
1103
|
+
json={"enabled": False}
|
|
1104
|
+
)
|
|
1105
|
+
```
|
|
1106
|
+
|
|
1107
|
+
### Raw HTTP Gotchas
|
|
1108
|
+
|
|
1109
|
+
1. **`dectNetworkId` not `id` in create response.** The create network response returns `{"dectNetworkId": "..."}`, not `{"id": "..."}`. Parse accordingly.
|
|
1110
|
+
2. **`list_dect_networks` is org-wide.** The list endpoint is `GET /telephony/config/dectNetworks` (no location in path). Pass `locationId` as a query param to filter.
|
|
1111
|
+
3. **90-second cooldown on handset changes.** Adding or removing handsets within 90 seconds may leave base stations out of sync until rebooted.
|
|
1112
|
+
4. **Bulk handset add uses `/handsets/bulk`**, not `/handsets`. The single-add endpoint is `POST /handsets` (no `/bulk` suffix).
|
|
1113
|
+
5. **Delete multiple handsets uses trailing slash.** The URL is `.../handsets/` (with trailing slash), taking a JSON body with `handsetIds` array.
|
|
1114
|
+
6. **Serviceability password operations can reboot the network.** Both generating a new password and toggling enabled status trigger a network-wide reboot.
|
|
1115
|
+
7. **No API for auto-generated access codes.** When `defaultAccessCodeEnabled` is `false`, per-handset codes are auto-generated but cannot be retrieved via API.
|
|
1116
|
+
|
|
1117
|
+
---
|
|
1118
|
+
|
|
1119
|
+
## Common Gotchas
|
|
1120
|
+
|
|
1121
|
+
1. **Adding a DECT handset to a person with a Webex Calling Standard license disables Webex Calling** across their mobile, tablet, desktop, and browser applications. Deleting the handset re-enables it.
|
|
1122
|
+
|
|
1123
|
+
2. **90-second cooldown on handset changes.** Adding or removing handsets in less than 90 seconds may result in the base station not having the latest configuration until it is rebooted.
|
|
1124
|
+
|
|
1125
|
+
3. **No API for auto-generated access codes.** When `default_access_code_enabled` is `False`, per-handset access codes are auto-generated but cannot be retrieved via API. Use Control Hub.
|
|
1126
|
+
|
|
1127
|
+
4. **Access code uniqueness.** The default access code must be unique within the same location to prevent handsets from accidentally registering with base stations on different DECT networks in range.
|
|
1128
|
+
|
|
1129
|
+
5. **Serviceability password reboots the network.** Both generating a new password and toggling the enabled status can reboot the entire DECT network.
|
|
1130
|
+
|
|
1131
|
+
6. **Display name limits differ.** Network `display_name` is 11 characters max. Handset `custom_display_name` is 1-16 characters.
|
|
1132
|
+
|
|
1133
|
+
7. **Line 1 vs Line 2 member types.** Line 1 supports only PEOPLE and PLACE. Line 2 also supports VIRTUAL_LINE. Virtual lines cannot be the primary (line 1) member.
|
|
1134
|
+
|
|
1135
|
+
8. **Hot desk scopes not documented.** The source code for `HotDeskApi` does not include scope documentation in the docstrings, and the OpenAPI specs also omit security/scope blocks for the Hot Desk endpoints.
|
|
1136
|
+
|
|
1137
|
+
9. **`DECTNetworkModel` has alternate names.** `dms_cisco_dbs110` and `cisco_dect_110_base` both refer to the same physical hardware (DBS-110). Same for the 210 variants. Choose either enum value.
|
|
1138
|
+
|
|
1139
|
+
10. **`list_dect_networks` is org-wide.** Unlike most DECT methods that require `location_id`, `list_dect_networks` searches across the entire org and accepts `location_id` as an optional filter.
|
|
1140
|
+
|
|
1141
|
+
11. **DECT network create returns `dectNetworkId`, not `id`, in response body.**
|
|
1142
|
+
The `create_dect_network` API response body returns the new network's identifier under the key `dectNetworkId`, not `id`. Code that parses the raw JSON response as `response['id']` will get a `KeyError`. The wxc_sdk method handles this internally and returns the ID as a string.
|
|
1143
|
+
|
|
1144
|
+
---
|
|
1145
|
+
|
|
1146
|
+
## See Also
|
|
1147
|
+
|
|
1148
|
+
- **[devices-core.md](devices-core.md)** — Cloud device CRUD, activation codes, MAC provisioning, and telephony device settings. DECT devices are excluded from `device_settings` / `update_device_settings` in that API.
|
|
1149
|
+
- **[devices-workspaces.md](devices-workspaces.md)** — Workspace management including `HotdeskingStatus` enum and workspace hot desk creation constraints.
|
|
1150
|
+
- **[virtual-lines.md](virtual-lines.md)** — Virtual line management. DECT handset Line 2 supports VIRTUAL_LINE member type; see that doc for virtual line CRUD and call settings.
|