zscaler-sdk-python 1.3.0__tar.gz → 1.4.0__tar.gz

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.
Files changed (385) hide show
  1. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/PKG-INFO +2 -2
  2. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/pyproject.toml +2 -2
  3. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/__init__.py +1 -1
  4. zscaler_sdk_python-1.4.0/zscaler/errors/http_error.py +10 -0
  5. zscaler_sdk_python-1.4.0/zscaler/errors/response_checker.py +57 -0
  6. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/errors/zscaler_api_error.py +13 -23
  7. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/exceptions/exceptions.py +1 -0
  8. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/helpers.py +16 -2
  9. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_http_client.py +1 -52
  10. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_oauth_client.py +2 -1
  11. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/request_executor.py +11 -45
  12. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/utils.py +125 -42
  13. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/admin_user.py +7 -4
  14. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/devices.py +24 -6
  15. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/legacy.py +131 -45
  16. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/secrets.py +1 -1
  17. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/bandwidth_control_rules.py +20 -1
  18. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_firewall.py +77 -27
  19. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/legacy.py +30 -35
  20. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/url_categories.py +7 -6
  21. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_protection.py +266 -180
  22. zscaler_sdk_python-1.3.0/zscaler/zpa/application_segment.py → zscaler_sdk_python-1.4.0/zscaler/zpa/app_segments_ba.py +91 -195
  23. zscaler_sdk_python-1.4.0/zscaler/zpa/app_segments_ba_v2.py +479 -0
  24. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_segments_inspection.py +83 -62
  25. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_segments_pra.py +49 -41
  26. zscaler_sdk_python-1.4.0/zscaler/zpa/application_segment.py +939 -0
  27. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/legacy.py +38 -8
  28. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/app_connector_groups.py +15 -0
  29. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/app_protection_predefined_controls.py +45 -8
  30. zscaler_sdk_python-1.4.0/zscaler/zpa/models/app_protection_profile.py +943 -0
  31. zscaler_sdk_python-1.4.0/zscaler/zpa/models/application_segment.py +1053 -0
  32. zscaler_sdk_python-1.4.0/zscaler/zpa/models/application_segment_lb.py +104 -0
  33. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/common.py +4 -1
  34. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/policyset_controller_v2.py +6 -0
  35. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_console.py +0 -1
  36. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/segment_group.py +4 -1
  37. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/server_group.py +22 -3
  38. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/service_edge_groups.py +2 -2
  39. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/policies.py +896 -275
  40. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/zpa_service.py +20 -0
  41. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/legacy.py +48 -40
  42. zscaler_sdk_python-1.3.0/zscaler/errors/http_error.py +0 -20
  43. zscaler_sdk_python-1.3.0/zscaler/zpa/models/app_protection.py +0 -317
  44. zscaler_sdk_python-1.3.0/zscaler/zpa/models/application_segment.py +0 -587
  45. zscaler_sdk_python-1.3.0/zscaler/zpa/models/application_segment_inspection.py +0 -173
  46. zscaler_sdk_python-1.3.0/zscaler/zpa/models/application_segment_pra.py +0 -211
  47. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/LICENSE.md +0 -0
  48. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/README.md +0 -0
  49. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/api_client.py +0 -0
  50. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/cache/__init__.py +0 -0
  51. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/cache/cache.py +0 -0
  52. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/cache/no_op_cache.py +0 -0
  53. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/cache/zscaler_cache.py +0 -0
  54. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/config/__init__.py +0 -0
  55. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/config/config_setter.py +0 -0
  56. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/config/config_validator.py +0 -0
  57. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/constants.py +0 -0
  58. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/error_messages.py +0 -0
  59. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/errors/__init__.py +0 -0
  60. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/errors/error.py +0 -0
  61. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/exceptions/__init__.py +0 -0
  62. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/logger.py +0 -0
  63. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_client.py +0 -0
  64. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_collection.py +0 -0
  65. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_object.py +0 -0
  66. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/oneapi_response.py +0 -0
  67. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ratelimiter/__init__.py +0 -0
  68. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ratelimiter/ratelimiter.py +0 -0
  69. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/user_agent.py +0 -0
  70. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/__init__.py +0 -0
  71. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/company.py +0 -0
  72. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/entitlements.py +0 -0
  73. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/fail_open_policy.py +0 -0
  74. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/forwarding_profile.py +0 -0
  75. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/admin_roles.py +0 -0
  76. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/admin_user.py +0 -0
  77. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/devices.py +0 -0
  78. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/failopenpolicy.py +0 -0
  79. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/forwardingprofile.py +0 -0
  80. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/getcompanyinfo.py +0 -0
  81. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/manage_pass.py +0 -0
  82. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/secrets_otp.py +0 -0
  83. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/secrets_passwords.py +0 -0
  84. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/trustednetworks.py +0 -0
  85. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/webappservice.py +0 -0
  86. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/webpolicy.py +0 -0
  87. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/webprivacy.py +0 -0
  88. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/zdxgroupentitlements.py +0 -0
  89. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/models/zpagroupentitlements.py +0 -0
  90. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/trusted_networks.py +0 -0
  91. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/web_app_service.py +0 -0
  92. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/web_policy.py +0 -0
  93. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/web_privacy.py +0 -0
  94. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zcc/zcc_service.py +0 -0
  95. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/__init__.py +0 -0
  96. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/admin.py +0 -0
  97. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/alerts.py +0 -0
  98. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/apps.py +0 -0
  99. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/devices.py +0 -0
  100. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/inventory.py +0 -0
  101. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/legacy.py +0 -0
  102. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/activeapplications.py +0 -0
  103. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/administration.py +0 -0
  104. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/alerts.py +0 -0
  105. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/application_users.py +0 -0
  106. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/applications.py +0 -0
  107. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/call_quality_metrics.py +0 -0
  108. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/common.py +0 -0
  109. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/devices.py +0 -0
  110. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/software_inventory.py +0 -0
  111. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/troubleshooting.py +0 -0
  112. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/models/users.py +0 -0
  113. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/troubleshooting.py +0 -0
  114. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/users.py +0 -0
  115. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zdx/zdx_service.py +0 -0
  116. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/__init__.py +0 -0
  117. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/activate.py +0 -0
  118. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/admin_roles.py +0 -0
  119. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/admin_users.py +0 -0
  120. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/advanced_settings.py +0 -0
  121. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/alert_subscriptions.py +0 -0
  122. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/apptotal.py +0 -0
  123. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/atp_policy.py +0 -0
  124. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/audit_logs.py +0 -0
  125. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/authentication_settings.py +0 -0
  126. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/bandwidth_classes.py +0 -0
  127. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_app_instances.py +0 -0
  128. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_applications.py +0 -0
  129. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_browser_isolation.py +0 -0
  130. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_firewall_dns.py +0 -0
  131. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_firewall_ips.py +0 -0
  132. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_firewall_rules.py +0 -0
  133. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloud_nss.py +0 -0
  134. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/cloudappcontrol.py +0 -0
  135. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dedicated_ip_gateways.py +0 -0
  136. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/device_management.py +0 -0
  137. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_dictionary.py +0 -0
  138. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_engine.py +0 -0
  139. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_resources.py +0 -0
  140. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_templates.py +0 -0
  141. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dlp_web_rules.py +0 -0
  142. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/dns_gatways.py +0 -0
  143. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/end_user_notification.py +0 -0
  144. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/file_type_control_rule.py +0 -0
  145. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/forwarding_control.py +0 -0
  146. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/ftp_control_policy.py +0 -0
  147. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/gre_tunnel.py +0 -0
  148. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/intermediate_certificates.py +0 -0
  149. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/iot_report.py +0 -0
  150. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/ipv6_config.py +0 -0
  151. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/locations.py +0 -0
  152. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/malware_protection_policy.py +0 -0
  153. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/mobile_threat_settings.py +0 -0
  154. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/__init__.py +0 -0
  155. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/activation.py +0 -0
  156. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/admin_roles.py +0 -0
  157. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/admin_users.py +0 -0
  158. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/advanced_settings.py +0 -0
  159. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/advanced_threat_settings.py +0 -0
  160. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/alert_subscriptions.py +0 -0
  161. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/apptotal.py +0 -0
  162. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/authentication_settings.py +0 -0
  163. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/bandwidth_classes.py +0 -0
  164. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/bandwidth_control_rules.py +0 -0
  165. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_app_instances.py +0 -0
  166. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_app_policy.py +0 -0
  167. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_browser_isolation.py +0 -0
  168. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_app_services.py +0 -0
  169. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_destination_groups.py +0 -0
  170. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_dns_rules.py +0 -0
  171. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_ips_rules.py +0 -0
  172. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_nw_application_groups.py +0 -0
  173. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_nw_applications.py +0 -0
  174. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_nw_service.py +0 -0
  175. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_nw_service_groups.py +0 -0
  176. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_rules.py +0 -0
  177. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_source_groups.py +0 -0
  178. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_firewall_time_windows.py +0 -0
  179. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloud_nss.py +0 -0
  180. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/cloudappcontrol.py +0 -0
  181. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/common.py +0 -0
  182. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dedicated_ip_gateways.py +0 -0
  183. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/device_groups.py +0 -0
  184. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/devices.py +0 -0
  185. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_dictionary.py +0 -0
  186. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_engine.py +0 -0
  187. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_resources.py +0 -0
  188. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_templates.py +0 -0
  189. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dlp_web_rules.py +0 -0
  190. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/dns_gatways.py +0 -0
  191. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/endusernotification.py +0 -0
  192. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/filetyperules.py +0 -0
  193. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/forwarding_control_policy.py +0 -0
  194. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/ftp_control_policy.py +0 -0
  195. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/gre_recommended_list.py +0 -0
  196. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/gre_tunnel_info.py +0 -0
  197. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/gre_tunnels.py +0 -0
  198. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/gre_vips.py +0 -0
  199. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/intermediate_certificates.py +0 -0
  200. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/iotreport.py +0 -0
  201. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/ipv6_config.py +0 -0
  202. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/location_group.py +0 -0
  203. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/location_management.py +0 -0
  204. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/malware_protection_settings.py +0 -0
  205. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/mobile_threat_settings.py +0 -0
  206. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/nat_control_policy.py +0 -0
  207. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/nss_servers.py +0 -0
  208. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/organization_information.py +0 -0
  209. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/pac_files.py +0 -0
  210. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/proxies.py +0 -0
  211. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/proxy_gatways.py +0 -0
  212. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/remoteassistance.py +0 -0
  213. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/risk_profiles.py +0 -0
  214. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/rule_labels.py +0 -0
  215. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/sandboxrules.py +0 -0
  216. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/security_policy_settings.py +0 -0
  217. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/shadow_it_report.py +0 -0
  218. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/ssl_inspection_rules.py +0 -0
  219. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/subclouds.py +0 -0
  220. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/system_audit.py +0 -0
  221. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/tenancy_restriction_profile.py +0 -0
  222. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/time_intervals.py +0 -0
  223. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_datacenters.py +0 -0
  224. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_dc_exclusions.py +0 -0
  225. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_extranet.py +0 -0
  226. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_static_ip.py +0 -0
  227. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/traffic_vpn_credentials.py +0 -0
  228. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/url_filter_cloud_app_settings.py +0 -0
  229. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/url_filtering_rules.py +0 -0
  230. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/urlcategory.py +0 -0
  231. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/user_management.py +0 -0
  232. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/workload_groups.py +0 -0
  233. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/models/zpa_gateway.py +0 -0
  234. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/nat_control_policy.py +0 -0
  235. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/nss_servers.py +0 -0
  236. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/organization_information.py +0 -0
  237. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/pac_files.py +0 -0
  238. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/policy_export.py +0 -0
  239. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/proxies.py +0 -0
  240. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/remote_assistance.py +0 -0
  241. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/risk_profiles.py +0 -0
  242. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/rule_labels.py +0 -0
  243. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/sandbox.py +0 -0
  244. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/sandbox_rules.py +0 -0
  245. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/security_policy_settings.py +0 -0
  246. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/shadow_it_report.py +0 -0
  247. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/ssl_inspection_rules.py +0 -0
  248. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/sub_clouds.py +0 -0
  249. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/system_audit.py +0 -0
  250. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/tenancy_restriction_profile.py +0 -0
  251. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/time_intervals.py +0 -0
  252. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/traffic_datacenters.py +0 -0
  253. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/traffic_extranet.py +0 -0
  254. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/traffic_static_ip.py +0 -0
  255. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/traffic_vpn_credentials.py +0 -0
  256. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/url_filtering.py +0 -0
  257. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/user_management.py +0 -0
  258. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/workload_groups.py +0 -0
  259. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/zia_service.py +0 -0
  260. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zia/zpa_gateway.py +0 -0
  261. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/__init__.py +0 -0
  262. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/administrator_controller.py +0 -0
  263. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_connector_groups.py +0 -0
  264. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_connector_schedule.py +0 -0
  265. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_connectors.py +0 -0
  266. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/app_segment_by_type.py +0 -0
  267. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_banner.py +0 -0
  268. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_certificate.py +0 -0
  269. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_profile.py +0 -0
  270. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_region.py +0 -0
  271. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cbi_zpa_profile.py +0 -0
  272. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/certificates.py +0 -0
  273. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/client_settings.py +0 -0
  274. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/cloud_connector_groups.py +0 -0
  275. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/customer_controller.py +0 -0
  276. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/customer_version_profile.py +0 -0
  277. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/emergency_access.py +0 -0
  278. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/enrollment_certificates.py +0 -0
  279. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/idp.py +0 -0
  280. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/lss.py +0 -0
  281. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/machine_groups.py +0 -0
  282. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/microtenants.py +0 -0
  283. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/administrator_controller.py +0 -0
  284. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/app_connector_schedule.py +0 -0
  285. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/app_connectors.py +0 -0
  286. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/application_servers.py +0 -0
  287. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_banner.py +0 -0
  288. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_certificate.py +0 -0
  289. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_profile.py +0 -0
  290. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_region.py +0 -0
  291. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cbi_zpa_profile.py +0 -0
  292. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/certificates.py +0 -0
  293. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/client_settings.py +0 -0
  294. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/cloud_connector_groups.py +0 -0
  295. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/customer_controller.py +0 -0
  296. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/customer_version_profile.py +0 -0
  297. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/emergency_access.py +0 -0
  298. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/enrollment_certificates.py +0 -0
  299. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/idp.py +0 -0
  300. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/lss.py +0 -0
  301. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/machine_groups.py +0 -0
  302. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/microtenants.py +0 -0
  303. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/policyset_controller_v1.py +0 -0
  304. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/posture_profiles.py +0 -0
  305. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_approval.py +0 -0
  306. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_cred_pool_controller.py +0 -0
  307. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_credential.py +0 -0
  308. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/pra_portal.py +0 -0
  309. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/provisioning_keys.py +0 -0
  310. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/role_controller.py +0 -0
  311. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/saml_attributes.py +0 -0
  312. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/scim_attributes.py +0 -0
  313. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/scim_groups.py +0 -0
  314. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/service_edge_schedule.py +0 -0
  315. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/service_edges.py +0 -0
  316. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/models/trusted_network.py +0 -0
  317. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/posture_profiles.py +0 -0
  318. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_approval.py +0 -0
  319. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_console.py +0 -0
  320. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_credential.py +0 -0
  321. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_credential_pool.py +0 -0
  322. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/pra_portal.py +0 -0
  323. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/provisioning.py +0 -0
  324. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/role_controller.py +0 -0
  325. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/saml_attributes.py +0 -0
  326. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/scim_attributes.py +0 -0
  327. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/scim_groups.py +0 -0
  328. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/segment_groups.py +0 -0
  329. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/server_groups.py +0 -0
  330. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/servers.py +0 -0
  331. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/service_edge_group.py +0 -0
  332. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/service_edge_schedule.py +0 -0
  333. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/service_edges.py +0 -0
  334. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zpa/trusted_networks.py +0 -0
  335. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/__init__.py +0 -0
  336. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/account_details.py +0 -0
  337. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/activation.py +0 -0
  338. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/admin_roles.py +0 -0
  339. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/admin_users.py +0 -0
  340. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/api_keys.py +0 -0
  341. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ec_groups.py +0 -0
  342. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/forwarding_gateways.py +0 -0
  343. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/forwarding_rules.py +0 -0
  344. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ip_destination_groups.py +0 -0
  345. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ip_groups.py +0 -0
  346. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ip_source_groups.py +0 -0
  347. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/location_management.py +0 -0
  348. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/location_template.py +0 -0
  349. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/activation.py +0 -0
  350. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/admin_roles.py +0 -0
  351. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/admin_users.py +0 -0
  352. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/api_keys.py +0 -0
  353. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/common.py +0 -0
  354. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ec_group_vm.py +0 -0
  355. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ecgroup.py +0 -0
  356. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/forwarding_gateways.py +0 -0
  357. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/forwarding_rules.py +0 -0
  358. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ip_destination_groups.py +0 -0
  359. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ip_groups.py +0 -0
  360. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/ip_source_groups.py +0 -0
  361. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/location_management.py +0 -0
  362. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/location_templates.py +0 -0
  363. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/nw_service.py +0 -0
  364. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/nw_service_groups.py +0 -0
  365. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/provisioning_url.py +0 -0
  366. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/traffic_vpn_credentials.py +0 -0
  367. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/models/zpa_resources.py +0 -0
  368. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/nw_service.py +0 -0
  369. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/nw_service_groups.py +0 -0
  370. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/provisioning_url.py +0 -0
  371. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/ztw/ztw_service.py +0 -0
  372. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/__init__.py +0 -0
  373. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/audit_logs.py +0 -0
  374. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/dlp_incidents.py +0 -0
  375. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/legacy.py +0 -0
  376. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/audit_logs.py +0 -0
  377. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/change_history.py +0 -0
  378. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/common.py +0 -0
  379. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/generated_tickets.py +0 -0
  380. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_details.py +0 -0
  381. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_evidence.py +0 -0
  382. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_group_search.py +0 -0
  383. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_search.py +0 -0
  384. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/models/incident_trigger.py +0 -0
  385. {zscaler_sdk_python-1.3.0 → zscaler_sdk_python-1.4.0}/zscaler/zwa/zwa_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zscaler-sdk-python
