Office365-REST-Python-Client 2.5.5__py3-none-any.whl → 2.5.6__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.
Files changed (203) hide show
  1. {Office365_REST_Python_Client-2.5.5.dist-info → Office365_REST_Python_Client-2.5.6.dist-info}/METADATA +2 -2
  2. {Office365_REST_Python_Client-2.5.5.dist-info → Office365_REST_Python_Client-2.5.6.dist-info}/RECORD +202 -182
  3. office365/booking/virtualevents/__init__.py +0 -0
  4. office365/booking/virtualevents/root.py +5 -0
  5. office365/communications/calls/participant.py +4 -5
  6. office365/directory/applications/application.py +3 -3
  7. office365/directory/applications/roles/assignment_collection.py +1 -1
  8. office365/directory/applications/roles/collection.py +2 -2
  9. office365/directory/authentication/method_configuration.py +9 -0
  10. office365/directory/authentication/method_mode_detail.py +8 -0
  11. office365/directory/authentication/method_target.py +5 -0
  12. office365/directory/authentication/strength_root.py +5 -0
  13. office365/directory/certificates/auth_configuration.py +1 -3
  14. office365/directory/groups/group.py +2 -6
  15. office365/directory/identities/conditional_access_root.py +10 -1
  16. office365/directory/identities/container.py +3 -9
  17. office365/directory/identities/providers/builtin_identity.py +3 -2
  18. office365/directory/identities/providers/saml_or_wsfed.py +4 -5
  19. office365/directory/identitygovernance/governance.py +14 -3
  20. office365/directory/identitygovernance/privilegedaccess/__init__.py +0 -0
  21. office365/directory/identitygovernance/privilegedaccess/root.py +5 -0
  22. office365/directory/key_credential.py +3 -0
  23. office365/directory/licenses/assignment_state.py +26 -2
  24. office365/directory/licenses/details.py +4 -3
  25. office365/directory/licenses/subscribed_sku.py +8 -10
  26. office365/directory/object_collection.py +40 -25
  27. office365/directory/password_credential.py +3 -0
  28. office365/directory/permissions/default_user_role.py +5 -0
  29. office365/directory/permissions/grants/condition_set.py +4 -2
  30. office365/directory/permissions/grants/oauth2.py +7 -10
  31. office365/directory/policies/authorization.py +50 -3
  32. office365/directory/policies/permission_grant.py +2 -0
  33. office365/directory/profile_photo.py +6 -6
  34. office365/directory/protection/riskyusers/risky_user.py +4 -4
  35. office365/directory/rolemanagement/resource_action.py +10 -0
  36. office365/directory/rolemanagement/role_permission.py +10 -0
  37. office365/directory/security/alerts/alert.py +5 -7
  38. office365/directory/security/attacksimulations/landing_page.py +5 -0
  39. office365/directory/security/attacksimulations/operation.py +5 -0
  40. office365/directory/security/attacksimulations/report.py +8 -1
  41. office365/directory/security/attacksimulations/root.py +33 -0
  42. office365/directory/security/attacksimulations/users/__init__.py +0 -0
  43. office365/directory/security/attacksimulations/users/details.py +5 -0
  44. office365/directory/security/hunting_query_results.py +5 -0
  45. office365/directory/security/incidents/incident.py +8 -13
  46. office365/directory/security/security.py +20 -3
  47. office365/directory/serviceprincipals/service_principal.py +3 -4
  48. office365/directory/synchronization/synchronization.py +2 -0
  49. office365/directory/users/activities/history_item.py +3 -2
  50. office365/directory/users/user.py +37 -10
  51. office365/entity_collection.py +3 -2
  52. office365/graph_client.py +58 -30
  53. office365/intune/audit/event.py +1 -3
  54. office365/intune/audit/event_collection.py +1 -1
  55. office365/intune/devices/alternative_security_id.py +4 -0
  56. office365/intune/devices/collection.py +57 -0
  57. office365/intune/devices/device.py +38 -10
  58. office365/intune/devices/management/management.py +12 -0
  59. office365/intune/organizations/organization.py +1 -0
  60. office365/onedrive/analytics/item_activity_stat.py +9 -0
  61. office365/onedrive/analytics/item_analytics.py +1 -0
  62. office365/onedrive/contenttypes/content_type.py +4 -12
  63. office365/onedrive/driveitems/driveItem.py +2 -1
  64. office365/onedrive/files/hashes.py +5 -0
  65. office365/onedrive/lists/collection.py +2 -2
  66. office365/onedrive/operations/long_running.py +6 -6
  67. office365/onedrive/operations/rich_long_running.py +4 -3
  68. office365/onedrive/permissions/collection.py +1 -14
  69. office365/onedrive/sharepoint_settings.py +6 -6
  70. office365/onedrive/sites/sites_with_root.py +1 -3
  71. office365/onedrive/termstore/store.py +2 -4
  72. office365/onedrive/termstore/terms/collection.py +1 -2
  73. office365/onedrive/workbooks/filter.py +9 -0
  74. office365/onedrive/workbooks/filter_criteria.py +5 -0
  75. office365/onedrive/workbooks/functions/functions.py +6 -3
  76. office365/onedrive/workbooks/functions/result.py +2 -0
  77. office365/onedrive/workbooks/operations/workbook.py +7 -10
  78. office365/onedrive/workbooks/tables/pivot_table.py +9 -9
  79. office365/onedrive/workbooks/worksheets/collection.py +0 -6
  80. office365/onedrive/workbooks/worksheets/protection.py +2 -0
  81. office365/outlook/calendar/permissions/permission.py +7 -7
  82. office365/outlook/calendar/place.py +5 -3
  83. office365/outlook/mail/attachments/collection.py +6 -1
  84. office365/outlook/mail/messages/message.py +1 -1
  85. office365/reports/root.py +50 -4
  86. office365/runtime/auth/providers/acs_token_provider.py +10 -7
  87. office365/runtime/auth/sts_profile.py +0 -1
  88. office365/runtime/client_object.py +18 -14
  89. office365/runtime/client_object_collection.py +8 -23
  90. office365/runtime/client_request_exception.py +1 -3
  91. office365/runtime/client_result.py +11 -14
  92. office365/runtime/client_runtime_context.py +11 -21
  93. office365/runtime/odata/json_format.py +4 -7
  94. office365/runtime/odata/v3/batch_request.py +7 -15
  95. office365/runtime/odata/v4/batch_request.py +13 -21
  96. office365/runtime/types/event_handler.py +1 -1
  97. office365/search/entity.py +3 -2
  98. office365/sharepoint/activities/facets/delete.py +1 -1
  99. office365/sharepoint/activities/tracked_item_service.py +2 -3
  100. office365/sharepoint/administration/web_application.py +8 -7
  101. office365/sharepoint/audit/audit.py +3 -2
  102. office365/sharepoint/changes/alert.py +4 -3
  103. office365/sharepoint/changes/collection.py +7 -10
  104. office365/sharepoint/changes/content_type.py +4 -4
  105. office365/sharepoint/changes/field.py +4 -5
  106. office365/sharepoint/changes/item.py +34 -7
  107. office365/sharepoint/changes/list.py +4 -4
  108. office365/sharepoint/changes/user.py +5 -6
  109. office365/sharepoint/clientsidecomponent/component_context_info.py +4 -3
  110. office365/sharepoint/contentcenter/machinelearning/enabled.py +4 -3
  111. office365/sharepoint/contentcenter/machinelearning/hub.py +6 -6
  112. office365/sharepoint/contentcenter/machinelearning/models/collection.py +1 -1
  113. office365/sharepoint/contenttypes/fieldlinks/collection.py +4 -6
  114. office365/sharepoint/contenttypes/fieldlinks/field_link.py +14 -22
  115. office365/sharepoint/entity.py +12 -5
  116. office365/sharepoint/entity_collection.py +1 -3
  117. office365/sharepoint/eventreceivers/definition.py +8 -12
  118. office365/sharepoint/features/collection.py +1 -2
  119. office365/sharepoint/features/definitions/definition.py +6 -3
  120. office365/sharepoint/fields/calculated.py +8 -14
  121. office365/sharepoint/fields/collection.py +42 -10
  122. office365/sharepoint/fields/computed.py +4 -5
  123. office365/sharepoint/fields/currency.py +7 -11
  124. office365/sharepoint/fields/date_time.py +4 -8
  125. office365/sharepoint/fields/field.py +6 -16
  126. office365/sharepoint/fields/lookup.py +11 -9
  127. office365/sharepoint/fields/multi_choice.py +8 -12
  128. office365/sharepoint/fields/multi_line_text.py +10 -14
  129. office365/sharepoint/fields/number.py +13 -26
  130. office365/sharepoint/fields/rating_scale.py +6 -10
  131. office365/sharepoint/fields/related_field.py +10 -17
  132. office365/sharepoint/fields/url.py +4 -5
  133. office365/sharepoint/fields/user.py +10 -9
  134. office365/sharepoint/files/collection.py +17 -15
  135. office365/sharepoint/files/file.py +30 -23
  136. office365/sharepoint/folders/collection.py +22 -5
  137. office365/sharepoint/folders/coloring.py +11 -9
  138. office365/sharepoint/folders/coloring_information.py +38 -0
  139. office365/sharepoint/folders/folder.py +22 -22
  140. office365/sharepoint/likes/liked_by_information.py +7 -10
  141. office365/sharepoint/likes/user_entity.py +6 -8
  142. office365/sharepoint/listitems/form_update_value.py +17 -1
  143. office365/sharepoint/listitems/listitem.py +2 -2
  144. office365/sharepoint/lists/bloom_filter.py +5 -7
  145. office365/sharepoint/lists/creatables_info.py +5 -6
  146. office365/sharepoint/lists/list.py +24 -9
  147. office365/sharepoint/lists/template.py +7 -4
  148. office365/sharepoint/lists/template_collection.py +2 -4
  149. office365/sharepoint/marketplace/app_metadata.py +14 -23
  150. office365/sharepoint/marketplace/sitecollection/appcatalog/allowed_item.py +6 -8
  151. office365/sharepoint/navigation/node.py +5 -8
  152. office365/sharepoint/permissions/irm/effective_settings.py +6 -8
  153. office365/sharepoint/permissions/irm/file_settings.py +8 -6
  154. office365/sharepoint/permissions/irm/settings.py +25 -43
  155. office365/sharepoint/portal/groups/site_manager.py +6 -7
  156. office365/sharepoint/publishing/embed_data_v1.py +8 -15
  157. office365/sharepoint/publishing/pages/campaign_publication.py +4 -3
  158. office365/sharepoint/publishing/primary_city_time.py +8 -9
  159. office365/sharepoint/publishing/video/service_discoverer.py +4 -3
  160. office365/sharepoint/pushnotifications/subscriber.py +11 -15
  161. office365/sharepoint/sharing/object_sharing_settings.py +24 -46
  162. office365/sharepoint/sharing/permission_information.py +5 -5
  163. office365/sharepoint/sharing/result.py +1 -0
  164. office365/sharepoint/sitedesigns/run.py +4 -3
  165. office365/sharepoint/sites/site.py +7 -16
  166. office365/sharepoint/taxonomy/field.py +32 -21
  167. office365/sharepoint/taxonomy/groups/group.py +12 -1
  168. office365/sharepoint/taxonomy/sets/set.py +6 -0
  169. office365/sharepoint/taxonomy/stores/store.py +4 -2
  170. office365/sharepoint/teams/channel.py +6 -6
  171. office365/sharepoint/tenant/administration/endpoints.py +4 -3
  172. office365/sharepoint/tenant/administration/hubsites/properties.py +4 -5
  173. office365/sharepoint/tenant/administration/sites/properties.py +0 -1
  174. office365/sharepoint/tenant/administration/spo_operation.py +4 -4
  175. office365/sharepoint/tenant/administration/tenant.py +1 -0
  176. office365/sharepoint/tenant/insights/report.py +11 -0
  177. office365/sharepoint/tenant/insights/report_manager.py +5 -0
  178. office365/sharepoint/tenant/insights/report_metadata.py +5 -0
  179. office365/sharepoint/tenant/settings.py +4 -3
  180. office365/sharepoint/translation/sync_translator.py +3 -2
  181. office365/sharepoint/ui/applicationpages/peoplepicker/entity_information.py +4 -4
  182. office365/sharepoint/usercustomactions/action.py +12 -20
  183. office365/sharepoint/userprofiles/followed_content.py +6 -10
  184. office365/sharepoint/userprofiles/people_manager.py +0 -1
  185. office365/sharepoint/userprofiles/person_properties.py +14 -30
  186. office365/sharepoint/userprofiles/personal_cache.py +4 -3
  187. office365/sharepoint/userprofiles/properties_for_user.py +4 -5
  188. office365/sharepoint/userprofiles/sharedwithme/document.py +12 -21
  189. office365/sharepoint/utilities/move_copy_util.py +19 -19
  190. office365/sharepoint/utilities/upload_status.py +7 -10
  191. office365/sharepoint/views/field_collection.py +9 -14
  192. office365/sharepoint/views/view.py +43 -64
  193. office365/sharepoint/webhooks/subscription.py +11 -19
  194. office365/sharepoint/webparts/webpart.py +3 -1
  195. office365/sharepoint/webs/modernize_homepage_result.py +4 -3
  196. office365/sharepoint/webs/regional_settings.py +9 -17
  197. office365/sharepoint/webs/template.py +3 -5
  198. office365/sharepoint/webs/web.py +14 -20
  199. office365/teams/operations/async_operation.py +5 -7
  200. office365/runtime/paths/item.py +0 -8
  201. {Office365_REST_Python_Client-2.5.5.dist-info → Office365_REST_Python_Client-2.5.6.dist-info}/LICENSE +0 -0
  202. {Office365_REST_Python_Client-2.5.5.dist-info → Office365_REST_Python_Client-2.5.6.dist-info}/WHEEL +0 -0
  203. {Office365_REST_Python_Client-2.5.5.dist-info → Office365_REST_Python_Client-2.5.6.dist-info}/top_level.txt +0 -0
