Office365-REST-Python-Client 3.0.0__py3-none-any.whl → 3.1.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.
- office365/admin/baseline_parameter.py +15 -0
- office365/admin/baseline_resource.py +17 -0
- office365/admin/drift_status.py +13 -0
- office365/admin/exchange/exchange_message_trace_status.py +18 -0
- office365/admin/snapshot_job_status.py +16 -0
- office365/backuprestore/artifact_query.py +16 -0
- office365/backuprestore/notification_events_type.py +13 -0
- office365/backuprestore/restorejobtype.py +1 -0
- office365/backuprestore/restorepoints/search_response.py +21 -0
- office365/backuprestore/restorepoints/search_result.py +14 -0
- office365/backuprestore/restoresessions/artifact_count.py +17 -0
- office365/backuprestore/restoresessions/browsable_resource_type.py +15 -0
- office365/backuprestore/restoresessions/browse_query_order.py +15 -0
- office365/backuprestore/restoresessions/browse_query_response_item.py +20 -0
- office365/backuprestore/restoresessions/browse_query_response_item_type.py +16 -0
- office365/backuprestore/restoresessions/browse_session_status.py +14 -0
- office365/backuprestore/restoresessions/browser_shared_cookie_history.py +24 -0
- office365/backuprestore/service_status.py +28 -1
- office365/backuprestore/time_period.py +16 -0
- office365/booking/assigned_place_mode.py +15 -0
- office365/booking/business/import_building_map_setting.py +14 -0
- office365/booking/chedulingpolicy.py +4 -2
- office365/booking/customers/information.py +4 -2
- office365/booking/drop_in_place_mode.py +10 -0
- office365/booking/mailbox_details.py +15 -0
- office365/booking/place_mode.py +10 -0
- office365/booking/place_service_plan_info.py +14 -0
- office365/booking/reservable_place_mode.py +10 -0
- office365/booking/unavailable_place_mode.py +14 -0
- office365/communications/adhoc_call.py +31 -0
- office365/communications/broadcastmeetingaudience.py +9 -1
- office365/communications/callrecords/audio_codec.py +33 -0
- office365/communications/callrecords/media_stream_direction.py +12 -0
- office365/communications/callrecords/modality.py +0 -1
- office365/communications/callrecords/network_connection_type.py +16 -0
- office365/communications/callrecords/network_transport_protocol.py +14 -0
- office365/communications/callrecords/product_family.py +16 -0
- office365/communications/callrecords/pstn_call_duration_source.py +12 -0
- office365/communications/callrecords/service_role.py +32 -0
- office365/communications/callrecords/user_feedback_rating.py +17 -0
- office365/communications/callrecords/video_codec.py +22 -0
- office365/communications/cloud_communications.py +3 -6
- office365/communications/onlinemeetings/attendee_notification_info.py +15 -0
- office365/communications/onlinemeetings/base.py +152 -1
- office365/communications/onlinemeetings/broadcast_settings.py +4 -0
- office365/communications/onlinemeetings/lobby_bypass_settings.py +16 -0
- office365/communications/onlinemeetings/online_meeting.py +48 -23
- office365/communications/onlinemeetings/online_meeting_info.py +22 -0
- office365/communications/onlinemeetings/online_meeting_type.py +16 -0
- office365/communications/onlinemeetings/participants.py +5 -3
- office365/communications/onlinemeetings/watermark_protection_values.py +15 -0
- office365/communications/presences/presence.py +15 -5
- office365/communications/presences/work_location_source.py +15 -0
- office365/communications/presences/work_location_type.py +15 -0
- office365/communications/virtualevents/communications_identity_set.py +23 -0
- office365/copilot/ai_agent_info.py +14 -0
- office365/copilot/ai_interaction_entity.py +16 -0
- office365/copilot/ai_interaction_plugin.py +10 -0
- office365/copilot/package_access_entity.py +14 -0
- office365/copilot/package_element.py +16 -0
- office365/copilot/package_element_detail.py +19 -0
- office365/copilot/retrieval_data_source.py +14 -0
- office365/copilot/retrieval_entity_type.py +17 -0
- office365/count_collection.py +1 -1
- office365/delta_collection.py +41 -2
- office365/directory/applications/all_allowed_scopes.py +10 -0
- office365/directory/applications/custom_security_attribute_exemption.py +18 -0
- office365/directory/applications/custom_security_attribute_string_value_exemption.py +14 -0
- office365/directory/applications/enumerated_scopes.py +15 -0
- office365/directory/applications/identifier_uri_restriction.py +22 -0
- office365/directory/applications/implicitgrantsettings.py +8 -1
- office365/directory/applications/inheritable_scopes.py +15 -0
- office365/directory/applications/key_credential_configuration.py +22 -0
- office365/directory/applications/no_scopes.py +10 -0
- office365/directory/applications/optional_claim.py +14 -1
- office365/directory/applications/password_credential_configuration.py +22 -0
- office365/directory/applications/preauthorized.py +11 -1
- office365/directory/applications/redirecturisettings.py +8 -1
- office365/directory/applications/resource_access.py +4 -0
- office365/directory/applications/template.py +63 -3
- office365/directory/attribute_rule_members.py +15 -0
- office365/directory/audit/directory.py +9 -0
- office365/directory/audit/log_root.py +15 -15
- office365/directory/audit/logs/recordtype.py +476 -1
- office365/directory/audit/logs/usertype.py +16 -1
- office365/directory/audit/provisioning/object_summary.py +67 -3
- office365/directory/audit/signins/authentication_app_device_details.py +17 -0
- office365/directory/audit/signins/governance_insight.py +17 -0
- office365/directory/audit/signins/membership_outlier_insight.py +55 -0
- office365/directory/audit/signins/signin.py +78 -8
- office365/directory/authentication/attributecollection/external_users_self_service_sign_up.py +20 -0
- office365/directory/authentication/attributecollection/handler.py +10 -0
- office365/directory/authentication/attributecollection/method_load_start_handler.py +10 -0
- office365/directory/authentication/attributecollection/start_custom_extension_handler.py +17 -0
- office365/directory/authentication/attributecollection/start_handler.py +10 -0
- office365/directory/authentication/attributecollection/submit_custom_extension_handler.py +17 -0
- office365/directory/authentication/attributecollection/submit_handler.py +10 -0
- office365/directory/authentication/authentication.py +13 -36
- office365/directory/authentication/error_correction_level.py +14 -0
- office365/directory/authentication/fraud_protection_configuration.py +10 -0
- office365/directory/authentication/fraud_protection_provider_configuration.py +12 -0
- office365/directory/authentication/generic_error.py +8 -1
- office365/directory/authentication/methods/configuration.py +17 -0
- office365/directory/authentication/methods/details.py +36 -0
- office365/directory/authentication/methods/mode_detail.py +17 -0
- office365/directory/authentication/methods/passkey_type.py +13 -0
- office365/directory/authentication/methods/root.py +8 -12
- office365/directory/authentication/methods/target.py +17 -0
- office365/directory/authentication/oidc_address_inbound_claims.py +18 -0
- office365/directory/authentication/oidc_client_authentication.py +10 -0
- office365/directory/authentication/oidc_client_secret_authentication.py +14 -0
- office365/directory/authentication/oidc_inbound_claim_mapping_override.py +23 -0
- office365/directory/authentication/oidc_private_jwt_key_client_authentication.py +10 -0
- office365/directory/authentication/signing_certificate_update_status.py +16 -0
- office365/directory/authentication/strength/root.py +39 -0
- office365/directory/authentication/strength/usage.py +4 -0
- office365/directory/certificates/authority.py +5 -0
- office365/directory/certificates/pkcs12_certificate.py +15 -0
- office365/directory/certificates/self_signed.py +4 -0
- office365/directory/certificates/x509/issuer_hints_configuration.py +2 -1
- office365/directory/connected_organization_members.py +15 -0
- office365/directory/connection_info.py +14 -0
- office365/directory/domains/state.py +13 -1
- office365/directory/domains/verified.py +14 -4
- office365/directory/extensions/custom/http_request_endpoint.py +16 -0
- office365/directory/groups/access_type.py +15 -0
- office365/directory/groups/group_members.py +15 -0
- office365/directory/groups/setting_template_value.py +17 -0
- office365/directory/identities/application_context.py +15 -0
- office365/directory/identities/application_enforced_restrictions_session_control.py +10 -0
- office365/directory/identities/auth_context.py +14 -0
- office365/directory/identities/authentication_flow.py +15 -0
- office365/directory/identities/conditional_access_root.py +35 -3
- office365/directory/identities/conditional_access_session_control.py +14 -0
- office365/directory/identities/ip_range.py +10 -0
- office365/directory/identities/on_fraud_protection_load_start_external_users_auth_handler.py +15 -0
- office365/directory/identities/on_interactive_auth_flow_start_external_users_self_service_sign_up.py +14 -0
- office365/directory/identities/on_interactive_auth_flow_start_handler.py +10 -0
- office365/directory/identities/on_otp_send_custom_extension_handler.py +17 -0
- office365/directory/identities/on_otp_send_handler.py +10 -0
- office365/directory/identities/on_password_submit_handler.py +10 -0
- office365/directory/identities/providers/on_authentication_method_load_start_external_users_self_service_sign_up.py +16 -0
- office365/directory/identities/providers/on_fraud_protection_load_start_handler.py +10 -0
- office365/directory/identities/providers/verified_id_profile_state.py +13 -0
- office365/directory/identities/providers/verified_id_usage_configuration_purpose.py +14 -0
- office365/directory/identities/riskPrevention/web_application_firewall_dns_configuration.py +21 -0
- office365/directory/identities/riskPrevention/web_application_firewall_verification_result.py +23 -0
- office365/directory/identities/riskPrevention/web_application_firewall_verified_details.py +8 -1
- office365/directory/identities/sign_in_context.py +10 -0
- office365/directory/identities/userflows/user_attribute_values_item.py +16 -0
- office365/directory/identities/userflows/user_flow_api_connector_configuration.py +16 -0
- office365/directory/identitygovernance/accessreview/custom_data_provided_resource_upload_session_request.py +12 -0
- office365/directory/identitygovernance/accessreview/custom_data_provided_resource_upload_stats.py +15 -0
- office365/directory/identitygovernance/accessreview/disable_and_delete_user_apply_action.py +10 -0
- office365/directory/identitygovernance/accessreview/error.py +10 -0
- office365/directory/identitygovernance/accessreview/history/definition.py +3 -3
- office365/directory/identitygovernance/accessreview/history_schedule_settings.py +16 -0
- office365/directory/identitygovernance/accessreview/inactive_users_query_scope.py +15 -0
- office365/directory/identitygovernance/accessreview/instance.py +2 -2
- office365/directory/identitygovernance/accessreview/instance_decision_item_access_package_assignment_policy_resource.py +15 -0
- office365/directory/identitygovernance/accessreview/instance_decision_item_access_package_resource.py +15 -0
- office365/directory/identitygovernance/accessreview/instance_decision_item_azure_role_resource.py +17 -0
- office365/directory/identitygovernance/accessreview/instance_decision_item_resource.py +16 -0
- office365/directory/identitygovernance/accessreview/instance_decision_item_service_principal_resource.py +16 -0
- office365/directory/identitygovernance/accessreview/notification_recipient_item.py +20 -0
- office365/directory/identitygovernance/accessreview/notification_recipient_query_scope.py +16 -0
- office365/directory/identitygovernance/accessreview/notification_recipients_type.py +16 -0
- office365/directory/identitygovernance/accessreview/notify_members.py +14 -0
- office365/directory/identitygovernance/accessreview/principal_resource_memberships_scope.py +20 -0
- office365/directory/identitygovernance/accessreview/principal_scope.py +12 -0
- office365/directory/identitygovernance/accessreview/query_scope.py +16 -0
- office365/directory/identitygovernance/accessreview/recommendation_insight_setting.py +10 -0
- office365/directory/identitygovernance/accessreview/remove_access_apply_action.py +10 -0
- office365/directory/identitygovernance/accessreview/resource_scope.py +15 -0
- office365/directory/identitygovernance/accessreview/reviewer_scope.py +17 -0
- office365/directory/identitygovernance/accessreview/schedule/settings.py +33 -1
- office365/directory/identitygovernance/accessreview/stage.py +1 -1
- office365/directory/identitygovernance/accessreview/stage_settings.py +33 -0
- office365/directory/identitygovernance/accessreview/target_owners.py +17 -0
- office365/directory/identitygovernance/activate_processing_result_scope.py +3 -0
- office365/directory/identitygovernance/activate_run_scope.py +2 -0
- office365/directory/identitygovernance/appconsent/request_scope.py +8 -1
- office365/directory/identitygovernance/attribute_set_entry.py +15 -0
- office365/directory/identitygovernance/awaited_workflow_processing_result.py +17 -0
- office365/directory/identitygovernance/cancel_runs_scope.py +16 -0
- office365/directory/identitygovernance/cancel_scope.py +10 -0
- office365/directory/identitygovernance/content_base.py +10 -0
- office365/directory/identitygovernance/content_category.py +24 -0
- office365/directory/identitygovernance/count_based_quarantine_condition.py +14 -0
- office365/directory/identitygovernance/custom_task_extension_callout_data.py +4 -0
- office365/directory/identitygovernance/custom_task_extension_response_data.py +21 -0
- office365/directory/identitygovernance/directory_object_workflow_subject.py +15 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/answer.py +16 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/answer_choice.py +22 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/answer_string.py +14 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/approval_stage.py +36 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/approver_information_visibility.py +14 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/assignment_approval_settings.py +23 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/assignment_policy_scope.py +17 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/assignment_request_callback_data.py +20 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/assignment_request_parameters.py +14 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/assignment_request_requirements.py +25 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/assignment_requestor_settings.py +25 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/assignment_review_settings.py +29 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/assignmentfilterbycurrentuseroptions.py +2 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/assignmentrequestfilterbycurrentuseroptions.py +4 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/automatic_request_settings.py +17 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/custom_data_provided_resource_upload_status.py +14 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/custom_extension_callout_instance.py +21 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/dynamic_approval_stage.py +10 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/expiration_pattern.py +20 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/localized_text.py +15 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/notification_settings.py +14 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/request_approval_stage_callback_configuration.py +10 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/requesttype.py +1 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/resource_attribute.py +26 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/resource_attribute_destination.py +10 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/resource_attribute_question.py +15 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/resource_attribute_source.py +10 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/subject_lifecycle.py +14 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/suggestion_filter_by_current_user_options.py +14 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/suggestion_reason.py +10 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/suggestion_related_people_based.py +17 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/suggestion_related_people_insight_level.py +14 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/suggestion_self_assignment_history_based.py +16 -0
- office365/directory/identitygovernance/entitlementmanagement/accesspackage/user_directory_attribute_store.py +10 -0
- office365/directory/identitygovernance/entitlementmanagement/assignment_request_approval_stage_callback_data.py +17 -0
- office365/directory/identitygovernance/entitlementmanagement/azure_active_directory_tenant.py +15 -0
- office365/directory/identitygovernance/entitlementmanagement/domain_identity_source.py +15 -0
- office365/directory/identitygovernance/entitlementmanagement/fallback_to_microsoft_provider_on_error.py +12 -0
- office365/directory/identitygovernance/entitlementmanagement/identity_source.py +10 -0
- office365/directory/identitygovernance/entitlementmanagement/schedule.py +21 -0
- office365/directory/identitygovernance/entitlementmanagement/social_identity_source.py +18 -0
- office365/directory/identitygovernance/guest_sponsor_trigger.py +14 -0
- office365/directory/identitygovernance/percentage_based_quarantine_condition.py +14 -0
- office365/directory/identitygovernance/preview_failed_task.py +17 -0
- office365/directory/identitygovernance/process_content_metadata_base.py +26 -0
- office365/directory/identitygovernance/provisioning_attribute_mapping.py +10 -0
- office365/directory/identitygovernance/provisioning_object_workflow_subject.py +19 -0
- office365/directory/identitygovernance/quarantine_condition.py +10 -0
- office365/directory/identitygovernance/quarantine_configuration.py +20 -0
- office365/directory/identitygovernance/quarantine_details.py +18 -0
- office365/directory/identitygovernance/resource_access_detail.py +23 -0
- office365/directory/identitygovernance/subject_summary.py +18 -0
- office365/directory/identitygovernance/termsofuse/agreement_file_data.py +14 -0
- office365/directory/identitygovernance/termsofuse/terms_expiration.py +16 -0
- office365/directory/identitygovernance/text_content.py +14 -0
- office365/directory/identitygovernance/workflow.py +23 -0
- office365/directory/identitygovernance/workflow_setting.py +15 -0
- office365/directory/identitygovernance/workflow_subject.py +10 -0
- office365/directory/insights/office_graph.py +7 -6
- office365/directory/invitations/invitation.py +45 -2
- office365/directory/licenses/service_plan_info.py +4 -0
- office365/directory/licenses/units_detail.py +4 -0
- office365/directory/objects/collection.py +34 -8
- office365/directory/objects/service_provisioning_xml_error.py +14 -0
- office365/directory/permissions/comment_action.py +18 -0
- office365/directory/permissions/create_action.py +10 -0
- office365/directory/permissions/default_user_role.py +16 -1
- office365/directory/permissions/delete_action.py +15 -0
- office365/directory/permissions/email_identity.py +7 -9
- office365/directory/policies/all_devices_assignment_target.py +12 -0
- office365/directory/policies/all_domains.py +10 -0
- office365/directory/policies/all_licensed_users_assignment_target.py +10 -0
- office365/directory/policies/allowedtargetscope.py +1 -0
- office365/directory/policies/app_management_application_configuration.py +15 -0
- office365/directory/policies/app_management_configuration.py +22 -0
- office365/directory/policies/app_management_policy_actor_exemptions.py +18 -0
- office365/directory/policies/app_management_service_principal_configuration.py +10 -0
- office365/directory/policies/authentication_combination_configuration.py +18 -0
- office365/directory/policies/authentication_context_class_reference.py +26 -0
- office365/directory/policies/authentication_methods.py +59 -0
- office365/directory/policies/authentication_strength.py +65 -8
- office365/directory/policies/azure_ad_registration_policy.py +16 -0
- office365/directory/policies/ca_policies_deletable_root.py +33 -0
- office365/directory/policies/claims_mapping_policy.py +7 -0
- office365/directory/policies/cloud_app_security_session_control.py +15 -0
- office365/directory/policies/conditionalaccess/all_external_tenants.py +10 -0
- office365/directory/policies/conditionalaccess/applications.py +20 -0
- office365/directory/policies/conditionalaccess/authentication_flows.py +15 -0
- office365/directory/policies/conditionalaccess/client_applications.py +18 -0
- office365/directory/policies/conditionalaccess/condition_set.py +42 -0
- office365/directory/policies/conditionalaccess/device_and_app_management_assignment_target.py +10 -0
- office365/directory/policies/conditionalaccess/device_info.py +43 -0
- office365/directory/policies/conditionalaccess/devices.py +15 -0
- office365/directory/policies/conditionalaccess/enumerated_external_tenants.py +15 -0
- office365/directory/policies/conditionalaccess/external_tenants.py +17 -0
- office365/directory/policies/conditionalaccess/filter.py +16 -0
- office365/directory/policies/conditionalaccess/grant_controls.py +24 -0
- office365/directory/policies/conditionalaccess/grantcontrol.py +1 -0
- office365/directory/policies/conditionalaccess/guests_or_external_users.py +19 -0
- office365/directory/policies/conditionalaccess/locations.py +16 -0
- office365/directory/policies/conditionalaccess/persistent_browser_session_control.py +15 -0
- office365/directory/policies/conditionalaccess/platforms.py +21 -0
- office365/directory/policies/conditionalaccess/policy_deletable_item.py +17 -0
- office365/directory/policies/conditionalaccess/policy_detail.py +19 -0
- office365/directory/policies/conditionalaccess/secure_sign_in_session_control.py +10 -0
- office365/directory/policies/conditionalaccess/service_principal_sign_in.py +14 -0
- office365/directory/policies/conditionalaccess/session_controls.py +32 -0
- office365/directory/policies/conditionalaccess/sign_in_conditions.py +29 -0
- office365/directory/policies/conditionalaccess/sign_in_frequency_session_control.py +24 -0
- office365/directory/policies/conditionalaccess/sign_in_identity.py +10 -0
- office365/directory/policies/conditionalaccess/user_action_context.py +15 -0
- office365/directory/policies/conditionalaccess/user_sign_in.py +19 -0
- office365/directory/policies/conditionalaccess/users.py +29 -0
- office365/directory/policies/crosstenant/app_service_connect_setting.py +19 -0
- office365/directory/policies/crosstenant/b2_b_setting.py +22 -0
- office365/directory/policies/crosstenant/inbound_trust.py +16 -0
- office365/directory/policies/crosstenant/m365_collaboration_inbound_setting.py +17 -0
- office365/directory/policies/crosstenant/m365_collaboration_outbound_setting.py +19 -0
- office365/directory/policies/crosstenant/target.py +16 -0
- office365/directory/policies/crosstenant/target_configuration.py +24 -0
- office365/directory/policies/crosstenant/tenant_restrictions.py +15 -0
- office365/directory/policies/crosstenant/user_sync_inbound.py +14 -0
- office365/directory/policies/custom_app_management_application_configuration.py +15 -0
- office365/directory/policies/custom_app_management_configuration.py +19 -0
- office365/directory/policies/default_invitation_redemption_identity_provider_configuration.py +10 -0
- office365/directory/policies/devices_filter.py +20 -0
- office365/directory/policies/enumerated_domains.py +15 -0
- office365/directory/policies/face_check_configuration.py +15 -0
- office365/directory/policies/group_scope.py +10 -0
- office365/directory/policies/identifier_uri_configuration.py +16 -0
- office365/directory/policies/inbound_outbound_policy_configuration.py +15 -0
- office365/directory/policies/invitation_redemption_identity_provider_configuration.py +19 -0
- office365/directory/policies/match_confidence_level.py +13 -0
- office365/directory/policies/protected_application_metadata.py +15 -0
- office365/directory/policies/protection_policy_artifact_count.py +17 -0
- office365/directory/policies/restrict_access_action.py +10 -0
- office365/directory/policies/restrict_access_action_base.py +15 -0
- office365/directory/policies/retention_setting.py +16 -0
- office365/directory/policies/root.py +14 -1
- office365/directory/policies/scope_base.py +14 -0
- office365/directory/policies/security_defaults.py +16 -0
- office365/directory/policies/self_service_sign_up_authentication_flow_configuration.py +14 -0
- office365/directory/policies/tenant_scope.py +10 -0
- office365/directory/policies/unifiedrolemanagement/role_assignment_schedule_filter_by_current_user_options.py +12 -0
- office365/directory/policies/unifiedrolemanagement/role_assignment_schedule_instance_filter_by_current_user_options.py +12 -0
- office365/directory/policies/unifiedrolemanagement/role_assignment_schedule_request_filter_by_current_user_options.py +14 -0
- office365/directory/policies/unifiedrolemanagement/role_eligibility_schedule_filter_by_current_user_options.py +12 -0
- office365/directory/policies/unifiedrolemanagement/role_eligibility_schedule_instance_filter_by_current_user_options.py +12 -0
- office365/directory/policies/unifiedrolemanagement/role_eligibility_schedule_request_filter_by_current_user_options.py +14 -0
- office365/directory/policies/user_scope.py +10 -0
- office365/directory/policies/validating_domains.py +15 -0
- office365/directory/policies/verified_id_profile_configuration.py +15 -0
- office365/directory/policies/verified_id_usage_configuration.py +14 -0
- office365/directory/protection/riskyusers/activity.py +7 -1
- office365/directory/protection/riskyusers/risk_service_principal_activity.py +17 -0
- office365/directory/recovery/recovery_action.py +14 -0
- office365/directory/recovery/recovery_status.py +18 -0
- office365/directory/recovery/resource_type_name.py +23 -0
- office365/directory/requestor_manager.py +14 -0
- office365/directory/rolemanagement/unifiedrole/notification_recipients.py +20 -0
- office365/directory/rolemanagement/unifiedrole/permission.py +4 -0
- office365/directory/security/account.py +0 -1
- office365/directory/security/action.py +17 -0
- office365/directory/security/ai_agent_platform.py +15 -0
- office365/directory/security/alerts/alert.py +17 -0
- office365/directory/security/{blob_container_evidence.py → alerts/blob_container_evidence.py} +1 -1
- office365/directory/security/{blob_evidence.py → alerts/blob_evidence.py} +1 -1
- office365/directory/security/alerts/connection_direction.py +14 -0
- office365/directory/security/{sas_token_evidence.py → alerts/sas_token_evidence.py} +1 -1
- office365/directory/security/alerts/status.py +1 -2
- office365/directory/security/analyzed_message_evidence.py +3 -0
- office365/directory/security/antispam_directionality.py +15 -0
- office365/directory/security/attacksimulations/account_target_content_type.py +14 -0
- office365/directory/security/audit/audit_data.py +15 -0
- office365/directory/security/audit/audit_log_query_status.py +16 -0
- office365/directory/security/audit/multi_tenant_organization_join_request_transition_details.py +20 -0
- office365/directory/security/audit/multi_tenant_organization_member_transition_details.py +22 -0
- office365/directory/security/audit/whois_domain_status.py +16 -0
- office365/directory/security/{whois_record.py → audit/whois_record.py} +1 -1
- office365/directory/security/cases/additionaldataoptions.py +1 -0
- office365/directory/security/cases/ediscovery.py +3 -0
- office365/directory/security/cloud_application_evidence.py +3 -1
- office365/directory/security/cloud_logon_session_evidence.py +2 -0
- office365/directory/security/{analyzed_email_attachment.py → collaboration/analyzed_email_attachment.py} +3 -1
- office365/directory/security/{collaboration_root.py → collaboration/collaboration_root.py} +1 -1
- office365/directory/security/container_evidence.py +4 -0
- office365/directory/security/container_image_evidence.py +4 -1
- office365/directory/security/correlation_reason.py +28 -0
- office365/directory/security/datasecurity/classifcation_error_base.py +18 -0
- office365/directory/security/{audit_data.py → datasecurity/classification_error.py} +2 -2
- office365/directory/security/datasecurity/classification_inner_error.py +18 -0
- office365/directory/security/datasecurity/compute_rights_and_inheritance_result.py +17 -0
- office365/directory/security/datasecurity/custom_metadata_dictionary.py +10 -0
- office365/directory/security/datasecurity/dlp_action_info.py +15 -0
- office365/directory/security/{data_security → datasecurity}/governance.py +1 -1
- office365/directory/security/datasecurity/integrated_application_metadata.py +15 -0
- office365/directory/security/datasecurity/policy_binding.py +17 -0
- office365/directory/security/datasecurity/policy_location.py +14 -0
- office365/directory/security/datasecurity/policy_location_application.py +10 -0
- office365/directory/security/datasecurity/policy_location_domain.py +10 -0
- office365/directory/security/datasecurity/policy_location_url.py +10 -0
- office365/directory/security/datasecurity/policy_scope_base.py +26 -0
- office365/directory/security/datasecurity/policy_tenant_scope.py +15 -0
- office365/directory/security/datasecurity/policy_tip_action.py +16 -0
- office365/directory/security/datasecurity/policy_user_scope.py +10 -0
- office365/directory/security/datasecurity/process_content_batch_request.py +17 -0
- office365/directory/security/datasecurity/process_content_request.py +24 -0
- office365/directory/security/datasecurity/process_content_response.py +24 -0
- office365/directory/security/datasecurity/process_content_responses.py +16 -0
- office365/directory/security/datasecurity/process_conversation_metadata.py +27 -0
- office365/directory/security/datasecurity/process_file_metadata.py +16 -0
- office365/directory/security/datasecurity/protected_content.py +16 -0
- office365/directory/security/delivery_action.py +16 -0
- office365/directory/security/delivery_location.py +20 -0
- office365/directory/security/detonation_details.py +11 -0
- office365/directory/security/device_evidence.py +11 -0
- office365/directory/security/dns_evidence.py +6 -1
- office365/directory/security/event_source.py +14 -0
- office365/directory/security/file_plan_applied_category.py +4 -1
- office365/directory/security/formatted_content.py +16 -0
- office365/directory/security/indicator_source.py +14 -0
- office365/directory/security/intelligence_profile_kind.py +13 -0
- office365/directory/security/investigation_state.py +29 -0
- office365/directory/security/invoke_action_result.py +0 -1
- office365/directory/security/io_t_device_evidence.py +6 -1
- office365/directory/security/ip_evidence.py +2 -0
- office365/directory/security/kubernetes_controller_evidence.py +2 -0
- office365/directory/security/kubernetes_pod_evidence.py +10 -0
- office365/directory/security/labels/retention/duration_in_days.py +3 -0
- office365/directory/security/mailbox_configuration_type.py +16 -0
- office365/directory/security/mailbox_evidence.py +3 -1
- office365/directory/security/onboarding_status.py +15 -0
- office365/directory/security/passive_dns_record.py +1 -1
- office365/directory/security/processing_error.py +15 -0
- office365/directory/security/protocol_type.py +13 -0
- office365/directory/security/public_error_response.py +4 -1
- office365/directory/security/query_type.py +13 -0
- office365/directory/security/recipient_type.py +13 -0
- office365/directory/security/remediation_action.py +17 -0
- office365/directory/security/remediation_severity.py +14 -0
- office365/directory/security/security.py +1 -1
- office365/directory/security/sensor_candidate_activation_mode.py +13 -0
- office365/directory/security/service_principal_type.py +15 -0
- office365/directory/security/service_source.py +25 -0
- office365/directory/security/ssl_certificate.py +1 -1
- office365/directory/security/subdomain.py +1 -1
- office365/directory/security/subjectrightsrequests/all_mailbox_location.py +10 -0
- office365/directory/security/subjectrightsrequests/all_site_location.py +10 -0
- office365/directory/security/subjectrightsrequests/data_subject.py +17 -0
- office365/directory/security/subjectrightsrequests/detail.py +26 -0
- office365/directory/security/subjectrightsrequests/enumerated_mailbox_location.py +15 -0
- office365/directory/security/subjectrightsrequests/enumerated_site_location.py +15 -0
- office365/directory/security/subjectrightsrequests/history.py +22 -0
- office365/directory/security/subjectrightsrequests/mailbox_location.py +10 -0
- office365/directory/security/subjectrightsrequests/site_location.py +10 -0
- office365/directory/security/subjectrightsrequests/stage_detail.py +19 -0
- office365/directory/security/teams_delivery_location.py +15 -0
- office365/directory/security/teams_message_delivery_action.py +16 -0
- office365/directory/security/threat_type.py +16 -0
- office365/directory/security/{host.py → threatintelligence/host.py} +8 -8
- office365/directory/security/{host_component.py → threatintelligence/host_component.py} +1 -1
- office365/directory/security/{host_cookie.py → threatintelligence/host_cookie.py} +1 -1
- office365/directory/security/{host_pair.py → threatintelligence/host_pair.py} +1 -1
- office365/directory/security/{host_port.py → threatintelligence/host_port.py} +1 -1
- office365/directory/security/threatintelligence/host_port_banner.py +19 -0
- office365/directory/security/threatintelligence/host_port_component.py +19 -0
- office365/directory/security/threatintelligence/host_port_protocol.py +13 -0
- office365/directory/security/threatintelligence/host_port_status.py +14 -0
- office365/directory/security/threatintelligence/host_reputation_classification.py +15 -0
- office365/directory/security/threatintelligence/host_reputation_rule.py +16 -0
- office365/directory/security/threatintelligence/host_reputation_rule_severity.py +15 -0
- office365/directory/security/{host_ssl_certificate.py → threatintelligence/host_ssl_certificate.py} +1 -1
- office365/directory/security/{host_tracker.py → threatintelligence/host_tracker.py} +1 -1
- office365/directory/security/threatintelligence/hosts/__init__.py +0 -0
- office365/directory/security/threatintelligence/threat_intelligence.py +9 -9
- office365/directory/security/threatintelligence/whoisrecords/__init__.py +0 -0
- office365/directory/security/timeline_event_type.py +20 -0
- office365/directory/security/user_evidence.py +2 -0
- office365/directory/security/verdict_category.py +20 -0
- office365/directory/security/vm_cloud_provider.py +13 -0
- office365/directory/security/vulnerability_severity.py +16 -0
- office365/directory/security/whois_base_record.py +1 -1
- office365/directory/serviceprincipals/delegated_permission_classification.py +27 -0
- office365/directory/serviceprincipals/remote_desktop_security_configuration.py +16 -0
- office365/directory/single_service_principal.py +15 -0
- office365/directory/single_user.py +15 -0
- office365/directory/synchronization/attribute_mapping.py +23 -0
- office365/directory/synchronization/error.py +10 -1
- office365/directory/synchronization/job_application_parameters.py +19 -0
- office365/directory/synchronization/job_restart_criteria.py +7 -1
- office365/directory/synchronization/job_subject.py +17 -0
- office365/directory/synchronization/linked_objects.py +22 -0
- office365/directory/synchronization/metadata_entry.py +16 -0
- office365/directory/synchronization/on_premises_accidental_deletion_prevention.py +20 -0
- office365/directory/synchronization/on_premises_directory_synchronization_configuration.py +19 -0
- office365/directory/synchronization/on_premises_directory_synchronization_feature.py +33 -0
- office365/directory/synchronization/progress.py +4 -0
- office365/directory/synchronization/quarantine.py +11 -0
- office365/directory/synchronization/rule.py +32 -0
- office365/directory/synchronization/schedule.py +18 -0
- office365/directory/synchronization/secret_key_string_value_pair.py +16 -0
- office365/directory/synchronization/status.py +17 -3
- office365/directory/synchronization/task_execution.py +26 -1
- office365/directory/target_agent_identity_sponsors_or_owners.py +10 -0
- office365/directory/target_application_owners.py +10 -0
- office365/directory/target_manager.py +14 -0
- office365/directory/target_user_sponsors.py +10 -0
- office365/directory/tenantinformation/information.py +4 -0
- office365/directory/users/activities/activity.py +42 -8
- office365/directory/users/settings.py +5 -13
- office365/directory/users/user.py +4 -3
- office365/directory/users/work_location_update_scope.py +13 -0
- office365/education/related_contact.py +19 -0
- office365/entity_collection.py +0 -20
- office365/externalconnectors/acl_type.py +16 -0
- office365/externalconnectors/binary_operator.py +12 -0
- office365/externalconnectors/connection_operation_status.py +15 -0
- office365/externalconnectors/connection_state.py +15 -0
- office365/externalconnectors/external_activity_type.py +15 -0
- office365/externalconnectors/external_item_content_type.py +13 -0
- office365/externalconnectors/identity_type.py +14 -0
- office365/externalconnectors/label.py +65 -0
- office365/externalconnectors/property_type.py +22 -0
- office365/externalconnectors/rule_operation.py +19 -0
- office365/graph_client.py +120 -16
- office365/graph_request.py +3 -1
- office365/intune/browser/browser_site_history.py +25 -0
- office365/intune/devices/alternative_security_id.py +5 -0
- office365/intune/devices/cloud_pc_launch_detail.py +22 -0
- office365/intune/devices/cloud_pc_windows_setting.py +14 -0
- office365/intune/devices/device_metadata.py +17 -0
- office365/intune/devices/enumerated_device_registration_membership.py +16 -0
- office365/intune/devices/imported_windows_autopilot_device_identity_import_status.py +15 -0
- office365/intune/devices/imported_windows_autopilot_device_identity_upload_status.py +14 -0
- office365/intune/devices/management/all_device_registration_membership.py +10 -0
- office365/intune/devices/management/device_protection_overview.py +24 -0
- office365/intune/devices/management/managed/managed.py +79 -0
- office365/intune/devices/management/managed/windows/autopilot_device_type.py +13 -0
- office365/intune/devices/management/managed/windows/defender_product_status.py +36 -0
- office365/intune/devices/management/managed/windows/information_protection_enforcement_level.py +14 -0
- office365/intune/devices/management/mobileapps/file_encryption_info.py +20 -0
- office365/intune/devices/management/mobileapps/ios/ios_device_type.py +15 -0
- office365/intune/devices/management/user_experience_analytics_settings.py +14 -0
- office365/intune/devices/management/user_experience_analytics_summarized_by.py +17 -0
- office365/intune/devices/management/virtualendpoint/cloudpcs/exclusion_group_assignment_target.py +10 -0
- office365/intune/devices/management/virtualendpoint/cloudpcs/group_assignment_target.py +16 -0
- office365/intune/devices/management/virtualendpoint/provisioningpolicies/microsoft_managed_desktop.py +18 -0
- office365/intune/devices/management/windows_malware_overview.py +16 -0
- office365/intune/devices/no_device_registration_membership.py +10 -0
- office365/intune/devices/operating_system_specifications.py +15 -0
- office365/intune/enrollment_state.py +15 -0
- office365/intune/instance_resource_access.py +19 -0
- office365/intune/organizations/content_customization.py +15 -0
- office365/intune/organizations/login_page_layout_configuration.py +17 -0
- office365/intune/organizations/login_page_text_visibility_settings.py +19 -0
- office365/intune/organizations/physical_office_address.py +19 -0
- office365/intune/organizations/privacy_profile.py +15 -0
- office365/intune/policies/azure_ad_join_policy.py +18 -0
- office365/intune/policies/local_admin_password_settings.py +14 -0
- office365/intune/policies/local_admin_settings.py +16 -0
- office365/intune/print/printers/incompatible_printer_settings.py +13 -0
- office365/intune/print/user_print.py +0 -2
- office365/intune/process_integrity_level.py +17 -0
- office365/intune/resource_permission.py +15 -0
- office365/migration/__init__.py +122 -7
- office365/migration/_util.py +73 -0
- office365/migration/adapters/__init__.py +94 -0
- office365/migration/adapters/filesystem.py +174 -0
- office365/migration/assessment/__init__.py +27 -0
- office365/migration/assessment/containers.py +24 -0
- office365/migration/assessment/export.py +51 -0
- office365/migration/assessment/registry.py +60 -0
- office365/migration/assessment/report.py +142 -31
- office365/migration/assessment/runner.py +57 -0
- office365/migration/assessment/scanners/__init__.py +13 -0
- office365/migration/assessment/scanners/base.py +135 -0
- office365/migration/base.py +53 -4
- office365/migration/checkpoint.py +76 -0
- office365/migration/job.py +209 -0
- office365/migration/manifest.py +71 -0
- office365/migration/outlook/__init__.py +20 -0
- office365/migration/outlook/assessor.py +73 -0
- office365/migration/outlook/registry.py +27 -0
- office365/migration/outlook/scanner.py +82 -0
- office365/migration/report.py +111 -0
- office365/migration/runner.py +208 -0
- office365/migration/server_job.py +90 -0
- office365/migration/session.py +105 -0
- office365/migration/sharepoint/__init__.py +53 -0
- office365/migration/sharepoint/adapters.py +354 -0
- office365/migration/sharepoint/assessor.py +312 -0
- office365/migration/sharepoint/registry.py +48 -0
- office365/migration/sharepoint/scanners/__init__.py +27 -0
- office365/migration/sharepoint/scanners/fields.py +52 -0
- office365/migration/sharepoint/scanners/files.py +25 -0
- office365/migration/sharepoint/scanners/large_sites.py +124 -0
- office365/migration/sharepoint/scanners/locked_sites.py +38 -0
- office365/migration/sharepoint/scanners/paths.py +45 -0
- office365/migration/sharepoint/scanners/permissions.py +24 -0
- office365/migration/sharepoint/scanners/summary.py +37 -0
- office365/migration/sharepoint/tenant_assessor.py +93 -0
- office365/migration/sharepoint/transfer.py +92 -0
- office365/migration/teams/__init__.py +29 -0
- office365/migration/teams/_extract.py +108 -0
- office365/migration/teams/adapters.py +190 -0
- office365/migration/teams/models.py +73 -0
- office365/migration/validators.py +65 -0
- office365/onedrive/base_item.py +10 -15
- office365/onedrive/contenttypes/content_type.py +8 -13
- office365/onedrive/documentsets/version.py +3 -6
- office365/onedrive/driveitems/audio.py +16 -0
- office365/onedrive/driveitems/bundle.py +4 -0
- office365/onedrive/driveitems/driveItem.py +126 -24
- office365/onedrive/driveitems/image.py +4 -0
- office365/onedrive/driveitems/malware.py +14 -0
- office365/onedrive/driveitems/package.py +14 -0
- office365/onedrive/driveitems/photo.py +13 -1
- office365/onedrive/driveitems/publication_facet.py +4 -0
- office365/onedrive/driveitems/remote_item.py +18 -0
- office365/onedrive/driveitems/special_folder.py +4 -0
- office365/onedrive/driveitems/uploadable_properties.py +2 -2
- office365/onedrive/driveitems/video.py +15 -1
- office365/onedrive/drives/drive.py +9 -0
- office365/onedrive/drives/quota.py +9 -1
- office365/onedrive/files/file.py +4 -0
- office365/onedrive/files/system_info.py +4 -0
- office365/onedrive/filestorage/containertypes/app_permission.py +20 -1
- office365/onedrive/filestorage/containertypes/billing_classification.py +8 -0
- office365/onedrive/filestorage/containertypes/billing_status.py +7 -0
- office365/onedrive/filestorage/containertypes/settings_override.py +17 -0
- office365/onedrive/folders/folder.py +4 -0
- office365/onedrive/internal/paths/shared.py +1 -3
- office365/onedrive/internal/paths/site.py +2 -1
- office365/onedrive/listitems/collection.py +2 -2
- office365/onedrive/lists/info.py +4 -0
- office365/onedrive/operations/pending.py +4 -0
- office365/onedrive/operations/public_inner_error.py +21 -0
- office365/onedrive/sensitivitylabels/usagerights.py +1 -1
- office365/onedrive/share_point_migration_job_error_level.py +15 -0
- office365/onedrive/share_point_migration_object_type.py +20 -0
- office365/onedrive/shares/shared.py +4 -0
- office365/onedrive/sites/collection.py +4 -0
- office365/onedrive/sites/sites_with_root.py +3 -3
- office365/onedrive/sites/website.py +17 -0
- office365/onedrive/sites/website_type.py +15 -0
- office365/onedrive/termstore/groups/collection.py +6 -6
- office365/onedrive/termstore/groups/group.py +6 -1
- office365/onedrive/termstore/relation_type.py +13 -0
- office365/onedrive/termstore/sets/collection.py +6 -6
- office365/onedrive/termstore/store.py +14 -29
- office365/onedrive/termstore/store_manager.py +128 -0
- office365/onedrive/termstore/terms/collection.py +6 -6
- office365/onedrive/workbooks/charts/axes.py +4 -10
- office365/onedrive/workbooks/filter_criteria.py +9 -0
- office365/onedrive/workbooks/filter_datetime.py +15 -0
- office365/onedrive/workbooks/icon.py +7 -1
- office365/onedrive/workbooks/operations/error.py +4 -0
- office365/onedrive/workbooks/ranges/reference.py +4 -0
- office365/onedrive/workbooks/session_info.py +4 -0
- office365/onedrive/workbooks/sort_field.py +5 -0
- office365/onedrive/workbooks/worksheets/protection_options.py +4 -0
- office365/onedrive/workbooks/worksheets/worksheet.py +5 -3
- office365/onenote/pages/collection.py +1 -1
- office365/onenote/pages/page.py +5 -11
- office365/outlook/calendar/attendees/attendee.py +4 -0
- office365/outlook/calendar/attendees/availability.py +4 -0
- office365/outlook/calendar/attendees/base.py +4 -0
- office365/outlook/calendar/collection.py +7 -0
- office365/outlook/calendar/events/event.py +8 -14
- office365/outlook/calendar/events/reminder.py +4 -0
- office365/outlook/calendar/location_constraint.py +4 -0
- office365/outlook/calendar/meetingtimes/suggestion.py +8 -0
- office365/outlook/calendar/meetingtimes/suggestions_result.py +4 -0
- office365/outlook/calendar/meetingtimes/time_constraint.py +4 -0
- office365/outlook/calendar/response_status.py +7 -1
- office365/outlook/calendar/schedule/free_busy_error.py +15 -0
- office365/outlook/calendar/schedule/information.py +4 -0
- office365/outlook/calendar/schedule/item.py +4 -0
- office365/outlook/calendar/sharing/message_action.py +11 -1
- office365/outlook/calendar/timezones/base.py +4 -0
- office365/outlook/calendar/timezones/custom.py +9 -1
- office365/outlook/calendar/timezones/daylight_time_zone_offset.py +14 -0
- office365/outlook/calendar/working_hours.py +4 -0
- office365/outlook/check_in_method.py +15 -0
- office365/outlook/contacts/folders/collection.py +1 -1
- office365/outlook/convert_id_result.py +7 -1
- office365/outlook/item.py +3 -11
- office365/outlook/locale_info.py +4 -0
- office365/outlook/mail/attachments/attachment_item.py +7 -0
- office365/outlook/mail/attachments/collection.py +33 -18
- office365/outlook/mail/automaticreplies/mailtips.py +4 -0
- office365/outlook/mail/automaticreplies/setting.py +4 -0
- office365/outlook/mail/email_details.py +16 -0
- office365/outlook/mail/export_item_response.py +19 -0
- office365/outlook/mail/folders/folder.py +5 -11
- office365/outlook/mail/location.py +1 -1
- office365/outlook/mail/location_constraint_item.py +8 -1
- office365/outlook/mail/mailbox_item_import_session.py +16 -0
- office365/outlook/mail/messages/collection.py +1 -1
- office365/outlook/mail/messages/followup_flag.py +4 -0
- office365/outlook/mail/messages/internet_header.py +4 -0
- office365/outlook/mail/messages/message.py +21 -7
- office365/outlook/mail/messages/rules/actions.py +4 -0
- office365/outlook/mail/messages/rules/predicates.py +29 -0
- office365/outlook/mail/messages/rules/rule.py +1 -1
- office365/outlook/mail/messages/rules/size_range.py +15 -0
- office365/outlook/mail/patterned_recurrence.py +4 -0
- office365/outlook/mail/recurrence_pattern.py +4 -0
- office365/outlook/mail/recurrence_range.py +4 -0
- office365/outlook/mail/tips/error.py +7 -1
- office365/outlook/people/person_type.py +14 -0
- office365/outlook/place_feature_enablement.py +14 -0
- office365/outlook/resource_link.py +17 -0
- office365/outlook/resource_link_type.py +12 -0
- office365/outlook/scored_email_address.py +18 -0
- office365/outlook/timezones/information.py +4 -0
- office365/outlook/timezones/standard_time_zone_offset.py +20 -0
- office365/partners/billing/attribute_set.py +13 -0
- office365/partners/billing/billing_period.py +13 -0
- office365/partners/partners.py +5 -4
- office365/planner/buckets/collection.py +2 -2
- office365/planner/plans/details.py +3 -9
- office365/planner/user.py +6 -4
- office365/reports/internal/queries/create_report_query.py +26 -12
- office365/reports/print_usage.py +67 -0
- office365/reports/print_usage_by_printer.py +21 -0
- office365/reports/print_usage_by_user.py +16 -0
- office365/reports/relying_party_detailed_summary.py +70 -0
- office365/reports/root.py +77 -95
- office365/runtime/auth/authentication_context.py +41 -15
- office365/runtime/auth/entra/authentication_context.py +22 -2
- office365/runtime/auth/providers/acs_token_provider.py +6 -2
- office365/runtime/auth/providers/cookie_provider.py +7 -3
- office365/runtime/auth/providers/saml_token_provider.py +6 -2
- office365/runtime/auth/sts_profile.py +1 -1
- office365/runtime/client_object.py +50 -67
- office365/runtime/client_object_collection.py +297 -14
- office365/runtime/client_request_exception.py +63 -4
- office365/runtime/client_result.py +26 -18
- office365/runtime/client_runtime_context.py +232 -25
- office365/runtime/client_value.py +14 -40
- office365/runtime/client_value_collection.py +4 -8
- office365/runtime/converters/__init__.py +1 -0
- office365/runtime/converters/csv_reader.py +94 -0
- office365/runtime/converters/csv_writer.py +60 -0
- office365/runtime/converters/dataframe.py +122 -0
- office365/runtime/converters/excel.py +44 -0
- office365/runtime/converters/json_file.py +21 -0
- office365/runtime/converters/keyvalue.py +95 -0
- office365/runtime/converters/ndjson.py +17 -0
- office365/runtime/converters/records.py +82 -0
- office365/runtime/converters/scalars.py +128 -0
- office365/runtime/converters/value.py +186 -0
- office365/runtime/decorators.py +27 -0
- office365/runtime/http/mime.py +12 -0
- office365/runtime/http/throttling.py +205 -0
- office365/runtime/http/url.py +36 -0
- office365/runtime/odata/batch_util.py +92 -0
- office365/runtime/odata/query_options.py +26 -1
- office365/runtime/odata/request.py +27 -16
- office365/runtime/odata/type.py +47 -105
- office365/runtime/odata/v3/batch_request.py +88 -1
- office365/runtime/odata/v4/batch_request.py +88 -0
- office365/runtime/odata/v4/upload_session.py +4 -0
- office365/runtime/odata/v4/upload_session_request.py +26 -10
- office365/runtime/operations.py +135 -0
- office365/runtime/parallel.py +96 -0
- office365/runtime/paths/builder.py +4 -2
- office365/runtime/queries/batch.py +23 -14
- office365/runtime/queries/client_query.py +8 -10
- office365/runtime/queries/deferred.py +72 -0
- office365/runtime/queries/delete_entity.py +2 -2
- office365/runtime/queries/function.py +35 -1
- office365/runtime/queries/read_entity.py +23 -4
- office365/runtime/queries/update_entity.py +2 -2
- office365/runtime/queries/upload_session.py +1 -1
- office365/runtime/retry.py +137 -0
- office365/runtime/types/binary_content.py +14 -0
- office365/runtime/types/ipv4_cidr_range.py +14 -0
- office365/runtime/types/ipv6_cidr_range.py +14 -0
- office365/runtime/types/json.py +10 -0
- office365/runtime/types/odata_property.py +7 -0
- office365/runtime/types/public_error.py +23 -0
- office365/runtime/types/public_inner_error.py +21 -0
- office365/runtime/types/setting_value.py +15 -0
- office365/search/request.py +2 -2
- office365/sharepoint/agreements/summarydata.py +15 -5
- office365/sharepoint/authentication/auth_file_detonation_request_response.py +48 -0
- office365/sharepoint/authentication/spo_auth_file_detonation_request.py +7 -0
- office365/sharepoint/brandcenter/brand_font_file_delete_result.py +9 -0
- office365/sharepoint/changes/change.py +6 -0
- office365/sharepoint/changes/collection.py +1 -1
- office365/sharepoint/changes/item.py +4 -10
- office365/sharepoint/client_context.py +78 -33
- office365/sharepoint/clientsidecomponent/agreementssolutionfilecontext.py +1 -0
- office365/sharepoint/clientsidecomponent/spteamsappcomponent.py +3 -0
- office365/sharepoint/comments/comment.py +2 -10
- office365/sharepoint/comments/contentanchor.py +6 -0
- office365/sharepoint/compliance/store_proxy.py +306 -68
- office365/sharepoint/compliance/tags/tag.py +3 -0
- office365/sharepoint/containers/active/properties.py +3 -0
- office365/sharepoint/contentcenter/machinelearning/column_autofill_choice_settings.py +15 -0
- office365/sharepoint/contentcenter/machinelearning/column_autofill_preview_data.py +25 -0
- office365/sharepoint/contentcenter/machinelearning/column_autofill_preview_result.py +12 -0
- office365/sharepoint/contentcenter/machinelearning/hub.py +231 -29
- office365/sharepoint/contentcenter/machinelearning/list_autofill_entity_data.py +15 -0
- office365/sharepoint/contentcenter/machinelearning/list_autofill_item_results.py +18 -0
- office365/sharepoint/contentcenter/machinelearning/modeldependencies.py +4 -3
- office365/sharepoint/contentcenter/machinelearning/models/model.py +254 -0
- office365/sharepoint/contentcenter/machinelearning/publications/publication.py +177 -0
- office365/sharepoint/contentcenter/machinelearning/samples/sample.py +134 -0
- office365/sharepoint/contentcenter/machinelearning/sp_machine_learning_doc_lib_autofill_item_results.py +19 -0
- office365/sharepoint/contentcenter/machinelearning/workitems/item.py +149 -0
- office365/sharepoint/contenttypes/collection.py +9 -10
- office365/sharepoint/contenttypes/content_type.py +4 -10
- office365/sharepoint/contenttypes/fieldlinks/collection.py +5 -7
- office365/sharepoint/directory/helper.py +5 -5
- office365/sharepoint/directory/multi_conditional_access_policy.py +37 -0
- office365/sharepoint/directory/named_location_policy.py +62 -0
- office365/sharepoint/directory/provider/provider.py +1 -1
- office365/sharepoint/entity.py +8 -4
- office365/sharepoint/eventreceivers/definition_collection.py +32 -0
- office365/sharepoint/fields/collection.py +165 -67
- office365/sharepoint/fields/field.py +4 -2
- office365/sharepoint/fields/name.py +11 -0
- office365/sharepoint/files/checked_out_file.py +2 -6
- office365/sharepoint/files/collection.py +75 -8
- office365/sharepoint/files/file.py +68 -6
- office365/sharepoint/files/file_url_virus_status_update.py +22 -0
- office365/sharepoint/files/versionbatchdeleteparameters.py +1 -0
- office365/sharepoint/files/versions/version.py +2 -8
- office365/sharepoint/folders/collection.py +5 -2
- office365/sharepoint/folders/folder.py +198 -26
- office365/sharepoint/internal/image_content_part.py +5 -0
- office365/sharepoint/internal/paths/web.py +3 -1
- office365/sharepoint/internal/sticky_routing_options.py +13 -0
- office365/sharepoint/likes/liked_by_information.py +2 -6
- office365/sharepoint/listitems/collection.py +28 -0
- office365/sharepoint/listitems/compliance_info.py +1 -0
- office365/sharepoint/listitems/form_update_value.py +2 -1
- office365/sharepoint/listitems/listdata_validation_exception_value.py +3 -1
- office365/sharepoint/listitems/listitem.py +5 -5
- office365/sharepoint/listitems/versions/version.py +3 -15
- office365/sharepoint/lists/batch_convert_item_result.py +19 -0
- office365/sharepoint/lists/batch_convert_result.py +17 -0
- office365/sharepoint/lists/collection.py +36 -0
- office365/sharepoint/lists/conversion_loss_item.py +13 -0
- office365/sharepoint/lists/conversion_loss_report.py +18 -0
- office365/sharepoint/lists/extended_share_point_permission_settings.py +17 -0
- office365/sharepoint/lists/list.py +95 -20
- office365/sharepoint/lists/list_forms_api.py +7 -0
- office365/sharepoint/logger/activityrequest.py +3 -0
- office365/sharepoint/marketplace/corporatecuratedgallery/addins/permission_response.py +7 -3
- office365/sharepoint/marketplace/corporatecuratedgallery/available_addins_response.py +3 -1
- office365/sharepoint/marketplace/tenant/appcatalog/accessor.py +4 -10
- office365/sharepoint/microfeed/attachment_store.py +69 -0
- office365/sharepoint/microfeed/data.py +64 -0
- office365/sharepoint/microfeed/manager.py +259 -0
- office365/sharepoint/microfeed/microfeedstore.py +69 -0
- office365/sharepoint/migrationcenter/service/performance/dashboard_data.py +4 -2
- office365/sharepoint/multigeo/service/dfdeprecationjob.py +8 -1
- office365/sharepoint/multigeo/service/geoexperience.py +15 -0
- office365/sharepoint/multigeo/service/groupmovejob.py +9 -0
- office365/sharepoint/multigeo/service/move_job_report.py +23 -0
- office365/sharepoint/multigeo/service/movesiterostate.py +8 -1
- office365/sharepoint/multigeo/service/partner_company_id_lookup.py +22 -0
- office365/sharepoint/multigeo/service/services.py +3 -6
- office365/sharepoint/multigeo/service/sitemovejob.py +9 -0
- office365/sharepoint/navigation/menu/node.py +5 -3
- office365/sharepoint/navigation/menu/state.py +1 -1
- office365/sharepoint/navigation/nodes/collection.py +36 -1
- office365/sharepoint/navigation/service.py +2 -8
- office365/sharepoint/permissions/roles/assignments/assignment.py +2 -8
- office365/sharepoint/permissions/roles/definitions/definition.py +3 -9
- office365/sharepoint/portal/groups/service.py +12 -0
- office365/sharepoint/portal/groups/site_manager.py +283 -32
- office365/sharepoint/portal/linkedsites/manager.py +25 -3
- office365/sharepoint/portal/sites/manager.py +197 -0
- office365/sharepoint/principal/principal.py +3 -8
- office365/sharepoint/principal/users/user.py +5 -6
- office365/sharepoint/publishing/announcements/controller.py +31 -0
- office365/sharepoint/publishing/content_distribution_controller.py +23 -0
- office365/sharepoint/publishing/copytoparams.py +3 -0
- office365/sharepoint/publishing/diagnostics/controller.py +12 -0
- office365/sharepoint/publishing/emailpublishingstatus.py +4 -2
- office365/sharepoint/publishing/engage_distribution_info.py +2 -0
- office365/sharepoint/publishing/feedvideopage.py +358 -0
- office365/sharepoint/publishing/navigation/structural_navigation_cache_wrapper.py +40 -0
- office365/sharepoint/publishing/pages/3d/page.py +314 -0
- office365/sharepoint/publishing/pages/campaign/publication.py +549 -7
- office365/sharepoint/publishing/pages/metadata.py +6 -11
- office365/sharepoint/publishing/pages/page.py +469 -0
- office365/sharepoint/publishing/pages/reposts/repost.py +334 -0
- office365/sharepoint/publishing/pages/service.py +95 -43
- office365/sharepoint/publishing/pages/topics/topic.py +314 -0
- office365/sharepoint/publishing/point/post.py +28 -0
- office365/sharepoint/publishing/point/postservicemanager.py +31 -0
- office365/sharepoint/publishing/point/tenantmanager.py +9 -0
- office365/sharepoint/publishing/point/user.py +9 -0
- office365/sharepoint/publishing/portallaunchwavesmanager.py +36 -0
- office365/sharepoint/publishing/portalnavigationcachewrapper.py +21 -0
- office365/sharepoint/publishing/rich_sharing.py +12 -0
- office365/sharepoint/publishing/sites/communication/site.py +14 -6
- office365/sharepoint/publishing/subtitlefile.py +40 -0
- office365/sharepoint/publishing/video/channel.py +112 -0
- office365/sharepoint/publishing/video/item.py +231 -0
- office365/sharepoint/publishing/videopermissiongroup.py +16 -0
- office365/sharepoint/request.py +35 -7
- office365/sharepoint/search/analytics/signal_store.py +15 -0
- office365/sharepoint/search/promoted_result_query_rule.py +6 -2
- office365/sharepoint/search/ranking_labeling.py +11 -0
- office365/sharepoint/search/relevant_results.py +1 -1
- office365/sharepoint/search/reordering_rule_collection.py +30 -0
- office365/sharepoint/search/result.py +1 -1
- office365/sharepoint/search/service.py +61 -0
- office365/sharepoint/search/setting.py +75 -15
- office365/sharepoint/search/simple_data_row.py +1 -1
- office365/sharepoint/sharing/direct_abilities.py +1 -0
- office365/sharepoint/sharing/main_link_audience_role_abilities.py +17 -0
- office365/sharepoint/sharing/mainlinkabilities.py +3 -3
- office365/sharepoint/sharing/mainlinkaudienceabilities.py +4 -0
- office365/sharepoint/sharing/mainlinkinfo.py +4 -0
- office365/sharepoint/sharing/object_sharing_settings.py +4 -10
- office365/sharepoint/sitedesigns/app_settings_in_teams.py +6 -1
- office365/sharepoint/sitedesigns/creation_info.py +1 -1
- office365/sharepoint/sitedesigns/insert_field_response.py +10 -1
- office365/sharepoint/sitedesigns/main_link_details.py +2 -0
- office365/sharepoint/sitedesigns/sectiondesignideasapi.py +26 -0
- office365/sharepoint/sitedesigns/thread_engagement_data.py +2 -0
- office365/sharepoint/sites/home/sharepointhomeservicemanager.py +18 -0
- office365/sharepoint/sites/manager/baaa_request.py +2 -0
- office365/sharepoint/sites/manager/service.py +192 -5
- office365/sharepoint/sites/site.py +12 -0
- office365/sharepoint/sites/version_policy_manager.py +6 -10
- office365/sharepoint/sitescripts/utility.py +1 -1
- office365/sharepoint/social/rest_thread.py +2 -6
- office365/sharepoint/taxonomy/field.py +1 -0
- office365/sharepoint/taxonomy/groups/group.py +2 -6
- office365/sharepoint/taxonomy/item.py +12 -6
- office365/sharepoint/taxonomy/service.py +18 -2
- office365/sharepoint/teams/manage_channel_capabilities_request.py +3 -0
- office365/sharepoint/tenant/administration/bulk_insert_operation_result.py +5 -0
- office365/sharepoint/tenant/administration/catalog_management_category.py +23 -0
- office365/sharepoint/tenant/administration/catalog_management_custom_property_map.py +3 -0
- office365/sharepoint/tenant/administration/catalog_management_group.py +16 -0
- office365/sharepoint/tenant/administration/catalog_management_schema.py +18 -0
- office365/sharepoint/tenant/administration/catalog_management_status.py +23 -0
- office365/sharepoint/tenant/administration/container/properties.py +6 -0
- office365/sharepoint/tenant/administration/dataset_metadata_response.py +6 -0
- office365/sharepoint/tenant/administration/ransomware/activitiesoverview.py +2 -1
- office365/sharepoint/tenant/administration/rcd_categories_map.py +19 -0
- office365/sharepoint/tenant/administration/rcd_category_detail_result.py +17 -0
- office365/sharepoint/tenant/administration/rcd_group_definition.py +19 -0
- office365/sharepoint/tenant/administration/rcd_group_metadata.py +20 -0
- office365/sharepoint/tenant/administration/rcd_save_result.py +12 -0
- office365/sharepoint/tenant/administration/rcd_site_status_detail.py +18 -0
- office365/sharepoint/tenant/administration/secondary_administrators_info.py +0 -7
- office365/sharepoint/tenant/administration/site_property_scope_config.py +1 -0
- office365/sharepoint/tenant/administration/spom365agentinsightsm365agentsonsitesdetails.py +3 -1
- office365/sharepoint/tenant/administration/tenant.py +94 -227
- office365/sharepoint/tenant/administration/tenant_admin_ransomware_event_site_restore_point.py +1 -0
- office365/sharepoint/tenant/administration/tenant_data_loss_prevention_quarantine_settings.py +17 -0
- office365/sharepoint/tenant/cdn_api.py +18 -4
- office365/sharepoint/tenant/management/office365_tenant.py +15 -10
- office365/sharepoint/tenantadministration/spo_file_archive_policy_info.py +28 -0
- office365/sharepoint/tenantadministration/spo_file_archive_policy_report_info.py +20 -0
- office365/sharepoint/tenantadministration/spo_file_archive_policy_site_info.py +15 -0
- office365/sharepoint/tenantadministration/spom365_agent_insights_top20_agents_details.py +14 -0
- office365/sharepoint/types/resource_path.py +2 -1
- office365/sharepoint/usercustomactions/collection.py +41 -0
- office365/sharepoint/userprofiles/person_properties.py +4 -10
- office365/sharepoint/utilities/autofillcolumninfo.py +2 -0
- office365/sharepoint/utilities/llmcolumninfo.py +2 -0
- office365/sharepoint/utilities/move_copy_util.py +284 -10
- office365/sharepoint/viva/site_manager.py +10 -0
- office365/sharepoint/webhooks/subscription.py +41 -1
- office365/sharepoint/webhooks/subscription_information.py +2 -2
- office365/sharepoint/webparts/definitions/definition.py +8 -10
- office365/sharepoint/webparts/limited_manager.py +2 -6
- office365/sharepoint/webs/regional_settings.py +11 -15
- office365/sharepoint/webs/time_zone.py +9 -6
- office365/sharepoint/webs/web.py +57 -10
- office365/sharepoint/webs/web_fetch_result.py +13 -0
- office365/subscriptions/subscription.py +2 -8
- office365/teams/administration/account_type.py +17 -0
- office365/teams/administration/activation_state.py +16 -0
- office365/teams/administration/assignment_category.py +8 -1
- office365/teams/administration/assignment_status.py +18 -0
- office365/teams/administration/customer_action.py +13 -0
- office365/teams/administration/number_capability.py +15 -0
- office365/teams/administration/number_source.py +13 -0
- office365/teams/administration/number_type.py +15 -0
- office365/teams/administration/port_in_status.py +13 -0
- office365/teams/administration/reverse_number_lookup_option.py +12 -0
- office365/teams/apps/app.py +5 -5
- office365/teams/apps/installed_event_message_detail.py +17 -0
- office365/teams/apps/removed_event_message_detail.py +17 -0
- office365/teams/apps/upgraded_event_message_detail.py +17 -0
- office365/teams/archived_event_message_detail.py +16 -0
- office365/teams/channels/channel.py +23 -22
- office365/teams/channels/collection.py +10 -5
- office365/teams/chats/chat.py +36 -27
- office365/teams/chats/collection.py +19 -0
- office365/teams/chats/messages/body.py +32 -0
- office365/teams/chats/messages/collection.py +43 -0
- office365/teams/chats/messages/hosted_content.py +27 -0
- office365/teams/chats/messages/message.py +68 -3
- office365/teams/class_settings.py +14 -0
- office365/teams/collection.py +89 -14
- office365/teams/created_event_message_detail.py +18 -0
- office365/teams/description_updated_event_message_detail.py +17 -0
- office365/teams/joining_disabled_event_message_detail.py +16 -0
- office365/teams/joining_enabled_event_message_detail.py +16 -0
- office365/teams/licensing_details.py +14 -0
- office365/teams/members/aad_user_conversation.py +4 -4
- office365/teams/members/conversation.py +3 -3
- office365/teams/members/conversation_collection.py +7 -9
- office365/teams/members_notification_recipient.py +14 -0
- office365/teams/operations/async_operation.py +59 -8
- office365/teams/operations/type.py +4 -1
- office365/teams/renamed_event_message_detail.py +17 -0
- office365/teams/schedule/entitytheme.py +23 -0
- office365/teams/schedule/time_card_break.py +19 -0
- office365/teams/schedule/time_card_entry.py +19 -0
- office365/teams/schedule/time_card_event.py +18 -0
- office365/teams/schedule/time_card_state.py +14 -0
- office365/teams/schedule/time_clock_settings.py +15 -0
- office365/teams/schedule/time_off_details.py +15 -0
- office365/teams/schedule/time_off_item.py +14 -0
- office365/teams/schedule/time_off_reason_icon_type.py +32 -0
- office365/teams/tabs/updated_event_message_detail.py +16 -0
- office365/teams/team.py +88 -46
- office365/teams/teamwork/application_identity.py +15 -0
- office365/teams/teamwork/shiftmanagement/user_solution_root.py +4 -0
- office365/teams/teamwork/user.py +6 -8
- office365/teams/teamwork/workforce_integration_encryption_protocol.py +12 -0
- office365/teams/teamwork/workforce_integration_supported_entities.py +22 -0
- office365/teams/unarchived_event_message_detail.py +16 -0
- office365/teams/viva/employee_experience_user.py +5 -3
- office365/todo/attachments/collection.py +78 -3
- office365/todo/attachments/info.py +17 -1
- office365/todo/attachments/session.py +74 -0
- office365/todo/attachments/type.py +14 -2
- office365/todo/linked_resource.py +10 -0
- office365/todo/tasks/collection.py +5 -3
- office365/todo/tasks/lists/collection.py +4 -4
- office365/todo/tasks/lists/list.py +36 -0
- office365/todo/tasks/task.py +95 -8
- office365/todo/todo.py +5 -2
- {office365_rest_python_client-3.0.0.dist-info → office365_rest_python_client-3.1.0.dist-info}/METADATA +13 -3
- {office365_rest_python_client-3.0.0.dist-info → office365_rest_python_client-3.1.0.dist-info}/RECORD +1179 -598
- office365/migration/assessor.py +0 -243
- office365/onedrive/termstore/store_exporter.py +0 -40
- office365/onedrive/termstore/store_importer.py +0 -34
- office365/runtime/csv_writer.py +0 -77
- office365/runtime/odata/member.py +0 -14
- office365/runtime/odata/method.py +0 -19
- office365/runtime/odata/model.py +0 -54
- office365/runtime/odata/parameter.py +0 -19
- office365/runtime/odata/property.py +0 -19
- office365/runtime/odata/query_options_builder.py +0 -38
- office365/runtime/odata/reader.py +0 -99
- office365/runtime/odata/type_information.py +0 -32
- office365/runtime/odata/v3/metadata_reader.py +0 -52
- office365/runtime/odata/v4/metadata_reader.py +0 -28
- office365/runtime/queries/noop.py +0 -17
- office365/runtime/utilities.py +0 -226
- office365/sharepoint/migration/assessment/scanners/base.py +0 -57
- office365/sharepoint/migration/assessment/scanners/list.py +0 -68
- office365/sharepoint/migration/assessment/scanners/site.py +0 -25
- office365/todo/wellknown_list_name.py +0 -2
- /office365/directory/identitygovernance/accessreview/{access_review_history_instance.py → history_instance.py} +0 -0
- /office365/directory/identitygovernance/accessreview/{access_review_instance_decision_item.py → instance_decision_item.py} +0 -0
- /office365/directory/identitygovernance/accessreview/{access_review_reviewer.py → reviewer.py} +0 -0
- /office365/directory/identitygovernance/accessreview/{access_review_schedule_definition.py → schedule_definition.py} +0 -0
- /office365/directory/identitygovernance/{accessreview/access_package_text_input_question.py → entitlementmanagement/accesspackage/text_input_question.py} +0 -0
- /office365/directory/{security/data_security → recovery}/__init__.py +0 -0
- /office365/directory/security/{active_directory_domain_evidence.py → alerts/active_directory_domain_evidence.py} +0 -0
- /office365/directory/security/{azure_resource_evidence.py → alerts/azure_resource_evidence.py} +0 -0
- /office365/{sharepoint/migration → directory/security/audit}/__init__.py +0 -0
- /office365/directory/security/{a365_ai_execute_tool.py → audit/a365_ai_execute_tool.py} +0 -0
- /office365/directory/security/{aad_risk_detection_audit_record.py → audit/aad_risk_detection_audit_record.py} +0 -0
- /office365/directory/security/{ai_app_interaction_audit_record.py → audit/ai_app_interaction_audit_record.py} +0 -0
- /office365/directory/security/{ai_execute_tool_audit_record.py → audit/ai_execute_tool_audit_record.py} +0 -0
- /office365/directory/security/{ai_interactions_change_notification_audit_record.py → audit/ai_interactions_change_notification_audit_record.py} +0 -0
- /office365/directory/security/{ai_interactions_export_audit_record.py → audit/ai_interactions_export_audit_record.py} +0 -0
- /office365/directory/security/{ai_interactions_subscription_audit_record.py → audit/ai_interactions_subscription_audit_record.py} +0 -0
- /office365/directory/security/{ai_invoke_agent_audit_record.py → audit/ai_invoke_agent_audit_record.py} +0 -0
- /office365/directory/security/{ai_span_outputs_audit_record.py → audit/ai_span_outputs_audit_record.py} +0 -0
- /office365/directory/security/{air_manual_investigation_data.py → audit/air_manual_investigation_data.py} +0 -0
- /office365/directory/security/{alert_submission_audit_record.py → audit/alert_submission_audit_record.py} +0 -0
- /office365/directory/security/{alert_submission_result_detail_audit_record.py → audit/alert_submission_result_detail_audit_record.py} +0 -0
- /office365/directory/security/{attack_sim_admin_audit_record.py → audit/attack_sim_admin_audit_record.py} +0 -0
- /office365/directory/security/{attack_sim_audit_record.py → audit/attack_sim_audit_record.py} +0 -0
- /office365/directory/security/{audit_config_audit_record.py → audit/audit_config_audit_record.py} +0 -0
- /office365/directory/security/{audit_record_type_dictionary.py → audit/audit_record_type_dictionary.py} +0 -0
- /office365/directory/security/{audit_search_audit_record.py → audit/audit_search_audit_record.py} +0 -0
- /office365/directory/security/{azfw_application_rule_aggregation_event_record.py → audit/azfw_application_rule_aggregation_event_record.py} +0 -0
- /office365/directory/security/{azfw_dns_query_event_record.py → audit/azfw_dns_query_event_record.py} +0 -0
- /office365/directory/security/{azfw_network_rule_event_record.py → audit/azfw_network_rule_event_record.py} +0 -0
- /office365/directory/security/{azure_active_directory_account_logon_audit_record.py → audit/azure_active_directory_account_logon_audit_record.py} +0 -0
- /office365/directory/security/{azure_active_directory_audit_record.py → audit/azure_active_directory_audit_record.py} +0 -0
- /office365/directory/security/{azure_active_directory_sts_logon_audit_record.py → audit/azure_active_directory_sts_logon_audit_record.py} +0 -0
- /office365/directory/security/{azure_ai_search_audit_record.py → audit/azure_ai_search_audit_record.py} +0 -0
- /office365/directory/security/{campaign_audit_record.py → audit/campaign_audit_record.py} +0 -0
- /office365/directory/security/{ccrai_policy_violation_record.py → audit/ccrai_policy_violation_record.py} +0 -0
- /office365/directory/security/{cdp_classifier_health_record.py → audit/cdp_classifier_health_record.py} +0 -0
- /office365/directory/security/{cdp_cold_crawl_status_record.py → audit/cdp_cold_crawl_status_record.py} +0 -0
- /office365/directory/security/{cdp_consumption_resource_record.py → audit/cdp_consumption_resource_record.py} +0 -0
- /office365/directory/security/{cdp_content_explorer_aggregate_record.py → audit/cdp_content_explorer_aggregate_record.py} +0 -0
- /office365/directory/security/{cdp_dlp_sensitive_endpoint_audit_record.py → audit/cdp_dlp_sensitive_endpoint_audit_record.py} +0 -0
- /office365/directory/security/{cdp_log_record.py → audit/cdp_log_record.py} +0 -0
- /office365/directory/security/{cdp_ocr_billing_record.py → audit/cdp_ocr_billing_record.py} +0 -0
- /office365/directory/security/{cdp_resource_scope_change_event_record.py → audit/cdp_resource_scope_change_event_record.py} +0 -0
- /office365/directory/security/{cdpdlmai_interaction_insights_record.py → audit/cdpdlmai_interaction_insights_record.py} +0 -0
- /office365/directory/security/{cloud_update_device_config_audit_record.py → audit/cloud_update_device_config_audit_record.py} +0 -0
- /office365/directory/security/{cloud_update_profile_config_audit_record.py → audit/cloud_update_profile_config_audit_record.py} +0 -0
- /office365/directory/security/{cloud_update_tenant_config_audit_record.py → audit/cloud_update_tenant_config_audit_record.py} +0 -0
- /office365/directory/security/{compliance_connector_audit_record.py → audit/compliance_connector_audit_record.py} +0 -0
- /office365/directory/security/{compliance_dlm_exchange_audit_record.py → audit/compliance_dlm_exchange_audit_record.py} +0 -0
- /office365/directory/security/{compliance_dlm_share_point_audit_record.py → audit/compliance_dlm_share_point_audit_record.py} +0 -0
- /office365/directory/security/{compliance_dlp_applications_audit_record.py → audit/compliance_dlp_applications_audit_record.py} +0 -0
- /office365/directory/security/{compliance_dlp_applications_classification_audit_record.py → audit/compliance_dlp_applications_classification_audit_record.py} +0 -0
- /office365/directory/security/{compliance_dlp_endpoint_audit_record.py → audit/compliance_dlp_endpoint_audit_record.py} +0 -0
- /office365/directory/security/{compliance_dlp_endpoint_discovery_audit_record.py → audit/compliance_dlp_endpoint_discovery_audit_record.py} +0 -0
- /office365/directory/security/{compliance_dlp_enforcement_audit_record.py → audit/compliance_dlp_enforcement_audit_record.py} +0 -0
- /office365/directory/security/{compliance_dlp_exchange_audit_record.py → audit/compliance_dlp_exchange_audit_record.py} +0 -0
- /office365/directory/security/{compliance_dlp_exchange_classification_audit_record.py → audit/compliance_dlp_exchange_classification_audit_record.py} +0 -0
- /office365/directory/security/{compliance_dlp_exchange_classification_cdp_record.py → audit/compliance_dlp_exchange_classification_cdp_record.py} +0 -0
- /office365/directory/security/{compliance_dlp_exchange_discovery_audit_record.py → audit/compliance_dlp_exchange_discovery_audit_record.py} +0 -0
- /office365/directory/security/{compliance_dlp_share_point_audit_record.py → audit/compliance_dlp_share_point_audit_record.py} +0 -0
- /office365/directory/security/{compliance_dlp_share_point_classification_audit_record.py → audit/compliance_dlp_share_point_classification_audit_record.py} +0 -0
- /office365/directory/security/{compliance_dlp_share_point_classification_cdp_record.py → audit/compliance_dlp_share_point_classification_cdp_record.py} +0 -0
- /office365/directory/security/{compliance_dlp_share_point_classification_extended_audit_record.py → audit/compliance_dlp_share_point_classification_extended_audit_record.py} +0 -0
- /office365/directory/security/{compliance_exchange_ocr_audit_record.py → audit/compliance_exchange_ocr_audit_record.py} +0 -0
- /office365/directory/security/{compliance_manager_action_record.py → audit/compliance_manager_action_record.py} +0 -0
- /office365/directory/security/{compliance_policy_grading_share_point_audit_record.py → audit/compliance_policy_grading_share_point_audit_record.py} +0 -0
- /office365/directory/security/{compliance_settings_change_audit_record.py → audit/compliance_settings_change_audit_record.py} +0 -0
- /office365/directory/security/{compliance_sit_grading_share_point_audit_record.py → audit/compliance_sit_grading_share_point_audit_record.py} +0 -0
- /office365/directory/security/{compliance_supervision_exchange_audit_record.py → audit/compliance_supervision_exchange_audit_record.py} +0 -0
- /office365/directory/security/{connected_ai_app_interaction_audit_record.py → audit/connected_ai_app_interaction_audit_record.py} +0 -0
- /office365/directory/security/{consumption_resource_audit_record.py → audit/consumption_resource_audit_record.py} +0 -0
- /office365/directory/security/{content_store_metadata_record.py → audit/content_store_metadata_record.py} +0 -0
- /office365/directory/security/{copilot_agent_management_audit_record.py → audit/copilot_agent_management_audit_record.py} +0 -0
- /office365/directory/security/{copilot_for_security_logging_audit_record.py → audit/copilot_for_security_logging_audit_record.py} +0 -0
- /office365/directory/security/{copilot_for_security_trigger_audit_record.py → audit/copilot_for_security_trigger_audit_record.py} +0 -0
- /office365/directory/security/{copilot_interaction_audit_record.py → audit/copilot_interaction_audit_record.py} +0 -0
- /office365/directory/security/{copilot_plugin_setting_audit_record.py → audit/copilot_plugin_setting_audit_record.py} +0 -0
- /office365/directory/security/{copilot_prompt_book_setting_audit_record.py → audit/copilot_prompt_book_setting_audit_record.py} +0 -0
- /office365/directory/security/{copilot_session_sharing_audit_record.py → audit/copilot_session_sharing_audit_record.py} +0 -0
- /office365/directory/security/{copilot_setting_audit_record.py → audit/copilot_setting_audit_record.py} +0 -0
- /office365/directory/security/{copilot_workspace_setting_audit_record.py → audit/copilot_workspace_setting_audit_record.py} +0 -0
- /office365/directory/security/{core_reporting_settings_audit_record.py → audit/core_reporting_settings_audit_record.py} +0 -0
- /office365/directory/security/{critical_asset_management_classification_record.py → audit/critical_asset_management_classification_record.py} +0 -0
- /office365/directory/security/{crm_entity_operation_audit_record.py → audit/crm_entity_operation_audit_record.py} +0 -0
- /office365/directory/security/{cross_tenant_access_policy_audit_record.py → audit/cross_tenant_access_policy_audit_record.py} +0 -0
- /office365/directory/security/{device_discovery_settings_authenticated_scans_record.py → audit/device_discovery_settings_authenticated_scans_record.py} +0 -0
- /office365/directory/security/{device_discovery_settings_exclusion_record.py → audit/device_discovery_settings_exclusion_record.py} +0 -0
- /office365/directory/security/{device_discovery_settings_record.py → audit/device_discovery_settings_record.py} +0 -0
- /office365/directory/security/{discovery_audit_record.py → audit/discovery_audit_record.py} +0 -0
- /office365/directory/security/{dlp_endpoint_audit_record.py → audit/dlp_endpoint_audit_record.py} +0 -0
- /office365/directory/security/{dlp_import_result_audit_record.py → audit/dlp_import_result_audit_record.py} +0 -0
- /office365/directory/security/{dragon_copilot_access_record.py → audit/dragon_copilot_access_record.py} +0 -0
- /office365/directory/security/{dragon_copilot_admin_record.py → audit/dragon_copilot_admin_record.py} +0 -0
- /office365/directory/security/{dragon_copilot_clinical_data_record.py → audit/dragon_copilot_clinical_data_record.py} +0 -0
- /office365/directory/security/{dragon_copilot_session_record.py → audit/dragon_copilot_session_record.py} +0 -0
- /office365/directory/security/{dynamics365_business_central_audit_record.py → audit/dynamics365_business_central_audit_record.py} +0 -0
- /office365/directory/security/{ehr_connector_audit_base_record.py → audit/ehr_connector_audit_base_record.py} +0 -0
- /office365/directory/security/{eop_submission_feed_entity_audit_record.py → audit/eop_submission_feed_entity_audit_record.py} +0 -0
- /office365/directory/security/{exchange_admin_audit_record.py → audit/exchange_admin_audit_record.py} +0 -0
- /office365/directory/security/{exchange_aggregated_mailbox_audit_record.py → audit/exchange_aggregated_mailbox_audit_record.py} +0 -0
- /office365/directory/security/{exchange_aggregated_operation_record.py → audit/exchange_aggregated_operation_record.py} +0 -0
- /office365/directory/security/{exchange_mailbox_audit_group_record.py → audit/exchange_mailbox_audit_group_record.py} +0 -0
- /office365/directory/security/{exchange_mailbox_audit_record.py → audit/exchange_mailbox_audit_record.py} +0 -0
- /office365/directory/security/{hosted_rpa_audit_record.py → audit/hosted_rpa_audit_record.py} +0 -0
- /office365/directory/security/{hr_signal_audit_record.py → audit/hr_signal_audit_record.py} +0 -0
- /office365/directory/security/{hygiene_event_record.py → audit/hygiene_event_record.py} +0 -0
- /office365/directory/security/{information_barrier_policy_application_audit_record.py → audit/information_barrier_policy_application_audit_record.py} +0 -0
- /office365/directory/security/{information_worker_protection_audit_record.py → audit/information_worker_protection_audit_record.py} +0 -0
- /office365/directory/security/{insider_risk_scoped_user_insights_record.py → audit/insider_risk_scoped_user_insights_record.py} +0 -0
- /office365/directory/security/{insider_risk_scoped_users_record.py → audit/insider_risk_scoped_users_record.py} +0 -0
- /office365/directory/security/{microsoft_stream_audit_record.py → audit/microsoft_stream_audit_record.py} +0 -0
- /office365/directory/security/{microsoft_teams_admin_audit_record.py → audit/microsoft_teams_admin_audit_record.py} +0 -0
- /office365/directory/security/{microsoft_teams_analytics_audit_record.py → audit/microsoft_teams_analytics_audit_record.py} +0 -0
- /office365/directory/security/{microsoft_teams_audit_record.py → audit/microsoft_teams_audit_record.py} +0 -0
- /office365/directory/security/{microsoft_teams_device_audit_record.py → audit/microsoft_teams_device_audit_record.py} +0 -0
- /office365/directory/security/{microsoft_teams_retention_label_action_audit_record.py → audit/microsoft_teams_retention_label_action_audit_record.py} +0 -0
- /office365/directory/security/{microsoft_teams_sensitivity_label_action_audit_record.py → audit/microsoft_teams_sensitivity_label_action_audit_record.py} +0 -0
- /office365/directory/security/{microsoft_teams_shifts_audit_record.py → audit/microsoft_teams_shifts_audit_record.py} +0 -0
- /office365/directory/security/{microsoft_teams_user_concern_audit_record.py → audit/microsoft_teams_user_concern_audit_record.py} +0 -0
- /office365/directory/security/{whois_history_record.py → audit/whois_history_record.py} +0 -0
- /office365/directory/security/{case.py → cases/case.py} +0 -0
- /office365/{sharepoint/migration/assessment → directory/security/collaboration}/__init__.py +0 -0
- /office365/directory/security/{analyzed_email.py → collaboration/analyzed_email.py} +0 -0
- /office365/directory/security/{analyzed_email_authentication_detail.py → collaboration/analyzed_email_authentication_detail.py} +0 -0
- /office365/directory/security/{analyzed_email_delivery_detail.py → collaboration/analyzed_email_delivery_detail.py} +0 -0
- /office365/directory/security/{analyzed_email_dlp_rule_info.py → collaboration/analyzed_email_dlp_rule_info.py} +0 -0
- /office365/directory/security/{analyzed_email_exchange_transport_rule_info.py → collaboration/analyzed_email_exchange_transport_rule_info.py} +0 -0
- /office365/directory/security/{analyzed_email_recipient_detail.py → collaboration/analyzed_email_recipient_detail.py} +0 -0
- /office365/directory/security/{analyzed_email_sender_detail.py → collaboration/analyzed_email_sender_detail.py} +0 -0
- /office365/directory/security/{analyzed_email_url.py → collaboration/analyzed_email_url.py} +0 -0
- /office365/{sharepoint/migration/assessment/scanners → directory/security/datasecurity}/__init__.py +0 -0
- /office365/directory/security/{data_security → datasecurity}/sensitivity_label.py +0 -0
- /office365/directory/security/{host_logon_session_evidence.py → threatintelligence/host_logon_session_evidence.py} +0 -0
- /office365/directory/security/{host_reputation.py → threatintelligence/host_reputation.py} +0 -0
- /office365/directory/security/{hostname.py → threatintelligence/hostname.py} +0 -0
- {office365_rest_python_client-3.0.0.dist-info → office365_rest_python_client-3.1.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"""Value-level conversion between stored values and their JSON representation.
|
|
2
|
+
|
|
3
|
+
The shared conversion layer: ``serialize_value`` maps stored values to their JSON
|
|
4
|
+
form (used by ``ClientObject``/``ClientValue``/``ClientValueCollection``
|
|
5
|
+
``to_json``), and ``deserialize_value``/``declared_type`` map raw values to their
|
|
6
|
+
declared type (used by ``set_property``). ``_add_type_metadata`` attaches the
|
|
7
|
+
OData type marker.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import re
|
|
13
|
+
import types
|
|
14
|
+
import uuid
|
|
15
|
+
from datetime import date, datetime
|
|
16
|
+
from enum import Enum
|
|
17
|
+
from typing import Any, Dict, Optional, Tuple, Union, get_args, get_origin, get_type_hints
|
|
18
|
+
|
|
19
|
+
from office365.runtime.converters.scalars import parse_bool, parse_datetime, parse_enum, try_float, try_int
|
|
20
|
+
from office365.runtime.odata.json_format import ODataJsonFormat
|
|
21
|
+
from office365.runtime.odata.v3.json_light_format import JsonLightFormat
|
|
22
|
+
|
|
23
|
+
_UNSET = object()
|
|
24
|
+
_NoneType = type(None)
|
|
25
|
+
|
|
26
|
+
_SCALAR_CONVERTERS = {
|
|
27
|
+
bool: parse_bool,
|
|
28
|
+
int: try_int,
|
|
29
|
+
float: try_float,
|
|
30
|
+
datetime: parse_datetime,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
_declared_cache: Dict[Tuple[type, str], Any] = {}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def serialize_value(value: Any, json_format: Optional[ODataJsonFormat] = None) -> Any:
|
|
37
|
+
"""Convert a stored value to its JSON representation.
|
|
38
|
+
|
|
39
|
+
Handles ``ClientObject``/``ClientValue``/``ClientValueCollection`` (via their
|
|
40
|
+
``to_json``), ``Enum`` -> value, ``datetime``/``date`` -> ISO 8601, ``bytes``
|
|
41
|
+
-> UTF-8, ``UUID`` -> str. Any other value (scalar, ``None``, ``dict``,
|
|
42
|
+
``list``, ``ClientResult``) passes through unchanged.
|
|
43
|
+
"""
|
|
44
|
+
if isinstance(value, Enum):
|
|
45
|
+
return value.value
|
|
46
|
+
if isinstance(value, uuid.UUID):
|
|
47
|
+
return str(value)
|
|
48
|
+
if isinstance(value, bytes):
|
|
49
|
+
return value.decode("utf-8")
|
|
50
|
+
if isinstance(value, (datetime, date)):
|
|
51
|
+
return value.isoformat()
|
|
52
|
+
if hasattr(value, "to_json"):
|
|
53
|
+
return value.to_json(json_format)
|
|
54
|
+
return value
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _add_type_metadata(
|
|
58
|
+
result: Dict[str, Any], json_format: Optional[ODataJsonFormat], entity_type_name: Optional[str]
|
|
59
|
+
) -> None:
|
|
60
|
+
"""Attach the OData type metadata marker when the format requests it."""
|
|
61
|
+
if json_format is not None and json_format.include_control_information and entity_type_name is not None:
|
|
62
|
+
if isinstance(json_format, JsonLightFormat):
|
|
63
|
+
result[json_format.metadata_type] = {"type": entity_type_name}
|
|
64
|
+
else:
|
|
65
|
+
result[json_format.metadata_type] = "#" + entity_type_name
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def to_snake_case(name: str) -> str:
|
|
69
|
+
"""Convert a camelCase property name to its snake_case Python attribute."""
|
|
70
|
+
return re.sub(r"(?<!^)(?=[A-Z])", "_", name).lower()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _unwrap_type(target: Any) -> Any:
|
|
74
|
+
"""Strip Optional/Union wrappers from a type annotation."""
|
|
75
|
+
origin = get_origin(target)
|
|
76
|
+
if origin in (Union, getattr(types, "UnionType", None)):
|
|
77
|
+
args = [a for a in get_args(target) if a is not _NoneType]
|
|
78
|
+
return args[0] if len(args) == 1 else target
|
|
79
|
+
return target
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def declared_type(cls: type, name: str) -> Any:
|
|
83
|
+
"""Resolve the declared (unwrapped) type of a property/field by its OData name.
|
|
84
|
+
|
|
85
|
+
Entities resolve the ``@odata``-mapped or snake_case getter's return
|
|
86
|
+
annotation; ``ClientValue`` dataclasses the field annotation. ``None`` when
|
|
87
|
+
unresolvable. Cached per ``(cls, name)``.
|
|
88
|
+
"""
|
|
89
|
+
key = (cls, name)
|
|
90
|
+
if key in _declared_cache:
|
|
91
|
+
return _declared_cache[key]
|
|
92
|
+
declared = _resolve_declared_type(cls, name)
|
|
93
|
+
_declared_cache[key] = declared
|
|
94
|
+
return declared
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _resolve_declared_type(cls: type, name: str) -> Any:
|
|
98
|
+
meta = getattr(cls, "_odata_meta", {}).get(name)
|
|
99
|
+
attr = meta.attr if meta is not None else to_snake_case(name)
|
|
100
|
+
member = getattr(cls, attr, None)
|
|
101
|
+
if member is not None:
|
|
102
|
+
target = member.fget if isinstance(member, property) else member
|
|
103
|
+
try:
|
|
104
|
+
declared = get_type_hints(target).get("return")
|
|
105
|
+
except Exception:
|
|
106
|
+
declared = None
|
|
107
|
+
if declared is not None:
|
|
108
|
+
return _unwrap_type(declared)
|
|
109
|
+
try:
|
|
110
|
+
declared = get_type_hints(cls).get(name)
|
|
111
|
+
except Exception:
|
|
112
|
+
declared = None
|
|
113
|
+
return _unwrap_type(declared) if declared is not None else None
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def is_client_value_type(target: Any) -> bool:
|
|
117
|
+
"""Whether a type annotation represents a ``ClientValue`` (or generic ``ClientValueCollection``).
|
|
118
|
+
|
|
119
|
+
Uses the ``_is_client_value`` class marker so the conversion layer doesn't
|
|
120
|
+
import ``ClientValue`` (avoiding a cycle). ``get_type_hints`` returns
|
|
121
|
+
parametrized collections as a ``_GenericAlias``, so the origin is checked too.
|
|
122
|
+
"""
|
|
123
|
+
cls = target if isinstance(target, type) else get_origin(target)
|
|
124
|
+
return isinstance(cls, type) and getattr(cls, "_is_client_value", False)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _client_value_origin(target: Any) -> type:
|
|
128
|
+
"""Return the concrete class of a ClientValue type annotation."""
|
|
129
|
+
return target if isinstance(target, type) else get_origin(target)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def deserialize_declared(value: Any, declared_type: Any) -> Any:
|
|
133
|
+
"""Coerce a value to a declared scalar or enum type.
|
|
134
|
+
|
|
135
|
+
Returns ``_UNSET`` when the declared type isn't a supported scalar/enum, so
|
|
136
|
+
callers can fall back to their own handling.
|
|
137
|
+
"""
|
|
138
|
+
converter = _SCALAR_CONVERTERS.get(declared_type)
|
|
139
|
+
if converter is not None:
|
|
140
|
+
return converter(value)
|
|
141
|
+
if isinstance(declared_type, type) and issubclass(declared_type, Enum):
|
|
142
|
+
return parse_enum(declared_type, value)
|
|
143
|
+
return _UNSET
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def deserialize_nested(base: Any, value: Any, persist_changes: bool) -> Any:
|
|
147
|
+
"""Apply a raw list/dict onto a nested ``ClientValue``/``ClientObject``
|
|
148
|
+
(whose ``set_property`` maps list items by index and dict items by key),
|
|
149
|
+
returning the stored value. Scalar values are returned as-is.
|
|
150
|
+
"""
|
|
151
|
+
if isinstance(value, list):
|
|
152
|
+
for i, p_v in enumerate(value):
|
|
153
|
+
base.set_property(i, p_v, persist_changes)
|
|
154
|
+
elif isinstance(value, dict):
|
|
155
|
+
for k, p_v in value.items():
|
|
156
|
+
base.set_property(k, p_v, persist_changes)
|
|
157
|
+
else:
|
|
158
|
+
return value
|
|
159
|
+
return base
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def deserialize_value(target_type: Any, value: Any, current: Any, persist_changes: bool) -> Any:
|
|
163
|
+
"""Coerce a raw value for storage by its declared type, falling back to the current instance.
|
|
164
|
+
|
|
165
|
+
Declared scalars/enums go through ``deserialize_declared``; declared
|
|
166
|
+
``ClientValue``/``ClientValueCollection`` (including generic aliases) are
|
|
167
|
+
populated via ``deserialize_nested``. Otherwise the value is coerced against
|
|
168
|
+
the current instance (a nested ``ClientObject``/``ClientValue``, ``datetime``,
|
|
169
|
+
``Enum``) or passed through raw.
|
|
170
|
+
"""
|
|
171
|
+
if target_type is not None and value is not None:
|
|
172
|
+
coerced = deserialize_declared(value, target_type)
|
|
173
|
+
if coerced is not _UNSET:
|
|
174
|
+
return coerced
|
|
175
|
+
if is_client_value_type(target_type):
|
|
176
|
+
origin = _client_value_origin(target_type)
|
|
177
|
+
if not isinstance(current, origin):
|
|
178
|
+
current = origin()
|
|
179
|
+
return deserialize_nested(current, value, persist_changes)
|
|
180
|
+
if hasattr(current, "set_property") and not isinstance(current, (datetime, Enum)):
|
|
181
|
+
return deserialize_nested(current, value, persist_changes)
|
|
182
|
+
if isinstance(current, datetime):
|
|
183
|
+
return parse_datetime(value)
|
|
184
|
+
if isinstance(current, Enum):
|
|
185
|
+
return current if value is None else parse_enum(type(current), value)
|
|
186
|
+
return value
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import warnings
|
|
4
|
+
from functools import wraps
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def deprecated(reason: str, version: str = "next"):
|
|
8
|
+
"""Mark functions/methods as deprecated with a warning.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
reason: Explanation why this is deprecated
|
|
12
|
+
version: Version when this will be removed
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def decorator(func):
|
|
16
|
+
@wraps(func)
|
|
17
|
+
def wrapper(*args, **kwargs):
|
|
18
|
+
warnings.warn(
|
|
19
|
+
f"{func.__name__} is deprecated and will be removed in v{version}. {reason}",
|
|
20
|
+
category=FutureWarning,
|
|
21
|
+
stacklevel=2,
|
|
22
|
+
)
|
|
23
|
+
return func(*args, **kwargs)
|
|
24
|
+
|
|
25
|
+
return wrapper
|
|
26
|
+
|
|
27
|
+
return decorator
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import mimetypes
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def get_mime_type(file_name: str) -> tuple[str | None, str | None]:
|
|
7
|
+
"""Guess the MIME type and encoding for a filename.
|
|
8
|
+
|
|
9
|
+
Returns:
|
|
10
|
+
Tuple of (type, encoding) where either may be None
|
|
11
|
+
"""
|
|
12
|
+
return mimetypes.guess_type(file_name)
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"""Parsing and reacting to throttling / health signals on responses.
|
|
2
|
+
|
|
3
|
+
SharePoint Online reports server load via ``X-SharePointHealthScore`` on every
|
|
4
|
+
response and ``Retry-After`` on throttled (429/503) responses. Per the current
|
|
5
|
+
Microsoft guidance it does **not** return IETF ``RateLimit-*`` headers — those
|
|
6
|
+
are parsed defensively here in case a proxy or other source provides them.
|
|
7
|
+
|
|
8
|
+
Two ways to use it:
|
|
9
|
+
|
|
10
|
+
- Attach :func:`rate_limit_hook` per query (``after_execute(..., include_response=True)``)
|
|
11
|
+
or to the request event handler for every response;
|
|
12
|
+
- Wrap a workload in :func:`throttle_guard` for a scoped, self-removing guard
|
|
13
|
+
that hides the event plumbing entirely.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import threading
|
|
19
|
+
import time
|
|
20
|
+
from contextlib import contextmanager
|
|
21
|
+
from dataclasses import astuple, dataclass
|
|
22
|
+
from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional
|
|
23
|
+
|
|
24
|
+
from requests import Response
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from office365.runtime.client_runtime_context import ClientRuntimeContext
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass(frozen=True)
|
|
31
|
+
class ThrottleLimits:
|
|
32
|
+
"""Throttling state reported by the server on a successful response.
|
|
33
|
+
|
|
34
|
+
Attributes:
|
|
35
|
+
limit: Maximum requests permitted in the current window.
|
|
36
|
+
remaining: Requests still permitted before throttling kicks in.
|
|
37
|
+
reset: Seconds until the quota window resets.
|
|
38
|
+
retry_after: Seconds the server asks us to wait (``Retry-After``).
|
|
39
|
+
health_score: SharePoint health score (0-100), if reported.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
limit: Optional[int] = None
|
|
43
|
+
remaining: Optional[int] = None
|
|
44
|
+
reset: Optional[int] = None
|
|
45
|
+
retry_after: Optional[int] = None
|
|
46
|
+
health_score: Optional[int] = None
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def parse_throttling(response: Response) -> Optional[ThrottleLimits]:
|
|
50
|
+
"""Parse throttling / health headers from a response into a ``ThrottleLimits``.
|
|
51
|
+
|
|
52
|
+
Returns ``None`` when the response carries none of the tracked headers
|
|
53
|
+
(e.g. a Microsoft Graph response), so hooks can stay silent for other APIs.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
response: The raw HTTP response.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
ThrottleLimits, or None when no tracked headers are present.
|
|
60
|
+
"""
|
|
61
|
+
limits = ThrottleLimits(
|
|
62
|
+
limit=_to_int(response.headers.get("RateLimit-Limit")),
|
|
63
|
+
remaining=_to_int(response.headers.get("RateLimit-Remaining")),
|
|
64
|
+
reset=_to_int(response.headers.get("RateLimit-Reset")),
|
|
65
|
+
retry_after=_to_int(response.headers.get("Retry-After")),
|
|
66
|
+
health_score=_to_int(response.headers.get("X-SharePointHealthScore")),
|
|
67
|
+
)
|
|
68
|
+
if any(value is not None for value in astuple(limits)):
|
|
69
|
+
return limits
|
|
70
|
+
return None
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def rate_limit_hook(callback: Optional[Callable[[ThrottleLimits], None]] = None) -> Callable[[Response], None]:
|
|
74
|
+
"""Return an after-execute hook that reports parsed throttling / health state.
|
|
75
|
+
|
|
76
|
+
The returned hook is compatible with ``after_execute`` (it expects the raw
|
|
77
|
+
``Response``). It fires ``callback`` only when the response carries any of
|
|
78
|
+
the tracked headers — silent otherwise.
|
|
79
|
+
|
|
80
|
+
Usage:
|
|
81
|
+
>>> from office365.runtime.http.throttling import rate_limit_hook
|
|
82
|
+
>>> items.get().after_execute(rate_limit_hook(my_callback), include_response=True).execute_query()
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
def _hook(response: Response) -> None:
|
|
86
|
+
limits = parse_throttling(response)
|
|
87
|
+
if limits is not None and callable(callback):
|
|
88
|
+
callback(limits)
|
|
89
|
+
|
|
90
|
+
return _hook
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@contextmanager
|
|
94
|
+
def throttle_guard(
|
|
95
|
+
context: "ClientRuntimeContext",
|
|
96
|
+
on_limits: Optional[Callable[[ThrottleLimits], None]] = None,
|
|
97
|
+
) -> Iterator[None]:
|
|
98
|
+
"""Monitor throttling / health signals on every response within a scope.
|
|
99
|
+
|
|
100
|
+
Attaches :func:`rate_limit_hook` to the request's ``afterExecute`` event
|
|
101
|
+
handler on enter and removes it on exit, so the guard applies to every query
|
|
102
|
+
executed inside the ``with`` block — no ``include_response`` plumbing needed.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
context: The client context to monitor.
|
|
106
|
+
on_limits: Optional callback invoked with parsed state per response
|
|
107
|
+
(only when any of the tracked headers are present).
|
|
108
|
+
|
|
109
|
+
Usage:
|
|
110
|
+
>>> from office365.runtime.http.throttling import throttle_guard, ThrottleLimits
|
|
111
|
+
>>> def pace(limits: ThrottleLimits) -> None:
|
|
112
|
+
... if limits.remaining is not None and limits.remaining < 10:
|
|
113
|
+
... time.sleep(limits.reset or 1)
|
|
114
|
+
>>> with throttle_guard(ctx, on_limits=pace):
|
|
115
|
+
... ctx.execute_query()
|
|
116
|
+
"""
|
|
117
|
+
handler = context.pending_request().afterExecute
|
|
118
|
+
hook = rate_limit_hook(on_limits)
|
|
119
|
+
handler += hook
|
|
120
|
+
try:
|
|
121
|
+
yield
|
|
122
|
+
finally:
|
|
123
|
+
handler -= hook
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _to_int(value: Any) -> Optional[int]:
|
|
127
|
+
"""Parse a header value into an int, returning None when absent/invalid."""
|
|
128
|
+
try:
|
|
129
|
+
return int(value)
|
|
130
|
+
except (TypeError, ValueError):
|
|
131
|
+
return None
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
class RateLimiter:
|
|
135
|
+
"""Thread-safe gate shared across workers so parallel requests pace as a group.
|
|
136
|
+
|
|
137
|
+
Unlike :func:`throttle_guard` (reactive, per-context) and the per-request
|
|
138
|
+
backoff in ``retry.py``, this limiter coordinates a *fleet* of clones/workers:
|
|
139
|
+
before any request is sent it blocks until the group gate is open, and when
|
|
140
|
+
any worker observes throttling it pauses the whole group.
|
|
141
|
+
|
|
142
|
+
Opt-in — attach it to a context (or a clone) with :meth:`bind`; the existing
|
|
143
|
+
per-request retry remains as the safety net.
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
_SLEEP_GRANULARITY = 0.05
|
|
147
|
+
|
|
148
|
+
def __init__(self, health_threshold: int = 80, min_interval: float = 0.0) -> None:
|
|
149
|
+
self._lock = threading.RLock()
|
|
150
|
+
self._next_available_at = 0.0
|
|
151
|
+
self._health_threshold = health_threshold
|
|
152
|
+
self._min_interval = min_interval
|
|
153
|
+
|
|
154
|
+
def acquire(self) -> None:
|
|
155
|
+
"""Block the calling thread until the group gate opens.
|
|
156
|
+
|
|
157
|
+
Called before a request is sent; safe to invoke from many threads.
|
|
158
|
+
"""
|
|
159
|
+
while True:
|
|
160
|
+
with self._lock:
|
|
161
|
+
wait = self._next_available_at - time.monotonic()
|
|
162
|
+
if wait <= 0:
|
|
163
|
+
return
|
|
164
|
+
time.sleep(min(wait, self._SLEEP_GRANULARITY))
|
|
165
|
+
|
|
166
|
+
def observe(self, response: Optional[Response]) -> None:
|
|
167
|
+
"""Record throttling signals and pause the group when the server asks.
|
|
168
|
+
|
|
169
|
+
A throttled response (``Retry-After``) gates the fleet for that long;
|
|
170
|
+
a high ``X-SharePointHealthScore`` applies a short, scaled pace so the
|
|
171
|
+
group eases off as the farm heats up.
|
|
172
|
+
"""
|
|
173
|
+
if response is None:
|
|
174
|
+
return
|
|
175
|
+
limits = parse_throttling(response)
|
|
176
|
+
if limits is None:
|
|
177
|
+
return
|
|
178
|
+
now = time.monotonic()
|
|
179
|
+
with self._lock:
|
|
180
|
+
if limits.retry_after is not None and limits.retry_after > 0:
|
|
181
|
+
self._next_available_at = max(self._next_available_at, now + limits.retry_after)
|
|
182
|
+
if limits.health_score is not None and limits.health_score >= self._health_threshold:
|
|
183
|
+
pace = (limits.health_score - self._health_threshold) / 20.0
|
|
184
|
+
self._next_available_at = max(self._next_available_at, now + max(pace, self._min_interval))
|
|
185
|
+
|
|
186
|
+
def bind(self, context: "ClientRuntimeContext") -> "RateLimiter":
|
|
187
|
+
"""Attach this limiter to a context (or ``clone``) — every request paces as a group.
|
|
188
|
+
|
|
189
|
+
Health signals are read on successful responses (``afterExecute``);
|
|
190
|
+
throttled responses (429/503) raise before ``afterExecute``, so their
|
|
191
|
+
``Retry-After`` is read via ``onError`` instead.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
context: The client context to monitor and gate.
|
|
195
|
+
"""
|
|
196
|
+
request = context.pending_request()
|
|
197
|
+
request.beforeExecute += lambda _: self.acquire()
|
|
198
|
+
request.afterExecute += lambda response: self.observe(response)
|
|
199
|
+
request.onError += lambda ex: self.observe(getattr(ex, "response", None))
|
|
200
|
+
return self
|
|
201
|
+
|
|
202
|
+
def reset(self) -> None:
|
|
203
|
+
"""Clear the current gate (used by tests / recovery)."""
|
|
204
|
+
with self._lock:
|
|
205
|
+
self._next_available_at = 0.0
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from urllib.parse import parse_qs, urlparse
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def is_absolute_url(url: str) -> bool:
|
|
7
|
+
"""Determine if a URL is absolute (contains network location)."""
|
|
8
|
+
return bool(urlparse(url).netloc)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def get_absolute_url(url: str) -> str:
|
|
12
|
+
"""Extract the base URL (scheme+netloc) from a full URL.
|
|
13
|
+
|
|
14
|
+
Example:
|
|
15
|
+
>>> get_absolute_url("https://example.com/path?query=1")
|
|
16
|
+
'https://example.com'
|
|
17
|
+
"""
|
|
18
|
+
path = urlparse(url).path
|
|
19
|
+
return url.replace(path, "")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def parse_query_param(url: str, key: str) -> str:
|
|
23
|
+
"""Extract the first value of a query string parameter.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
url: URL containing query string
|
|
27
|
+
key: Query parameter key to look up
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
First value for the specified key
|
|
31
|
+
|
|
32
|
+
Raises:
|
|
33
|
+
KeyError: If parameter not found
|
|
34
|
+
"""
|
|
35
|
+
parsed_url = urlparse(url)
|
|
36
|
+
return parse_qs(parsed_url.query)[key][0]
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""Batch request sizing utilities.
|
|
2
|
+
|
|
3
|
+
Proactive chunking: batches are split by sub-request **count** and by estimated
|
|
4
|
+
**payload bytes** so a batch never exceeds a service request-size limit.
|
|
5
|
+
Reactive fallback: a whole-batch transport rejection (nothing was applied) is
|
|
6
|
+
signalled with :class:`WholeBatchRejected`, which callers halve and retry.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
from typing import Optional, Sequence
|
|
13
|
+
|
|
14
|
+
from office365.runtime.client_request_exception import ClientRequestException
|
|
15
|
+
|
|
16
|
+
# Batch-level HTTP statuses that indicate the whole request was rejected before
|
|
17
|
+
# any sub-request ran (e.g. the body exceeds a request-size limit).
|
|
18
|
+
WHOLE_BATCH_REJECT_CODES = frozenset({400, 413, 414, 431})
|
|
19
|
+
|
|
20
|
+
_BATCH_OVERHEAD = 1024 # multipart/JSON envelope allowance per batch
|
|
21
|
+
_PART_OVERHEAD = 256 # per-sub-request header/boundary allowance
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def estimate_query_bytes(query) -> int:
|
|
25
|
+
"""Estimate the wire size of a batched sub-request without building a request.
|
|
26
|
+
|
|
27
|
+
Builds the URL from the query's resource path and serializes its payload
|
|
28
|
+
locally — no transport/auth side effects.
|
|
29
|
+
"""
|
|
30
|
+
url = getattr(query, "url", "") or ""
|
|
31
|
+
size = len(str(url).encode("utf-8"))
|
|
32
|
+
|
|
33
|
+
payload = getattr(query, "parameters_type", None)
|
|
34
|
+
body = None
|
|
35
|
+
if payload is not None:
|
|
36
|
+
if isinstance(payload, dict):
|
|
37
|
+
body = json.dumps(payload, separators=(",", ":"))
|
|
38
|
+
elif isinstance(payload, (str, bytes)):
|
|
39
|
+
body = str(payload)
|
|
40
|
+
else:
|
|
41
|
+
try:
|
|
42
|
+
body = json.dumps(payload.to_json(None), separators=(",", ":"))
|
|
43
|
+
except Exception:
|
|
44
|
+
body = str(payload)
|
|
45
|
+
size += len(str(body).encode("utf-8"))
|
|
46
|
+
|
|
47
|
+
headers = getattr(query, "custom_headers", None) or {}
|
|
48
|
+
for k, v in headers.items():
|
|
49
|
+
size += len(str(k)) + len(str(v))
|
|
50
|
+
return size + _PART_OVERHEAD
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def partition_by_limits(
|
|
54
|
+
queries: Sequence,
|
|
55
|
+
max_items: Optional[int],
|
|
56
|
+
max_bytes: Optional[int],
|
|
57
|
+
) -> list[list]:
|
|
58
|
+
"""Split queries into batches respecting item and byte caps (order preserved).
|
|
59
|
+
|
|
60
|
+
A single oversized query still becomes its own one-item batch, so a request
|
|
61
|
+
rejected purely because of size is sent alone.
|
|
62
|
+
"""
|
|
63
|
+
batches: list[list] = []
|
|
64
|
+
current: list = []
|
|
65
|
+
current_bytes = _BATCH_OVERHEAD
|
|
66
|
+
for query in queries:
|
|
67
|
+
if max_items is not None and len(current) >= max_items:
|
|
68
|
+
batches.append(current)
|
|
69
|
+
current, current_bytes = [], _BATCH_OVERHEAD
|
|
70
|
+
item_bytes = estimate_query_bytes(query)
|
|
71
|
+
if max_bytes is not None and current and current_bytes + item_bytes > max_bytes:
|
|
72
|
+
batches.append(current)
|
|
73
|
+
current, current_bytes = [], _BATCH_OVERHEAD
|
|
74
|
+
current.append(query)
|
|
75
|
+
current_bytes += item_bytes
|
|
76
|
+
if current:
|
|
77
|
+
batches.append(current)
|
|
78
|
+
return batches
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class WholeBatchRejected(ClientRequestException):
|
|
82
|
+
"""Internal marker: the whole batch HTTP request was rejected.
|
|
83
|
+
|
|
84
|
+
Raised only for a transport-level rejection (before any sub-request was
|
|
85
|
+
applied); callers may safely halve the batch and retry.
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
def __init__(self, queries: list, cause: ClientRequestException) -> None:
|
|
89
|
+
super().__init__(str(cause))
|
|
90
|
+
self.queries = list(queries)
|
|
91
|
+
self.__cause__ = cause
|
|
92
|
+
self.response = getattr(cause, "response", None)
|
|
@@ -48,13 +48,23 @@ class QueryOptions:
|
|
|
48
48
|
"""Checks if any query options are set."""
|
|
49
49
|
return not any(self.__dict__.values())
|
|
50
50
|
|
|
51
|
+
_ODATA_OPTIONS = ("select", "expand", "filter", "order_by", "top", "skip")
|
|
52
|
+
|
|
51
53
|
def to_url(self) -> str:
|
|
52
54
|
"""Generates URL query string from current options.
|
|
53
55
|
|
|
56
|
+
Standard OData system query options are prefixed with ``$``; custom
|
|
57
|
+
query parameters are emitted verbatim (the caller controls the key,
|
|
58
|
+
e.g. ``token`` for OneDrive/SharePoint delta queries).
|
|
59
|
+
|
|
54
60
|
Returns:
|
|
55
61
|
URL-encoded query string (without leading ?)
|
|
56
62
|
"""
|
|
57
|
-
|
|
63
|
+
parts = []
|
|
64
|
+
for key, value in self:
|
|
65
|
+
prefix = "$" if key in self._ODATA_OPTIONS else ""
|
|
66
|
+
parts.append(f"{prefix}{key}={value}")
|
|
67
|
+
return "&".join(parts)
|
|
58
68
|
|
|
59
69
|
def __iter__(self) -> Iterator[Tuple[str, str]]:
|
|
60
70
|
"""Yields non-empty query options as key-value pairs."""
|
|
@@ -67,3 +77,18 @@ class QueryOptions:
|
|
|
67
77
|
yield from self.custom.items()
|
|
68
78
|
else:
|
|
69
79
|
yield k, str(v)
|
|
80
|
+
|
|
81
|
+
def apply_to(self, target) -> None:
|
|
82
|
+
"""Forward ``$select`` / ``$expand`` onto a collection-like target about to load.
|
|
83
|
+
|
|
84
|
+
Used by recursive scan helpers so the fluent ``.select(...)`` /
|
|
85
|
+
``.expand(...)`` applied to their returned collection reaches every
|
|
86
|
+
request they issue (the scan reads the options at execution time).
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
target: A collection exposing ``select`` / ``expand`` (duck-typed).
|
|
90
|
+
"""
|
|
91
|
+
if self.select:
|
|
92
|
+
target.select(list(self.select))
|
|
93
|
+
if self.expand:
|
|
94
|
+
target.expand(list(self.expand))
|
|
@@ -7,6 +7,7 @@ from requests import Response
|
|
|
7
7
|
|
|
8
8
|
from office365.runtime.client_object import ClientObject
|
|
9
9
|
from office365.runtime.client_request import ClientRequest
|
|
10
|
+
from office365.runtime.client_request_exception import ClientRequestException
|
|
10
11
|
from office365.runtime.client_result import ClientResult
|
|
11
12
|
from office365.runtime.client_value import ClientValue
|
|
12
13
|
from office365.runtime.http.http_method import HttpMethod
|
|
@@ -77,7 +78,10 @@ class ODataRequest(ClientRequest):
|
|
|
77
78
|
if isinstance(return_type, ClientObject):
|
|
78
79
|
return_type.clear_state()
|
|
79
80
|
|
|
80
|
-
|
|
81
|
+
content_type = response.headers.get("Content-Type", "").lower().split(";")[0]
|
|
82
|
+
is_raw_content = isinstance(query, FunctionQuery) and query.return_raw_content
|
|
83
|
+
|
|
84
|
+
if content_type != "application/json" or is_raw_content:
|
|
81
85
|
if isinstance(return_type, ClientResult):
|
|
82
86
|
return_type.set_property("__value", response.content)
|
|
83
87
|
else:
|
|
@@ -85,7 +89,10 @@ class ODataRequest(ClientRequest):
|
|
|
85
89
|
if isinstance(query, (ServiceOperationQuery, FunctionQuery)):
|
|
86
90
|
json_format.function = query.name
|
|
87
91
|
|
|
88
|
-
|
|
92
|
+
try:
|
|
93
|
+
self.map_json(response.json(), return_type, json_format)
|
|
94
|
+
except ValueError as e:
|
|
95
|
+
raise ClientRequestException(str(e), response=response) from e
|
|
89
96
|
|
|
90
97
|
def map_json(
|
|
91
98
|
self,
|
|
@@ -138,25 +145,29 @@ class ODataRequest(ClientRequest):
|
|
|
138
145
|
yield index, transformed if isinstance(item, dict) else item
|
|
139
146
|
elif isinstance(json, dict):
|
|
140
147
|
for name, value in json.items():
|
|
141
|
-
|
|
142
|
-
is_valid = name != json_format.metadata_type and not (
|
|
143
|
-
isinstance(value, dict) and "__deferred" in value
|
|
144
|
-
)
|
|
145
|
-
else:
|
|
146
|
-
is_valid = "@odata" not in name
|
|
147
|
-
|
|
148
|
-
if is_valid:
|
|
149
|
-
transformed = None
|
|
150
|
-
if isinstance(value, dict):
|
|
151
|
-
transformed = {k: v for k, v in self._next_property(value, json_format)}
|
|
152
|
-
yield name, transformed if isinstance(value, dict) else value
|
|
153
|
-
elif name == "@odata.etag":
|
|
154
|
-
yield "__etag", value
|
|
148
|
+
yield from self._next_object_property(name, value, json_format)
|
|
155
149
|
else:
|
|
156
150
|
yield "__value", json
|
|
157
151
|
elif json is not None:
|
|
158
152
|
yield "__value", json
|
|
159
153
|
|
|
154
|
+
def _next_object_property(self, name: str, value: Any, json_format: ODataJsonFormat) -> Iterator[Tuple[str, Any]]:
|
|
155
|
+
"""Yields a single property from a JSON object according to the OData format."""
|
|
156
|
+
if isinstance(json_format, JsonLightFormat):
|
|
157
|
+
is_valid = name != json_format.metadata_type and not (isinstance(value, dict) and "__deferred" in value)
|
|
158
|
+
else:
|
|
159
|
+
is_valid = "@odata" not in name
|
|
160
|
+
|
|
161
|
+
if is_valid:
|
|
162
|
+
if isinstance(value, dict):
|
|
163
|
+
yield name, {k: v for k, v in self._next_property(value, json_format)}
|
|
164
|
+
else:
|
|
165
|
+
yield name, value
|
|
166
|
+
elif name == json_format.etag:
|
|
167
|
+
yield "__etag", value
|
|
168
|
+
elif name == json_format.metadata_type and isinstance(value, str):
|
|
169
|
+
yield "__odata_type", value
|
|
170
|
+
|
|
160
171
|
def _build_payload(self, query: ClientQuery) -> Union[Dict[str, Any], List[Any], str, bytes]:
|
|
161
172
|
"""
|
|
162
173
|
Normalizes OData request payload.
|