3
- Version: 1.3.0
3
+ Version: 1.4.0
4
4
  Summary: Official Python SDK for the Zscaler Products
5
5
  Home-page: https://github.com/zscaler/zscaler-sdk-python
6
6
  License: MIT
@@ -23,7 +23,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
23
  Provides-Extra: dev
24
24
  Requires-Dist: aenum (>=3.1.11)
25
25
  Requires-Dist: arrow (>=1.3.0)
26
- Requires-Dist: cryptography (>=43.0.0)
26
+ Requires-Dist: cryptography (>=45.0.2)
27
27
  Requires-Dist: flatdict (>=4.0.0)
28
28
  Requires-Dist: pydash (>=8.0.3)
29
29
  Requires-Dist: pyjwt (>=2.8.0)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "zscaler-sdk-python"
3
- version = "1.3.0"
3
+ version = "1.4.0"
4
4
  description = "Official Python SDK for the Zscaler Products"
5
5
  authors = ["Zscaler, Inc. <devrel@zscaler.com>"]
6
6
  license = "MIT"
@@ -30,7 +30,7 @@ packages = [
30
30
  [tool.poetry.dependencies]
31
31
  python = ">=3.9.2,<4.0"
32
32
  requests = ">=2.32.3"
33
- cryptography = ">=43.0.0"
33
+ cryptography = ">=45.0.2"
34
34
  pyyaml = ">=6.0.0"
35
35
  pytz = ">=2024.2"
36
36
  python-box = ">=7.3.0"
@@ -29,7 +29,7 @@ __license__ = "MIT"
29
29
  __contributors__ = [
30
30
  "William Guilherme",
31
31
  ]
32
- __version__ = "1.3.0"
32
+ __version__ = "1.4.0"
33
33
 
34
34
 
35
35
  from zscaler.oneapi_client import Client as ZscalerClient # noqa
@@ -0,0 +1,10 @@
1
+ class HTTPError(Exception):
2
+ def __init__(self, url, response_details, response_body):
3
+ self.status_code = response_details.status_code
4
+ self.url = url
5
+ self.response_headers = response_details.headers
6
+ self.message = f"HTTP {self.status_code} {response_body}"
7
+ super().__init__(self.message) # ✅ important
8
+
9
+ def __str__(self):
10
+ return self.message
@@ -0,0 +1,57 @@
1
+ import json
2
+ import logging
3
+ from zscaler.errors.http_error import HTTPError
4
+ from zscaler.errors.zscaler_api_error import ZscalerAPIError
5
+ from zscaler.exceptions import HTTPException, ZscalerAPIException
6
+ from zscaler.exceptions import exceptions
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+ @staticmethod
11
+ def check_response_for_error(url, response_details, response_body):
12
+ """
13
+ Checks HTTP response for errors in the response body.
14
+
15
+ Args:
16
+ url (str): URL of the response
17
+ response_details (requests.Response): Response object with details
18
+ response_body (str): Response body in JSON or plain string
19
+
20
+ Returns:
21
+ Tuple(dict or None, error or None)
22
+ """
23
+ # Defensive check: if response_details is not a real HTTP response, skip
24
+ if not hasattr(response_details, "headers"):
25
+ logger.debug(f"[SKIP] check_response_for_error received non-Response object: {type(response_details)}")
26
+ return response_details, None
27
+
28
+ content_type = response_details.headers.get("Content-Type", "")
29
+ is_json = "application/json" in content_type
30
+ body_text = response_body if isinstance(response_body, str) else str(response_body)
31
+
32
+ try:
33
+ formatted_response = json.loads(response_body) if is_json else response_body
34
+ except json.JSONDecodeError as e:
35
+ logger.warning(f"Non-JSON response from {url}: {body_text}")
36
+ if exceptions.raise_exception:
37
+ raise HTTPException(url, response_details, body_text)
38
+ return None, HTTPError(url, response_details, body_text)
39
+
40
+ # ✅ Only now we are confident it's safe to access .status_code
41
+ status_code = response_details.status_code
42
+
43
+ if 200 <= status_code < 300:
44
+ return formatted_response, None
45
+
46
+ try:
47
+ error = ZscalerAPIError(url, response_details, formatted_response)
48
+ if exceptions.raise_exception:
49
+ raise ZscalerAPIException(error)
50
+ return None, error
51
+
52
+ except Exception as e:
53
+ logger.exception("Failed to construct ZscalerAPIError.")
54
+ generic_error = HTTPError(url, response_details, formatted_response)
55
+ if exceptions.raise_exception:
56
+ raise HTTPException(str(generic_error)) from e
57
+ return None, generic_error
@@ -1,50 +1,40 @@
1
- from zscaler.errors.error import Error
2
1
  import json
3
2
 
4
3
 
5
- class ZscalerAPIError(Error):
4
+ class ZscalerAPIError(Exception):
6
5
  def __init__(self, url, response_details, response_body, service_type=""):
7
6
  self.status_code = response_details.status_code
8
7
  self.url = url
8
+ self.service_type = service_type.lower()
9
9
  self.headers = response_details.headers
10
10
  self.stack = ""
11
- self.service_type = service_type.lower()
12
11
 
13
- # Ensure response_body is a dict
14
12
  if not isinstance(response_body, dict):
15
13
  response_body = {"message": str(response_body)}
16
14
 
17
- # Initialize fields
18
- self.error_code = None
19
- self.error_message = None
20
- self.params = None
21
- self.path = None
22
-
23
- # Populate based on service type
24
- if self.service_type == "zpa":
25
- self.error_code = response_body.get("id")
26
- self.error_message = response_body.get("reason")
27
- self.params = response_body.get("params")
28
- else: # default to ZIA/others
29
- self.error_code = response_body.get("code") or response_body.get("id")
30
- self.error_message = response_body.get("message") or response_body.get("reason")
31
-
32
- self.params = self.params or []
15
+ self.error_code = response_body.get("code") or response_body.get("id")
16
+ self.error_message = response_body.get("message") or response_body.get("reason")
17
+ self.params = response_body.get("params", [])
33
18
  self.path = response_body.get("path")
34
19
 
35
- # Construct message string
36
20
  message_parts = [f"HTTP {self.status_code}"]
37
21
  if self.error_code:
38
- message_parts.append(self.error_code)
22
+ message_parts.append(str(self.error_code))
39
23
  if self.error_message:
40
24
  message_parts.append(self.error_message)
41
25
  if self.params:
42
26
  message_parts.append(f"Parameters: {', '.join(self.params)}")
43
27
 
44
28
  self.message = " ".join(message_parts)
29
+ super().__init__(self.message) # ✅ This is what makes it raise-able
45
30
 
46
31
  def __str__(self):
47
- error_payload = {"status": self.status_code, "code": self.error_code, "message": self.error_message, "url": self.url}
32
+ error_payload = {
33
+ "status": self.status_code,
34
+ "code": self.error_code,
35
+ "message": self.error_message,
36
+ "url": self.url,
37
+ }
48
38
  if self.params:
49
39
  error_payload["params"] = self.params
50
40
  if self.path:
@@ -1,5 +1,6 @@
1
1
  import json
2
2
 
3
+ raise_exception = False
3
4
 
4
5
  # Zscaler Base Exceptions
5
6
  class ZscalerBaseException(Exception):
@@ -117,7 +117,14 @@ def to_snake_case(string):
117
117
  "truncate_large_udpdns_response": "truncateLargeUDPDNSResponse",
118
118
  "enableZCCRevert": "enable_zcc_revert",
119
119
  "enableZiaDR": "enable_zia_dr",
120
- "purge_kerberos_preferred_dc_cache": "purgeKerberosPreferredDCCache"
120
+ "purgeKerberosPreferredDCCache": "purge_kerberos_preferred_dc_cache",
121
+
122
+ # ZPA Edge Cases
123
+ "serverGroupDTOs": "server_group_dtos",
124
+ "extranetDTO": "extranet_dto",
125
+ "locationGroupDTO": "location_group_dto",
126
+ "locationDTO": "location_dto",
127
+ "predefinedADPControls": "predefined_adp_controls"
121
128
  }