@@ -3,3 +3,8 @@ from office365.runtime.client_value import ClientValue
3
3
 
4
4
  class WorkbookFilterCriteria(ClientValue):
5
5
  """Represents the filtering criteria applied to a column."""
6
+
7
+ def __init__(self, operator=None, values=None):
8
+ """ """
9
+ self.operator = operator
10
+ self.values = values
@@ -48,11 +48,14 @@ class WorkbookFunctions(Entity):
48
48
  def days(self, start_date, end_date):
49
49
  """Returns the number of days between two dates.
50
50
 
51
- :param datetime start_date: Two dates between which you want to know the number of days.
52
- :param datetime end_date: Two dates between which you want to know the number of days.
51
+ :param datetime.datetime start_date: Two dates between which you want to know the number of days.
52
+ :param datetime.datetime end_date: Two dates between which you want to know the number of days.
53
53
  """
54
54
  return_type = WorkbookFunctionResult(self.context)
55
- payload = {"startDate": start_date, "endDate": end_date}
55
+ payload = {
56
+ "startDate": start_date.isoformat() + "Z",
57
+ "endDate": end_date.isoformat() + "Z",
58
+ }
56
59
  qry = ServiceOperationQuery(self, "days", None, payload, None, return_type)
57
60
  self.context.add_query(qry)