122
129
 
123
130
  if string in FIELD_EXCEPTIONS:
@@ -242,7 +249,14 @@ def to_lower_camel_case(string):
242
249
  "enable_zcc_revert": "enableZCCRevert",
243
250
  "delete_dhcp_option121_routes": "deleteDHCPOption121Routes",
244
251
  "enableZiaDR": "enable_zia_dr",
245
- "purgeKerberosPreferredDCCache": "purge_kerberos_preferred_dc_cache"
252
+ "purgeKerberosPreferredDCCache": "purge_kerberos_preferred_dc_cache",
253
+
254
+ # ZPA Edge Cases
255
+ "server_group_dtos": "serverGroupDTOs",
256
+ "extranet_dto": "extranetDTO",
257
+ "location_group_dto": "locationGroupDTO",
258
+ "location_dto": "locationDTO",
259
+ "predefined_adp_controls": "predefinedADPControls"
246
260
  }
247
261
 
248
262
  if string in FIELD_EXCEPTIONS:
@@ -1,12 +1,7 @@
1
- import json
2
1
  import requests
3
2
  import logging
4
3
  import os
5
4
  import time
6
- from zscaler.errors.http_error import HTTPError
7
- from zscaler.errors.zscaler_api_error import ZscalerAPIError
8
- from zscaler.exceptions import HTTPException, ZscalerAPIException
9
- from http import HTTPStatus
10
5
  from zscaler.logger import dump_request, dump_response