58
61
  return return_type
@@ -2,6 +2,8 @@ from office365.entity import Entity
2
2
 
3
3
 
4
4
  class WorkbookFunctionResult(Entity):
5
+ """"""
6
+
5
7
  @property
6
8
  def value(self):
7
9
  return self.properties.get("value", None)
@@ -1,3 +1,5 @@
1
+ from typing import Optional
2
+
1
3
  from office365.entity import Entity
2
4
  from office365.onedrive.workbooks.operations.error import WorkbookOperationError
3
5
 
@@ -7,22 +9,17 @@ class WorkbookOperation(Entity):
7
9
 
8
10
  @property
9
11
  def error(self):
10
- """
11
- The error returned by the operation.
12
- """
12
+ """The error returned by the operation."""
13
13
  return self.properties.get("error", WorkbookOperationError())
14
14
 
15
15
  @property
16
16
  def resource_location(self):
17
- """The resource URI for the result.
18
- :rtype: str or None
19
- """
17
+ # type: () -> Optional[str]
18
+ """The resource URI for the result."""
20
19
  return self.properties.get("resourceLocation", None)
21
20
 
22
21
  @property
23
22
  def status(self):
24
- """
25
- The current status of the operation. Possible values are: NotStarted, Running, Completed, Failed.
26
- :rtype: str or None
27
- """
23
+ # type: () -> Optional[str]
24
+ """The current status of the operation. Possible values are: NotStarted, Running, Completed, Failed."""
28
25
  return self.properties.get("status", None)
@@ -1,3 +1,5 @@
1
+ from typing import Optional
2
+
1
3
  from office365.entity import Entity
2
4
  from office365.runtime.paths.resource_path import ResourcePath
3
5
  from office365.runtime.queries.service_operation import ServiceOperationQuery
@@ -6,27 +8,25 @@ from office365.runtime.queries.service_operation import ServiceOperationQuery
6
8
  class WorkbookPivotTable(Entity):
7
9
  """Represents an Excel PivotTable."""
8
10
 
11
+ def __str__(self):
12
+ return self.name or self.entity_type_name
13
+
9
14
  def refresh(self):
10
- """
11
- Refreshes the PivotTable.
12
- """
15
+ """Refreshes the PivotTable."""
13
16
  qry = ServiceOperationQuery(self, "refresh")
14
17
  self.context.add_query(qry)
15
18
  return self
16
19
 
17
20
  def refresh_all(self):
18
- """
19
- Refreshes the PivotTable within a given worksheet.
20
- """
21
+ """Refreshes the PivotTable within a given worksheet."""
21
22
  qry = ServiceOperationQuery(self, "refreshAll")
22
23
  self.context.add_query(qry)
23
24
  return self
24
25
 
25
26
  @property
26
27
  def name(self):
27
- """Name of the PivotTable.
28
- :rtype: str or None
29
- """
28
+ # type: () -> Optional[str]
29
+ """Name of the PivotTable."""
30
30
  return self.properties.get("Name", None)
31
31
 
32
32
  @property
@@ -9,12 +9,6 @@ class WorkbookWorksheetCollection(EntityCollection[WorkbookWorksheet]):
9
9
  context, WorkbookWorksheet, resource_path
10
10
  )
11
11
 
12
- def __getitem__(self, id_or_name):
13
- """
14
- :rtype: WorkbookWorksheet
15
- """
16
- return super(WorkbookWorksheetCollection, self).__getitem__(id_or_name)
17
-
18
12
  def add(self, name=None):
19
13
  """
20
14
  Adds a new worksheet to the workbook. The worksheet will be added at the end of existing worksheets.
@@ -2,4 +2,6 @@ from office365.entity import Entity
2
2
 
3
3
 
4
4
  class WorkbookWorksheetProtection(Entity):
5
+ """Represents the protection of a sheet object."""
6
+
5
7
  pass
@@ -1,3 +1,5 @@
1
+ from typing import Optional
2
+
1
3
  from office365.entity import Entity
2
4
  from office365.outlook.calendar.email_address import EmailAddress
3
5
  from office365.runtime.types.collections import StringCollection
@@ -37,28 +39,26 @@ class CalendarPermission(Entity):
37
39
 
38
40
  @property
39
41
  def is_inside_organization(self):
42
+ # type: () -> Optional[bool]
40
43
  """
41
- True if the user in context (sharee or delegate) is inside the same organization as the calendar owner.
42
- :rtype: bool or None
44
+ True if the user in context (sharee or delegate) is inside the same organization as the calendar owner
43
45
  """
44
46
  return self.properties.get("isInsideOrganization", None)
45
47
 
46
48
  @property
47
49
  def is_removable(self):
50
+ # type: () -> Optional[bool]
48
51
  """
49
52
  True if the user can be removed from the list of sharees or delegates for the specified calendar,
50
53
  false otherwise. The "My organization" user determines the permissions other people within your organization
51
54
  have to the given calendar. You cannot remove "My organization" as a sharee to a calendar.