11
6
  from zscaler.zcc.legacy import LegacyZCCClientHelper
12
7
  from zscaler.ztw.legacy import LegacyZTWClientHelper
@@ -25,7 +20,7 @@ class HTTPClient:
25
20
  Custom HTTP clients should inherit from this class.
26
21
  """
27
22
 
28
- raise_exception = False
23
+ # raise_exception = False
29
24
 
30
25
  def __init__(
31
26
  self,
@@ -335,52 +330,6 @@ class HTTPClient:
335
330
  # logger.error(f"Unexpected error during request execution: {error}")
336
331
  return (None, error)
337
332
 
338
- @staticmethod
339
- def check_response_for_error(url, response_details, response_body):
340
- """
341
- Checks HTTP response for errors in the response body.
342
-
343
- Args:
344
- url (str): URL of the response
345
- response_details (requests.Response): Response object with details
346
- response_body (str): Response body in JSON or plain string
347
-
348
- Returns:
349
- Tuple(dict or None, error or None)
350
- """
351
- content_type = response_details.headers.get("Content-Type", "")
352
- is_json = "application/json" in content_type
353
-
354
- # Attempt to parse JSON safely
355
- try:
356
- formatted_response = json.loads(response_body) if is_json else response_body
357
- except json.JSONDecodeError as e:
358
- logger.error(f"Failed to parse JSON response: {e}")
359
- if HTTPClient.raise_exception:
360
- raise HTTPException(f"Invalid JSON response from {url}: {response_body}")
361
- return None, HTTPError(url, response_details, response_body)
362
-
363
- status_code = response_details.status_code
364
-
365
- if 200 <= status_code < 300:
366
- return formatted_response, None
367
-
368
- # Defensive error handling block (minimal, correct)
369
- try:
370
- error = ZscalerAPIError(url, response_details, formatted_response)
371
- # logger.debug(f"Raw API Error JSON: {json.dumps(formatted_response, indent=2)}")
372
- if HTTPClient.raise_exception:
373
- raise ZscalerAPIException(error)
374
- return None, error
375
-
376
- except Exception as e:
377
- # Catch-all in case ZscalerAPIError constructor fails
378
- logger.exception("Failed to construct ZscalerAPIError.")
379
- generic_error = HTTPError(url, response_details, formatted_response)
380
- if HTTPClient.raise_exception:
381
- raise HTTPException(str(generic_error)) from e
382
- return None, generic_error
383
-
384
333
  @staticmethod
385
334
  def format_binary_data(data):
386
335
  """Formats binary data for multipart uploads."""
@@ -7,6 +7,7 @@ from cryptography.hazmat.backends import default_backend
7
7
  from cryptography.hazmat.primitives import serialization
8
8
  from zscaler.user_agent import UserAgent
9
9
  from zscaler.oneapi_http_client import HTTPClient
10
+ from zscaler.errors.response_checker import check_response_for_error
10
11
 
11
12
  logger = logging.getLogger(__name__)
12
13
 
@@ -193,7 +194,7 @@ class OAuth:
193
194
  response = self.authenticate()
194
195
 
195
196
  # Check the response body for error messages using check_response_for_error
196
- parsed_response, err = HTTPClient.check_response_for_error(response.url, response, response.text)
197
+ parsed_response, err = check_response_for_error(response.url, response, response.text)
197
198
 
198
199
  if err:
199
200
  logging.error(f"Error during authentication: {err}")
@@ -8,6 +8,8 @@ from zscaler.user_agent import UserAgent
8
8
  from zscaler.error_messages import ERROR_MESSAGE_429_MISSING_DATE_X_RESET
9
9
  from http import HTTPStatus
10
10
  from zscaler.helpers import convert_keys_to_snake_case, convert_keys_to_camel_case
11
+ from zscaler.errors.response_checker import check_response_for_error
12
+ from zscaler.exceptions import exceptions
11
13
  from zscaler.zcc.legacy import LegacyZCCClientHelper
12
14
  from zscaler.ztw.legacy import LegacyZTWClientHelper
13
15
  from zscaler.zdx.legacy import LegacyZDXClientHelper
@@ -117,7 +119,7 @@ class RequestExecutor:
117
119
  zwa_legacy_client=self.zwa_legacy_client,
118
120
  )
119
121
 
120
- HTTPClient.raise_exception = self._config["client"].get("raiseException", False)
122
+ exceptions.raise_exception = self._config["client"].get("raiseException", False)
121
123
  self._custom_headers = {}
122
124
 
123
125
  def get_base_url(self, endpoint: str) -> str:
@@ -330,9 +332,6 @@ class RequestExecutor:
330
332
  """