52
- :rtype: bool or None
53
55
  """
54
56
  return self.properties.get("isRemovable", None)
55
57
 
56
58
  @property
57
59
  def role(self):
58
- """
59
- Current permission level of the calendar sharee or delegate.
60
- :rtype: str or None
61
- """
60
+ # type: () -> Optional[str]
61
+ """Current permission level of the calendar sharee or delegate."""
62
62
  return self.properties.get("role", None)
63
63
 
64
64
  def get_property(self, name, default_value=None):
@@ -1,3 +1,5 @@
1
+ from typing import Optional
2
+
1
3
  from office365.entity import Entity
2
4
  from office365.outlook.mail.physical_address import PhysicalAddress
3
5
 
@@ -8,9 +10,8 @@ class Place(Entity):
8
10
 
9
11
  @property
10
12
  def display_name(self):
11
- """The name associated with the place.
12
- :rtype: str or None
13
- """
13
+ # type: () -> Optional[str]
14
+ """The name associated with the place."""
14
15
  return self.properties.get("displayName", None)
15
16
 
16
17
  @property
@@ -20,5 +21,6 @@ class Place(Entity):
20
21
 
21
22
  @property
22
23
  def phone(self):
24
+ # type: () -> Optional[str]
23
25
  """The phone number of the place."""
24
26
  return self.properties.get("phone", None)
@@ -4,7 +4,10 @@ import requests
4
4
 
5
5
  from office365.entity_collection import EntityCollection
6
6
  from office365.outlook.mail.attachments.attachment import Attachment
7
+ from office365.runtime.client_result import ClientResult
7
8
  from office365.runtime.compat import parse_query_string
9
+ from office365.runtime.http.request_options import RequestOptions
10
+ from office365.runtime.odata.v4.upload_session import UploadSession
8
11
  from office365.runtime.odata.v4.upload_session_request import UploadSessionRequest
9
12
  from office365.runtime.queries.upload_session import UploadSessionQuery
10
13
 
@@ -60,13 +63,15 @@ class AttachmentCollection(EntityCollection[Attachment]):
60
63
  self, {"AttachmentItem": AttachmentItem.create_file(source_path)}
61
64
  )
62
65
 
63
- def _start_upload():
66
+ def _start_upload(result):
67
+ # type: (ClientResult[UploadSession]) -> None
64
68
  with open(source_path, "rb") as local_file:
65
69
  session_request = UploadSessionRequest(
66
70
  local_file, chunk_size, chunk_uploaded
67
71
  )
68
72
 
69
73
  def _construct_request(request):
74
+ # type: (RequestOptions) -> None
70
75
  auth_token = parse_query_string(request.url, "authtoken")
71
76
  request.set_header("Authorization", "Bearer {0}".format(auth_token))
72
77
 
@@ -103,7 +103,7 @@ class Message(OutlookItem):
103
103
  if a file that's smaller than 3 MB, then add_file_attachment method is utilized
104
104
 
105
105
  :param str file_path:
106
- :param ()->None chunk_uploaded: Upload action
106
+ :param (int)->None chunk_uploaded: Upload action
107
107
  """
108
108
  max_upload_chunk = 1000000 * 3
109
109
  file_size = os.stat(file_path).st_size
office365/reports/root.py CHANGED
@@ -72,6 +72,18 @@ class ReportRoot(Entity):
72
72
  self.context.add_query(qry)
73
73
  return qry.return_type
74
74
 
75
+ def get_email_app_usage_apps_user_counts(self, period):
76
+ """
77
+ Get the count of unique users per email app.
78
+
79
+ :param str period: Specifies the length of time over which the report is aggregated.
80
+ The supported values for {period_value} are: D7, D30, D90, and D180. These values follow the format
81
+ Dn where n represents the number of days over which the report is aggregated. Required.
82
+ """
83
+ qry = create_report_query(self, "getEmailAppUsageAppsUserCounts", period)
84
+ self.context.add_query(qry)
85
+ return qry.return_type
86
+
75
87
  def get_m365_app_user_counts(self, period=None):
76
88
  """
77
89
  Get a report that provides the trend in the number of active users for each app (Outlook, Word, Excel,
@@ -85,10 +97,7 @@ class ReportRoot(Entity):
85
97
  return return_type
86
98
 
87
99
  def get_office365_activations_user_counts(self):
88
- """
89
- Get the count of Microsoft 365 activations on desktops and devices.
90
-
91
- """
100
+ """Get the count of Microsoft 365 activations on desktops and devices."""
92
101
  qry = create_report_query(self, "getOffice365ActivationsUserCounts")
93
102
  self.context.add_query(qry)
94
103
  return qry.return_type
@@ -166,6 +175,19 @@ class ReportRoot(Entity):
166
175
  self.context.add_query(qry)
167
176
  return qry.return_type
168
177
 
178
+ def get_mailbox_usage_mailbox_counts(self, period):
179
+ """
180
+ Get the total number of user mailboxes in your organization and how many are active each day of the reporting
181
+ period. A mailbox is considered active if the user sent or read any email.
182
+
183
+ :param str period: Specifies the length of time over which the report is aggregated.
184
+ The supported values for {period_value} are: D7, D30, D90, and D180. These values follow the format
185
+ Dn where n represents the number of days over which the report is aggregated. Required.
186
+ """
187
+ qry = create_report_query(self, "getMailboxUsageMailboxCounts", period)
188
+ self.context.add_query(qry)
189
+ return qry.return_type
190
+
169
191
  def get_sharepoint_activity_pages(self, period):
170
192
  """
171
193
  Get the number of unique pages visited by users.
@@ -203,6 +225,30 @@ class ReportRoot(Entity):
203
225
  self.context.add_query(qry)
204
226
  return qry.return_type
205
227
 
228
+ def get_sharepoint_site_usage_detail(self, period):
229
+ """
230
+ Get details about SharePoint site usage.
231
+
232
+ :param str period: Specifies the length of time over which the report is aggregated.
233
+ The supported values for {period_value} are: D7, D30, D90, and D180. These values follow the format
234
+ Dn where n represents the number of days over which the report is aggregated. Required.
235
+ """
236
+ qry = create_report_query(self, "getSharePointSiteUsageDetail", period)
237
+ self.context.add_query(qry)
238
+ return qry.return_type
239
+
240
+ def get_sharepoint_site_usage_site_counts(self, period):
241
+ """
242
+ Get the trend of total and active site count during the reporting period.
243
+
244
+ :param str period: Specifies the length of time over which the report is aggregated.
245
+ The supported values for {period_value} are: D7, D30, D90, and D180. These values follow the format
246
+ Dn where n represents the number of days over which the report is aggregated. Required.
247
+ """
248
+ qry = create_report_query(self, "getSharePointSiteUsageSiteCounts", period)
249
+ self.context.add_query(qry)
250
+ return qry.return_type
251
+
206
252
  @property
207
253
  def authentication_methods(self):
208
254
  """Container for navigation properties for Azure AD authentication methods resources."""
@@ -10,7 +10,7 @@ from office365.runtime.http.request_options import RequestOptions
10
10
 
11
11
 
12
12
  class ACSTokenProvider(AuthenticationProvider, office365.logger.LoggerContext):
13
- def __init__(self, url, client_id, client_secret, environment='commercial'):
13
+ def __init__(self, url, client_id, client_secret, environment="commercial"):
14
14
  """
15
15
  Provider to acquire the access token from a Microsoft Azure Access Control Service (ACS)
16
16
 
@@ -65,7 +65,9 @@ class ACSTokenProvider(AuthenticationProvider, office365.logger.LoggerContext):
65
65
  self.SharePointPrincipal, target_host, target_realm
66
66
  )
67
67
  principal_id = self.get_formatted_principal(self._client_id, None, target_realm)
68
- sts_url = self.get_security_token_service_url(target_realm, environment=self._environment)
68
+ sts_url = self.get_security_token_service_url(
69
+ target_realm, environment=self._environment
70
+ )
69
71
  oauth2_request = {
70
72
  "grant_type": "client_credentials",
71
73
  "client_id": principal_id,
@@ -105,13 +107,14 @@ class ACSTokenProvider(AuthenticationProvider, office365.logger.LoggerContext):
105
107
 
106
108
  @staticmethod
107
109
  def get_security_token_service_url(realm, environment):
110
+ # type: (str, str) -> str
108
111
  if environment == "GCCH":
109
- return "https://login.microsoftonline.us/{0}/tokens/OAuth/2".format(
110
- realm
111
- )
112
+ return "https://login.microsoftonline.us/{0}/tokens/OAuth/2".format(realm)
112
113
  else:
113
- return "https://accounts.accesscontrol.windows.net/{0}/tokens/OAuth/2".format(
114
- realm
114
+ return (
115
+ "https://accounts.accesscontrol.windows.net/{0}/tokens/OAuth/2".format(
116
+ realm
117
+ )
115
118
  )
116
119
 
117
120
  def _get_authorization_header(self):
@@ -6,7 +6,6 @@ from office365.runtime.compat import timezone, urlparse
6
6
  class STSProfile(object):
7
7
  def __init__(self, authority_url, environment):
8
8
  """
9
-
10
9
  :type authority_url: str