331
333
  try:
332
334
  request, response, response_body, error = self.fire_request(request)
333
- logger.debug(
334
- f"[DEBUG] Got response: {response} (status: {getattr(response, 'status_code', 'N/A')}) | error: {error}"
335
- )
336
335
  except Exception as ex:
337
336
  logger.error(f"Exception during HTTP request: {ex}")
338
337
  return None, ex
@@ -353,7 +352,7 @@ class RequestExecutor:
353
352
  return response, None
354
353
 
355
354
  try:
356
- response_data, error = self._http_client.check_response_for_error(request["url"], response, response_body)
355
+ response_data, error = check_response_for_error(request["url"], response, response_body)
357
356
  except Exception as ex:
358
357
  logger.error(f"Exception while checking response for errors: {ex}")
359
358
  return None, ex
@@ -517,45 +516,6 @@ class RequestExecutor:
517
516
  # If we reach here, no further retries; return whatever we got
518
517
  return request, response, response.text, None
519
518
 
520
- # def fire_request_helper(self, request, attempts, request_start_time):
521
- # """
522
- # Helper method to perform HTTP call with retries if needed.
523
-
524
- # Args:
525
- # request (dict): HTTP request representation.
526
- # attempts (int): Number of attempted HTTP calls so far.
527
- # request_start_time (float): Original start time of request.
528
-
529
- # Returns:
530
- # Tuple of request, response object, response body, and error.
531
- # """
532
- # current_req_start_time = time.time()
533
- # max_retries = self._max_retries
534
- # req_timeout = self._request_timeout
535
-
536
- # if req_timeout > 0 and (current_req_start_time - request_start_time) > req_timeout:
537
- # logger.warning("Request Timeout exceeded.")
538
- # return None, None, None, Exception("Request Timeout exceeded.")
539
-
540
- # response, error = self._http_client.send_request(request)
541
-
542
- # if error:
543
- # # logger.error(f"Error sending request: {error}")
544
- # return request, response, response.text if response else None, error
545
-
546
- # headers = response.headers
547
-
548
- # if attempts < max_retries and self.is_retryable_status(response.status_code):
549
- # backoff_seconds = self.get_retry_after(headers, logger)
550
- # if backoff_seconds is None:
551
- # return None, response, response.text, Exception(ERROR_MESSAGE_429_MISSING_DATE_X_RESET)
552
- # logger.info(f"Hit rate limit. Retrying request in {backoff_seconds} seconds.")
553
- # time.sleep(backoff_seconds)
554
- # attempts += 1
555
- # return self.fire_request_helper(request, attempts, request_start_time)
556
-
557
- # return request, response, response.text, None
558
-
559
519
  def is_retryable_status(self, status):
560
520
  """
561
521
  Checks if HTTP status is retryable.
@@ -634,7 +594,13 @@ class RequestExecutor:
634
594
 
635
595
  def get_retry_after(self, headers, logger):
636
596
  retry_limit_reset_header = (
637
- headers.get("x-ratelimit-reset") or headers.get("X-RateLimit-Reset") or headers.get("RateLimit-Reset")
597
+ headers.get("x-ratelimit-reset") or
598
+ headers.get("X-RateLimit-Reset") or
599
+ headers.get("RateLimit-Reset") or
600
+
601
+ # ZCC Specific Rate Limiting Headers (LegacyZCCClientHelper)
602
+ headers.get("X-Rate-Limit-Retry-After-Seconds") or # ZCC /downloadDevices Rate Limiting Header (LegacyZCCClientHelper)
603
+ headers.get("X-Rate-Limit-Remaining") # (LegacyZCCClientHelper)
638
604
  )
639
605
  retry_after = headers.get("Retry-After") or headers.get("retry-after")
640
606
 
@@ -717,69 +717,144 @@ def format_url(base_string):
717
717
  """
718
718
  return "".join([line.strip() for line in base_string.splitlines()])
719
719
 
720
+ # def zcc_param_mapper(func):
721
+ # @wraps(func)
722
+ # def wrapper(self, *args, **kwargs):
723
+ # query_params = kwargs.get("query_params", {}) or {}
724
+ # body = kwargs.copy()
725
+ # mapped_params = {}
726
+
727
+ # # -------------------------------
728
+ # # Detect source of raw inputs
729
+ # # -------------------------------
730
+ # raw_os = (
731
+ # query_params.get("os_type") or
732
+ # query_params.get("os_types") or
733
+ # body.get("os_type") or
734
+ # body.get("os_types")
735
+ # )
736
+
737
+ # if raw_os:
738
+ # raw_os = [raw_os] if isinstance(raw_os, str) else raw_os
739
+ # mapped = [
740
+ # str(zcc_param_map["os"].get(os.lower()))
741
+ # for os in raw_os
742
+ # if zcc_param_map["os"].get(os.lower())
743
+ # ]
744
+ # if not mapped:
745
+ # raise ValueError("Invalid `os_type` or `os_types` provided.")
746
+ # mapped_params["osTypes"] = ",".join(mapped)
747
+
748
+ # raw_reg = (
749
+ # query_params.get("registration_type") or
750
+ # query_params.get("registration_types") or
751
+ # body.get("registration_type") or
752
+ # body.get("registration_types")
753
+ # )
754
+
755
+ # if raw_reg:
756
+ # raw_reg = [raw_reg] if isinstance(raw_reg, str) else raw_reg
757
+ # mapped = [
758
+ # str(zcc_param_map["reg_type"].get(rt.lower()))
759
+ # for rt in raw_reg
760
+ # if zcc_param_map["reg_type"].get(rt.lower())
761
+ # ]
762
+ # if not mapped:
763
+ # raise ValueError("Invalid `registration_type(s)` provided.")
764
+ # mapped_params["registrationTypes"] = ",".join(mapped)
765
+
766
+ # # Clean aliases
767
+ # for key in [
768
+ # "os_type", "os_types",
769
+ # "registration_type", "registration_types",
770
+ # ]:
771
+ # query_params.pop(key, None)
772
+ # kwargs.pop(key, None)
773
+
774
+ # # Distribute to the appropriate location
775
+ # if "query_params" in kwargs:
776
+ # query_params.update(mapped_params)
777
+ # kwargs["query_params"] = query_params
778
+ # else:
779
+ # kwargs.update(mapped_params)
780
+
781
+ # return func(self, *args, **kwargs)
782
+
783
+ # return wrapper
784
+
720
785
  def zcc_param_mapper(func):