11
10
  """
12
11
  self.authorityUrl = authority_url
@@ -7,6 +7,7 @@ from typing_extensions import Self
7
7
 
8
8
  from office365.runtime.client_runtime_context import ClientRuntimeContext
9
9
  from office365.runtime.client_value import ClientValue
10
+ from office365.runtime.http.request_options import RequestOptions
10
11
  from office365.runtime.odata.json_format import ODataJsonFormat
11
12
  from office365.runtime.odata.query_options import QueryOptions
12
13
  from office365.runtime.odata.type import ODataType
@@ -73,12 +74,16 @@ class ClientObject(Generic[T]):
73
74
  )
74
75
  return self
75
76
 
76
- def after_execute(self, action, *args, **kwargs):
77
- # type: (Callable[[Self, Any, Any], None], Any, Any) -> Self
78
- """
79
- Attach an event handler to client object which gets triggered after query is submitted to server
80
- """
81
- self._context.after_query_execute(action, self, *args, **kwargs)
77
+ def before_execute(self, action):
78
+ # type: (Callable[[RequestOptions], None]) -> Self
79
+ """Attach an event handler to client object which gets triggered after query is submitted to server"""
80
+ self.context.before_execute(action)
81
+ return self
82
+
83
+ def after_execute(self, action, execute_first=False):
84
+ # type: (Callable[[Self], None], bool) -> Self
85
+ """Attach an event handler to client object which gets triggered after query is submitted to server"""
86
+ self.context.after_query_execute(action, execute_first)
82
87
  return self
83
88
 
84
89
  def get(self):
@@ -138,13 +143,8 @@ class ClientObject(Generic[T]):
138
143
  return self._properties.get(name, default_value)
139
144
 
140
145
  def set_property(self, name, value, persist_changes=True):
141
- # type: (str, P_T, bool) -> Self
142
- """Sets property value
143
-
144
- :param str name: Property name
145
- :param P_T value: Property value
146
- :param bool persist_changes: Persist changes
147
- """
146
+ # type: (str|int, P_T, bool) -> Self
147
+ """Sets property value"""
148
148
  if persist_changes:
149
149
  self._ser_property_names.append(name)
150
150
 
@@ -187,7 +187,11 @@ class ClientObject(Generic[T]):
187
187
  from office365.runtime.queries.read_entity import ReadEntityQuery
188
188
 
189
189
  qry = ReadEntityQuery(self, names_to_include)
190
- self.context.add_query(qry).after_query_execute(action, *args, **kwargs)
190
+
191
+ def _after_loaded(return_type):
192
+ action(*args, **kwargs)
193
+
194
+ self.context.add_query(qry).after_query_execute(_after_loaded)
191
195
  else:
192
196
  action(*args, **kwargs)
193
197
  return self
@@ -1,4 +1,4 @@
1
- from typing import Any, Callable, Generic, Iterator, List, Optional, Type, TypeVar
1
+ from typing import Callable, Generic, Iterator, List, Optional, Type, TypeVar
2
2
 
3
3
  from typing_extensions import Self
4
4
 
@@ -147,12 +147,6 @@ class ClientObjectCollection(ClientObject, Generic[T]):
147
147
  self.top(page_size)
148
148
  return self
149
149
 
150
- def after_execute(self, action, *args, **kwargs):
151
- # type: (Callable[[Self, Any, Any], None], Any, Any) -> Self
152
- super(ClientObjectCollection, self).after_execute(action, *args, **kwargs)
153
- self._page_loaded += action
154
- return self
155
-
156
150
  def get(self):
157
151
  # type: () -> Self
158
152
 
@@ -160,39 +154,30 @@ class ClientObjectCollection(ClientObject, Generic[T]):
160
154
  # type: (Self) -> None
161
155
  self._page_loaded.notify(self)
162
156
 
163
- self.context.load(self, after_loaded=_loaded)
157
+ self.context.load(self).after_query_execute(_loaded)
164
158
  return self
165
159
 
166
160
  def get_all(self, page_size=None, page_loaded=None):
167
161
  # type: (int, Callable[[Self], None]) -> Self
168
162
  """Gets all the items in a collection, regardless of the size."""
169
163
 
170
- self.paged(page_size, page_loaded)
171
-
172
164
  def _page_loaded(col):
173
165
  # type: (Self) -> None
174
- self._page_loaded.notify(col)
175
166
  if self.has_next:
176
- self._get_next(after_loaded=_page_loaded)
167
+ self._get_next().after_execute(_page_loaded)
177
168
 
178
- self.context.load(self, after_loaded=_page_loaded)
169
+ self.paged(page_size, page_loaded).get().after_execute(_page_loaded)
179
170
  return self
180
171
 
181
- def _get_next(self, after_loaded=None):
182
- # type: (Optional[EventHandler]) -> Self
183
- """
184
- Submit a request to retrieve next collection of items
185
- :param (ClientObjectCollection) -> None after_loaded: Page loaded event
186
- """
172
+ def _get_next(self):
173
+ # type: () -> Self
174
+ """Submit a request to retrieve next collection of items"""
187
175
 
188
176
  def _construct_request(request):
189
177
  # type: (RequestOptions) -> None
190
178
  request.url = self._next_request_url
191
179
 
192
- self.context.load(
193
- self, before_loaded=_construct_request, after_loaded=after_loaded
194
- )
195
- return self
180
+ return self.get().before_execute(_construct_request)
196
181
 
197
182
  def first(self, expression):
198
183
  # type: (str) -> T
@@ -32,9 +32,7 @@ class ClientRequestException(RequestException):
32
32
 
33
33
  @property
34
34
  def message(self):
35
- """
36
- :rtype: str
37
- """
35
+ # type: () -> str
38
36
  if self.payload:
39
37
  error = self.payload.get("error")
40
38
  if error:
@@ -1,8 +1,10 @@
1
1
  import copy
2
- from typing import TYPE_CHECKING, Any, Callable, Generic, Optional, TypeVar
2
+ from typing import TYPE_CHECKING, Callable, Generic, Optional, TypeVar
3
3
 
4
4
  from typing_extensions import Self
5
5
 
6
+ from office365.runtime.http.request_options import RequestOptions
7
+
6
8
  if TYPE_CHECKING:
7
9
  from office365.runtime.client_runtime_context import ClientRuntimeContext # noqa
8
10
  from office365.runtime.client_value import ClientValue # noqa
@@ -19,21 +21,16 @@ class ClientResult(Generic[T]):
19
21
  self._context = context
20
22
  self._value = copy.deepcopy(default_value) # type: T
21
23
 
22
- def before_execute(self, action, *args, **kwargs):
23
- """
24
- Attach an event handler which is triggered before query is submitted to server
25
- :param (office365.runtime.http.request_options.RequestOptions) -> None action: Event handler
26
- """
27
- self._context.before_query_execute(action, *args, **kwargs)
24
+ def before_execute(self, action):
25
+ # type: (Callable[[RequestOptions], None]) -> Self
26
+ """Attach an event handler which is triggered before query is submitted to server"""
27
+ self._context.before_query_execute(action)
28
28
  return self
29
29
 
30
- def after_execute(self, action, *args, **kwargs):
31
- # type: (Callable[[Self], None], Any, Any) -> Self
32
- """
33
- Attach an event handler which is triggered after query is submitted to server
34
- :param (ClientResult) -> None action: Event handler
35
- """
36
- self._context.after_query_execute(action, self, *args, **kwargs)
30
+ def after_execute(self, action, execute_first=False):
31
+ # type: (Callable[[Self], None], bool) -> Self
32
+ """Attach an event handler which is triggered after query is submitted to server"""
33
+ self._context.after_query_execute(action, execute_first)
37
34
  return self
38
35
 
39
36
  def set_property(self, key, value, persist_changes=False):
@@ -1,8 +1,9 @@
1
1
  import abc
2
2
  from time import sleep
3
- from typing import TYPE_CHECKING, Any, AnyStr, Callable, List
3
+ from typing import TYPE_CHECKING, AnyStr, Callable, List
4
4
 
5
5
  import requests
6
+ from requests import Response
6
7
  from typing_extensions import Self
7
8
 
8
9
  from office365.runtime.client_request import ClientRequest
@@ -79,21 +80,11 @@ class ClientRuntimeContext(object):
79
80
  # type: () -> str
80
81
  pass
81
82
 
82
- def load(
83
- self,
84
- client_object,
85
- properties_to_retrieve=None,
86
- before_loaded=None,
87
- after_loaded=None,
88
- ):
89
- # type: (T, List[str], Callable[[RequestOptions], None], Callable[[T], None]) -> Self
83
+ def load(self, client_object, properties_to_retrieve=None):
84
+ # type: (T, List[str]) -> Self
90
85
  """Prepare retrieval query"""
91
86
  qry = ReadEntityQuery(client_object, properties_to_retrieve)
92
87
  self.add_query(qry)
93
- if callable(before_loaded):
94
- self.before_query_execute(before_loaded)
95
- if callable(after_loaded):
96
- self.after_query_execute(after_loaded, client_object)
97
88
  return self
98
89
 
99
90
  def before_query_execute(self, action, once=True):
@@ -135,34 +126,33 @@ class ClientRuntimeContext(object):
135
126
  self.pending_request().beforeExecute += _process_request
136
127
  return self
137
128
 
138
- def after_query_execute(self, action, *args, **kwargs):
139
- # type: (Callable[..., None], Any, Any) -> Self
129
+ def after_query_execute(self, action, execute_first=False):
130
+ # type: (Callable[[T], None], bool) -> Self
140
131
  """Attach an event handler which is triggered after query is submitted to server"""
141
132
  if len(self._queries) == 0:
142
133
  return
143
134
  query = self._queries[-1]
144
135
 
145
136
  def _process_response(resp):
146
- # type: (requests.Response) -> None
137
+ # type: (Response) -> None
147
138
  resp.raise_for_status()
148
139
  if self.current_query.id == query.id:
149
140
  self.pending_request().afterExecute -= _process_response
150
- action(*args, **kwargs)
141
+ action(query.return_type)
151
142
 
152
143
  self.pending_request().afterExecute += _process_response
153
144
 
154
- execute_first = kwargs.pop("execute_first", False)
155
145
  if execute_first and len(self._queries) > 1:
156
146
  self._queries.insert(0, self._queries.pop())
157
147
 
158
148
  return self
159
149
 
160
150
  def after_execute(self, action, once=True):
161
- # type: (Callable[[requests.Response], None], bool) -> Self
151
+ # type: (Callable[[Response], None], bool) -> Self
162
152
  """Attach an event handler which is triggered after request is submitted to server"""
163
153
 
164
154
  def _process_response(response):
165
- # type: (requests.Response) -> None
155
+ # type: (Response) -> None
166
156
  if once:
167
157
  self.pending_request().afterExecute -= _process_response
168
158
  action(response)
@@ -171,7 +161,7 @@ class ClientRuntimeContext(object):
171
161
  return self
172
162
 
173
163
  def execute_request_direct(self, path):
174
- # type: (str) -> requests.Response
164
+ # type: (str) -> Response
175
165
  full_url = "".join([self.service_root_url(), "/", path])
176
166
  request = RequestOptions(full_url)
177
167
  return self.pending_request().execute_request_direct(request)
@@ -24,15 +24,12 @@ class ODataJsonFormat(object):
24
24
 
25
25
  @property
26
26
  def media_type(self):
27
- """
28
- Gets media type
29
- :rtype: str
30
- """
27
+ # type: () -> str
28
+ """Gets media type"""
31
29
  raise NotImplementedError
32
30
 
33
31
  @property
34
32
  def include_control_information(self):
35
- """Determines whether control information that is represented as annotations should be included in payload
36
- :rtype: bool
37
- """
33
+ # type: () -> bool
34
+ """Determines whether control information that is represented as annotations should be included in payload"""
38
35
  raise NotImplementedError