721
786
  @wraps(func)
722
787
  def wrapper(self, *args, **kwargs):
723
788
  query_params = kwargs.get("query_params", {}) or {}
789
+ body = kwargs.copy()
724
790
  mapped_params = {}
725
791
 
726
- # Normalize and map os_types
727
- if "os_type" in query_params:
728
- os_raw = query_params["os_type"]
729
- if isinstance(os_raw, str):
730
- os_raw = [os_raw] # ✅ support single string value
731
-
732
- mapped = [
733
- str(zcc_param_map["os"].get(os_type.lower()))
734
- for os_type in os_raw
735
- if zcc_param_map["os"].get(os_type.lower())
736
- ]
737
- if not mapped:
738
- raise ValueError("Invalid `os_type` provided.")
739
- mapped_params["osType"] = ",".join(mapped)
740
-
741
- # Normalize and map os_types
742
- if "device_type" in query_params:
743
- os_raw = query_params["device_type"]
744
- if isinstance(os_raw, str):
745
- os_raw = [os_raw] # ✅ support single string value
792
+ # -------------------------------
793
+ # Detect source of raw inputs
794
+ # -------------------------------
795
+ raw_os = (
796
+ query_params.get("os_type") or
797
+ query_params.get("os_types") or
798
+ body.get("os_type") or
799
+ body.get("os_types")
800
+ )
746
801
 
802
+ if raw_os:
803
+ raw_os = [raw_os] if isinstance(raw_os, str) else raw_os
747
804
  mapped = [
748
- str(zcc_param_map["os"].get(os_type.lower()))
749
- for os_type in os_raw
750
- if zcc_param_map["os"].get(os_type.lower())
805
+ str(zcc_param_map["os"].get(os.lower()))
806
+ for os in raw_os
807
+ if zcc_param_map["os"].get(os.lower())
751
808
  ]
752
809
  if not mapped:
753
- raise ValueError("Invalid `device_type` provided.")
754
- mapped_params["deviceType"] = ",".join(mapped)
755
-
756
- # Normalize and map registration_types
757
- if "registration_types" in query_params:
758
- reg_raw = query_params["registration_types"]
759
- if isinstance(reg_raw, str):
760
- reg_raw = [reg_raw]
810
+ raise ValueError("Invalid `os_type` or `os_types` provided.")
811
+ # Use singular key if original was singular, plural if original was plural
812
+ if "os_type" in query_params or "os_type" in body:
813
+ mapped_params["osType"] = ",".join(mapped)
814
+ else:
815
+ mapped_params["osTypes"] = ",".join(mapped)
816
+
817
+ raw_reg = (
818
+ query_params.get("registration_type") or
819
+ query_params.get("registration_types") or
820
+ body.get("registration_type") or
821
+ body.get("registration_types")
822
+ )
761
823
 
824
+ if raw_reg:
825
+ raw_reg = [raw_reg] if isinstance(raw_reg, str) else raw_reg
762
826
  mapped = [
763
827
  str(zcc_param_map["reg_type"].get(rt.lower()))
764
- for rt in reg_raw
828
+ for rt in raw_reg
765
829
  if zcc_param_map["reg_type"].get(rt.lower())
766
830
  ]
767
831
  if not mapped:
768
- raise ValueError("Invalid `registration_types` provided.")
769
- mapped_params["registrationTypes"] = ",".join(mapped)
770
-
771
- # Drop user-friendly keys
772
- query_params.pop("os_types", None)
773
- query_params.pop("registration_types", None)
832
+ raise ValueError("Invalid `registration_type(s)` provided.")
833
+ # Use singular key if original was singular, plural if original was plural
834
+ if "registration_type" in query_params or "registration_type" in body:
835
+ mapped_params["registrationType"] = ",".join(mapped)
836
+ else:
837
+ mapped_params["registrationTypes"] = ",".join(mapped)
838
+
839
+ # Clean aliases
840
+ for key in [
841
+ "os_type", "os_types",
842
+ "registration_type", "registration_types",
843
+ ]:
844
+ query_params.pop(key, None)
845
+ kwargs.pop(key, None)
774
846
 
775
- # Merge in mapped numeric params
776
- query_params.update(mapped_params)
777
- kwargs["query_params"] = query_params
847
+ # Distribute to the appropriate location
848
+ if "query_params" in kwargs:
849
+ query_params.update(mapped_params)
850
+ kwargs["query_params"] = query_params
851
+ else:
852
+ kwargs.update(mapped_params)
778
853
 
779
854
  return func(self, *args, **kwargs)
855
+
780
856
  return wrapper
781
857
 
782
- # Maps ZCC numeric os_type and registration_type arguments to a human-readable string
783
858
  zcc_param_map = {
784
859
  "os": {
785
860
  "ios": 1,
@@ -798,6 +873,13 @@ zcc_param_map = {
798
873
  },
799
874
  }
800
875
 
876
+ class RateLimitExceededError(Exception):
877
+ def __init__(self, retry_at: datetime):
878
+ super().__init__(
879
+ f"/downloadDevices daily limit reached. Try again at {retry_at.isoformat()}."
880
+ )
881
+ self.retry_at = retry_at
882
+
801
883
 
802
884
  def dump_request(logger, url: str, method: str, json, params, headers, request_uuid: str, body=True):
803
885
  request_headers_filtered = {key: value for key, value in headers.items() if key != "Authorization"}
@@ -861,3 +943,4 @@ def dump_response(
861
943
  log_lines.append(f"\n{response_body}")
862
944
  log_lines.append("-" * 68)
863
945
  logger.info("\n".join(log_lines))
946
+
@@ -44,9 +44,13 @@ class AdminUserAPI(APIClient):
44
44
  Examples:
45
45
  Prints all admins in the Client Connector Portal to the console:
46
46
 
47
- >>> for admin in zcc.admin_user.list_admin_users():
48
- ... print(admin)
49
-
47
+ >>> user_list, _, err = client.zcc.admin_user.list_admin_users()
48
+ >>> if err:
49
+ ... print(f"Error listing admin users: {err}")
50
+ ... return
51
+ ... print(f"Total admin users found: {len(user_list)}")
52
+ ... for user in user_list:
53
+ ... print(user.as_dict())
50
54
  """
51
55
  http_method = "get".upper()
52
56
  api_url = format_url(
@@ -58,7 +62,6 @@ class AdminUserAPI(APIClient):
58
62
 
59
63
  query_params = query_params or {}
60
64
 
61
- # Prepare request body and headers
62
65
  body = {}
63
66
  headers = {}
64
67