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
@@ -1,3 +1,5 @@
1
+ from typing import Optional
2
+
1
3
  from office365.sharepoint.fields.field import Field
2
4
 
3
5
 
@@ -6,9 +8,6 @@ class FieldUrl(Field):
6
8
 
7
9
  @property
8
10
  def display_format(self):
9
- """
10
- Gets the number of decimal places to be used when displaying the field.
11
-
12
- :rtype: int or None
13
- """
11
+ # type: () -> Optional[int]
12
+ """Gets the number of decimal places to be used when displaying the field."""
14
13
  return self.properties.get("DisplayFormat", None)
@@ -1,3 +1,5 @@
1
+ from typing import Optional
2
+
1
3
  from office365.sharepoint.fields.lookup import FieldLookup
2
4
 
3
5
 
@@ -6,41 +8,40 @@ class FieldUser(FieldLookup):
6
8
 
7
9
  @property
8
10
  def presence(self):
9
- """Gets a value that specifies whether presence is enabled on the field.
10
-
11
- :rtype: bool or None
12
- """
11
+ # type: () -> Optional[bool]
12
+ """Gets a value that specifies whether presence is enabled on the field."""
13
13
  return self.properties.get("Presence", None)
14
14
 
15
15
  @presence.setter
16
16
  def presence(self, val):
17
+ # type: (bool) -> None
17
18
  """Sets a value that specifies whether presence is enabled on the field."""
18
19
  self.properties.get("Presence", val)
19
20
 
20
21
  @property
21
22
  def allow_display(self):
22
- """Gets a value that specifies whether to display the name of the user in a survey list.
23
-
24
- :rtype: bool or None
25
- """
23
+ # type: () -> Optional[bool]
24
+ """Gets a value that specifies whether to display the name of the user in a survey list."""
26
25
  return self.properties.get("AllowDisplay", None)
27
26
 
28
27
  @allow_display.setter
29
28
  def allow_display(self, val):
29
+ # type: (bool) -> None
30
30
  """Sets a value that specifies whether to display the name of the user in a survey list."""
31
31
  self.properties.get("AllowDisplay", val)
32
32
 
33
33
  @property
34
34
  def selection_group(self):
35
+ # type: () -> Optional[int]
35
36
  """
36
37
  Gets a value that specifies the identifier of the SharePoint group whose members can be selected
37
38
  as values of the field.
38
- :rtype: int or None
39
39
  """
40
40
  return self.properties.get("SelectionGroup", None)
41
41
 
42
42
  @selection_group.setter
43
43
  def selection_group(self, val):
44
+ # type: (int) -> None
44
45
  """Sets a value that specifies the identifier of the SharePoint group whose members can be selected as
45
46
  values of the field.
46
47
  """
@@ -45,7 +45,7 @@ class FileCollection(EntityCollection[File]):
45
45
  def upload_with_checksum(self, file_object, chunk_size=1024):
46
46
  # type: (IO, int) -> File
47
47
  """ """
48
- h = hashlib.sha1() # hashlib.md5()
48
+ h = hashlib.md5()
49
49
  file_name = os.path.basename(file_object.name)
50
50
  upload_id = str(uuid.uuid4())
51
51
 
@@ -53,9 +53,10 @@ class FileCollection(EntityCollection[File]):
53
53
  # type: (File) -> None
54
54
  content = file_object.read(chunk_size)
55
55
  h.update(content)
56
+
56
57
  return_type.upload_with_checksum(
57
58
  upload_id, h.hexdigest(), content
58
- ).after_execute(_upload_session)
59
+ ) # .after_execute(_upload_session)
59
60
 
60
61
  return self.add(file_name, None, True).after_execute(_upload_session)
61
62
 
@@ -80,37 +81,38 @@ class FileCollection(EntityCollection[File]):
80
81
  file_name = file_name if file_name else os.path.basename(file.name)
81
82
  upload_id = str(uuid.uuid4())
82
83
 
83
- def _upload_session(return_type, return_file):
84
- # type: (File|ClientResult, File) -> None
85
- if return_file is None:
86
- return_file = return_type
84
+ def _upload(return_type):
85
+ # type: (File) -> None
86
+
87
+ def _after_uploaded(result):
88
+ # type: (ClientResult) -> None
89
+ _upload(return_type)
87
90
 
88
91
  uploaded_bytes = file.tell()
89
92
  if callable(chunk_uploaded):
90
93
  chunk_uploaded(uploaded_bytes, **kwargs)
91
94
 
95
+ content = file.read(chunk_size)
92
96
  if uploaded_bytes == file_size:
93
97
  if auto_close and not file.closed:
94
98
  file.close()
95
99
  return
96
100
 
97
- content = file.read(chunk_size)
98
-
99
101
  if uploaded_bytes == 0:
100
- return_file.start_upload(upload_id, content).after_execute(
101
- _upload_session, return_file
102
+ return_type.start_upload(upload_id, content).after_execute(
103
+ _after_uploaded
102
104
  )
103
105
  elif uploaded_bytes + len(content) < file_size:
104
- return_file.continue_upload(
106
+ return_type.continue_upload(
105
107
  upload_id, uploaded_bytes, content
106
- ).after_execute(_upload_session, return_file)
108
+ ).after_execute(_after_uploaded)
107
109
  else:
108
- return_file.finish_upload(
110
+ return_type.finish_upload(
109
111
  upload_id, uploaded_bytes, content
110
- ).after_execute(_upload_session, return_file)
112
+ ).after_execute(_upload)
111
113
 
112
114
  if file_size > chunk_size:
113
- return self.add(file_name, None, True).after_execute(_upload_session, None)
115
+ return self.add(file_name, None, True).after_execute(_upload)
114
116
  else:
115
117
  return self.add(file_name, file.read(), True)
116
118
 
@@ -59,10 +59,7 @@ class File(AbstractFile):
59
59
  or a file in a folder."""
60
60
 
61
61
  def __repr__(self):
62
- if self.server_relative_path:
63
- return repr(self.server_relative_path)
64
- else:
65
- return self.serverRelativeUrl or self.unique_id or self.entity_type_name
62
+ return self.serverRelativeUrl or self.unique_id or self.entity_type_name
66
63
 
67
64
  def __str__(self):
68
65
  return self.name or self.entity_type_name
@@ -132,6 +129,19 @@ class File(AbstractFile):
132
129
  self.context.add_query(qry)
133
130
  return return_type
134
131
 
132
+ def get_pre_authorized_access_url(self, expiration_hours):
133
+ # type: (int) -> ClientResult[str]
134
+ """Returns a link for downloading the file without authentication.
135
+ :param int expiration_hours: The number of hours until the link expires. If the maximum expiration time
136
+ defined in the web application is less than the specified expiration time, the maximum expiration time
137
+ takes precedence.
138
+ """
139
+ return_type = ClientResult(self.context, str())
140
+ params = {"expirationHours": expiration_hours}
141
+ qry = FunctionQuery(self, "GetPreAuthorizedAccessUrl", params, return_type)
142
+ self.context.add_query(qry)
143
+ return return_type
144
+
135
145
  def get_absolute_url(self):
136
146
  # type: () -> ClientResult[str]
137
147
  """Gets absolute url of a File"""
@@ -332,19 +342,18 @@ class File(AbstractFile):
332
342
  :param int flag: Specifies the kind of move operation.
333
343
  """
334
344
 
335
- def _update_file(return_type, new_file_url):
336
- return_type.set_property("ServerRelativeUrl", new_file_url)
337
-
338
345
  def _moveto(destination_folder):
339
- """
340
- :type destination_folder: Folder
341
- """
342
- file_path = "/".join([str(destination_folder.serverRelativeUrl), self.name])
346
+ # type: (Folder) -> None
347
+ file_url = "/".join([str(destination_folder.serverRelativeUrl), self.name])
343
348
 
344
- params = {"newurl": file_path, "flags": flag}
349
+ params = {"newurl": file_url, "flags": flag}
345
350
  qry = ServiceOperationQuery(self, "moveto", params)
346
351
  self.context.add_query(qry)
347
- self.context.after_query_execute(_update_file, self, file_path)
352
+
353
+ def _update_file(return_type):
354
+ self.set_property("ServerRelativeUrl", file_url)
355
+
356
+ self.context.after_query_execute(_update_file)
348
357
 
349
358
  def _source_file_resolved():
350
359
  if isinstance(destination, Folder):
@@ -366,10 +375,6 @@ class File(AbstractFile):
366
375
  :param int flag: Specifies the kind of move operation.
367
376
  """
368
377
 
369
- def _update_file(return_type, new_file_url):
370
- # type: (File, str) -> None
371
- return_type.set_property("ServerRelativePath", new_file_url)
372
-
373
378
  def _move_to_using_path(destination_folder):
374
379
  # type: (Folder) -> None
375
380
  file_path = "/".join(
@@ -377,9 +382,12 @@ class File(AbstractFile):
377
382
  )
378
383
  params = {"DecodedUrl": file_path, "moveOperations": flag}
379
384
  qry = ServiceOperationQuery(self, "MoveToUsingPath", params)
380
- self.context.add_query(qry).after_query_execute(
381
- _update_file, self, file_path
382
- )
385
+
386
+ def _update_file(return_type):
387
+ # type: (File) -> None
388
+ self.set_property("ServerRelativePath", file_path)
389
+
390
+ self.context.add_query(qry).after_query_execute(_update_file)
383
391
 
384
392
  def _source_file_resolved():
385
393
  if isinstance(destination, Folder):
@@ -493,6 +501,7 @@ class File(AbstractFile):
493
501
  return return_type
494
502
 
495
503
  def upload_with_checksum(self, upload_id, checksum, stream):
504
+ # type: (str, str, bytes) -> File
496
505
  """
497
506
  :param str upload_id: The upload session ID.
498
507
  :param str checksum:
@@ -924,9 +933,7 @@ class File(AbstractFile):
924
933
 
925
934
  @property
926
935
  def parent_folder(self):
927
- """
928
- :rtype: office365.sharepoint.folders.folder.Folder
929
- """
936
+ # type: () -> Optional[Folder]
930
937
  if self.parent_collection is None:
931
938
  return None
932
939
  return self.parent_collection.parent
@@ -1,7 +1,10 @@
1
+ import os
2
+
1
3
  from office365.runtime.paths.service_operation import ServiceOperationPath
2
4
  from office365.runtime.paths.v3.entity import EntityPath
3
5
  from office365.runtime.queries.service_operation import ServiceOperationQuery
4
6
  from office365.sharepoint.entity_collection import EntityCollection
7
+ from office365.sharepoint.folders.coloring_information import FolderColoringInformation
5
8
  from office365.sharepoint.folders.folder import Folder
6
9
  from office365.sharepoint.types.resource_path import ResourcePath as SPResPath
7
10
 
@@ -42,14 +45,28 @@ class FolderCollection(EntityCollection[Folder]):
42
45
  folder = folder.add(name)
43
46
  return folder
44
47
 
45
- def add(self, name):
48
+ def add(self, name, color_hex=None):
46
49
  """Adds the folder that is located at the specified URL to the collection.
47
- :param str name: Specifies the Name of the folder.
50
+ :param str name: Specifies the Name or Path of the folder.
51
+ :param str color_hex: Specifies the color of the folder.
48
52
  """
49
53
  return_type = Folder(self.context, EntityPath(name, self.resource_path))
50
- self.add_child(return_type)
51
- qry = ServiceOperationQuery(self, "Add", [name], None, None, return_type)
52
- self.context.add_query(qry)
54
+ if color_hex:
55
+
56
+ def _add_coloring():
57
+ path = os.path.join(
58
+ self.parent.properties.get("ServerRelativeUrl"), name
59
+ )
60
+ coloring_info = FolderColoringInformation(color_hex=color_hex)
61
+ self.context.folder_coloring.create_folder(
62
+ path, coloring_info, return_type=return_type
63
+ )
64
+
65
+ self.parent.ensure_property("ServerRelativeUrl", _add_coloring)
66
+ else:
67
+ self.add_child(return_type)
68
+ qry = ServiceOperationQuery(self, "Add", [name], None, None, return_type)
69
+ self.context.add_query(qry)
53
70
  return return_type
54
71
 
55
72
  def get_by_url(self, url):
@@ -1,6 +1,10 @@
1
+ from typing_extensions import Self
2
+
1
3
  from office365.runtime.queries.service_operation import ServiceOperationQuery
2
4
  from office365.sharepoint.entity import Entity
5
+ from office365.sharepoint.folders.coloring_information import FolderColoringInformation
3
6
  from office365.sharepoint.folders.folder import Folder
7
+ from office365.sharepoint.types.resource_path import ResourcePath as SPResPath
4
8
 
5
9
 
6
10
  class FolderColoring(Entity):
@@ -9,22 +13,19 @@ class FolderColoring(Entity):
9
13
  def create_folder(
10
14
  self,
11
15
  decoded_url,
12
- ensure_unique_file_name=True,
13
- overwrite=True,
14
- coloring_information=None,
16
+ coloring_information=FolderColoringInformation(color_hex="1"),
17
+ return_type=None,
15
18
  ):
16
19
  """
17
20
  :param str decoded_url:
18
- :param bool ensure_unique_file_name:
19
- :param bool overwrite:
20
21
  :param FolderColoringInformation coloring_information:
22
+ :param Folder return_type: Return type
21
23
  """
22
- return_type = Folder(self.context)
24
+ if return_type is None:
25
+ return_type = Folder(self.context)
23
26
 
24
27
  payload = {
25
- "DecodedUrl": decoded_url,
26
- "EnsureUniqueFileName": ensure_unique_file_name,
27
- "Overwrite": overwrite,
28
+ "path": SPResPath(decoded_url),
28
29
  "coloringInformation": coloring_information,
29
30
  }
30
31
  qry = ServiceOperationQuery(
@@ -34,6 +35,7 @@ class FolderColoring(Entity):
34
35
  return return_type
35
36
 
36
37
  def stamp_color(self, decoded_url, coloring_information):
38
+ # type: (str, FolderColoringInformation) -> Self
37
39
  """
38
40
  :param str decoded_url:
39
41
  :param FolderColoringInformation coloring_information:
@@ -1,6 +1,40 @@
1
1
  from office365.runtime.client_value import ClientValue
2
2
 
3
3
 
4
+ class FolderColors(object):
5
+ Yellow = "#FFCE3C"
6
+
7
+ Grey = "#B0B7BA"
8
+
9
+ DarkRed = "#E73E29"
10
+
11
+ LightRed = "#FFBCB2"
12
+
13
+ DarkOrange = "#EE7110"
14
+
15
+ LightOrange = "#FFBF84"
16
+
17
+ DarkGreen = "#3F9F4A"
18
+
19
+ LightGreen = "#8ED290"
20
+
21
+ DarkTeal = "#27938E"
22
+
23
+ LightTeal = "#7AD1CD"
24
+
25
+ DarkBlue = "#1E84D0"
26
+
27
+ LightBlue = "#86C8F7"
28
+
29
+ DarkPurple = "#9A61C7"
30
+
31
+ LightPurple = "#D4AFF6"
32
+
33
+ DarkPink = "#CC53B4"
34
+
35
+ LightPink = "#F7AAE7"
36
+
37
+
4
38
  class FolderColoringInformation(ClientValue):
5
39
  """"""
6
40
 
@@ -13,3 +47,7 @@ class FolderColoringInformation(ClientValue):
13
47
  self.ColorHex = color_hex
14
48
  self.ColorTag = color_tag
15
49
  self.Emoji = emoji
50
+
51
+ @property
52
+ def entity_type_name(self):
53
+ return "SP.FolderColoringInformation"
@@ -30,7 +30,7 @@ class Folder(Entity):
30
30
  """Represents a folder in a SharePoint Web site."""
31
31
 
32
32
  def __str__(self):
33
- return self.name
33
+ return self.name or self.entity_type_name
34
34
 
35
35
  def __repr__(self):
36
36
  return self.serverRelativeUrl or self.unique_id or self.entity_type_name
@@ -69,14 +69,14 @@ class Folder(Entity):
69
69
 
70
70
  return_type = FolderCollection(self.context, self.folders.resource_path, self)
71
71
 
72
- def _loaded(parent):
72
+ def _get_folders(parent):
73
73
  # type: ("Folder") -> None
74
74
  [return_type.add_child(f) for f in parent.folders]
75
75
  if recursive:
76
76
  for folder in parent.folders:
77
- folder.ensure_properties(["Folders"], _loaded, parent=folder)
77
+ folder.ensure_properties(["Folders"], _get_folders, parent=folder)
78
78
 
79
- self.ensure_properties(["Folders"], _loaded, parent=self)
79
+ self.ensure_properties(["Folders"], _get_folders, parent=self)
80
80
  return return_type
81
81
 
82
82
  def get_files(self, recursive=False):
@@ -88,16 +88,16 @@ class Folder(Entity):
88
88
 
89
89
  return_type = FileCollection(self.context, self.files.resource_path, self)
90
90
 
91
- def _loaded(parent):
91
+ def _get_files(parent):
92
92
  # type: ("Folder") -> None
93
93
  [return_type.add_child(f) for f in parent.files]
94
94
  if recursive:
95
95
  for folder in parent.folders:
96
96
  folder.ensure_properties(
97
- ["Files", "Folders"], _loaded, parent=folder
97
+ ["Files", "Folders"], _get_files, parent=folder
98
98
  )
99
99
 
100
- self.ensure_properties(["Files", "Folders"], _loaded, parent=self)
100
+ self.ensure_properties(["Files", "Folders"], _get_files, parent=self)
101
101
  return return_type
102
102
 
103
103
  def get_sharing_information(self):
@@ -115,18 +115,17 @@ class Folder(Entity):
115
115
  where to move a folder.
116
116
  """
117
117
 
118
- def _update_folder(url):
119
- self.set_property("ServerRelativeUrl", url)
120
-
121
118
  def _move_to(destination_folder):
122
119
  # type: ("Folder") -> None
123
120
  destination_url = "/".join(
124
121
  [destination_folder.serverRelativeUrl, self.name]
125
122
  )
126
123
  qry = ServiceOperationQuery(self, "MoveTo", {"newUrl": destination_url})
127
- self.context.add_query(qry).after_query_execute(
128
- _update_folder, destination_url
129
- )
124
+
125
+ def _update_folder(return_type):
126
+ self.set_property("ServerRelativeUrl", destination_url)
127
+
128
+ self.context.add_query(qry).after_query_execute(_update_folder)
130
129
 
131
130
  def _source_folder_resolved():
132
131
  if isinstance(destination, Folder):
@@ -146,21 +145,20 @@ class Folder(Entity):
146
145
  where to move a folder.
147
146
  """
148
147
 
149
- def _update_folder(url):
150
- self.set_property("ServerRelativePath", url)
151
-
152
148
  def _move_to_using_path(destination_folder):
153
149
  # type: ("Folder") -> None
154
- destination_url = "/".join(
150
+ destination_path = "/".join(
155
151
  [str(destination_folder.server_relative_path), self.name]
156
152
  )
157
153
  qry = ServiceOperationQuery(
158
- self, "MoveToUsingPath", {"DecodedUrl": destination_url}
159
- )
160
- self.context.add_query(qry).after_query_execute(
161
- _update_folder, destination_url
154
+ self, "MoveToUsingPath", {"DecodedUrl": destination_path}
162
155
  )
163
156
 
157
+ def _update_folder(url):
158
+ self.set_property("ServerRelativePath", destination_path)
159
+
160
+ self.context.add_query(qry).after_query_execute(_update_folder)
161
+
164
162
  def _source_folder_resolved():
165
163
  if isinstance(destination, Folder):
166
164
  destination.ensure_property(
@@ -487,7 +485,9 @@ class Folder(Entity):
487
485
 
488
486
  return self.properties.get(
489
487
  "Folders",
490
- FolderCollection(self.context, ResourcePath("Folders", self.resource_path)),
488
+ FolderCollection(
489
+ self.context, ResourcePath("Folders", self.resource_path), self
490
+ ),
491
491
  )
492
492
 
493
493
  @property
@@ -1,3 +1,5 @@
1
+ from typing import Optional
2
+
1
3
  from office365.runtime.paths.resource_path import ResourcePath
2
4
  from office365.sharepoint.entity import Entity
3
5
  from office365.sharepoint.entity_collection import EntityCollection
@@ -9,24 +11,19 @@ class LikedByInformation(Entity):
9
11
 
10
12
  @property
11
13
  def like_count(self):
12
- """
13
- Number of users that have liked the item.
14
-
15
- :rtype: int or None
16
- """
14
+ # type: () -> Optional[int]
15
+ """Number of users that have liked the item."""
17
16
  return self.properties.get("LikeCount", None)
18
17
 
19
18
  @property
20
19
  def is_liked_by_user(self):
21
- """
22
- MUST be TRUE if the current user has liked the list item.
23
-
24
- :rtype: bool or None
25
- """
20
+ # type: () -> Optional[bool]
21
+ """MUST be TRUE if the current user has liked the list item."""
26
22
  return self.properties.get("isLikedByUser", None)
27
23
 
28
24
  @property
29
25
  def liked_by(self):
26
+ # type: () -> EntityCollection[UserEntity]
30
27
  """
31
28
  List of like entries corresponding to individual likes. MUST NOT contain more than one entry
32
29
  for the same user in the set.
@@ -1,3 +1,5 @@
1
+ from typing import Optional
2
+
1
3
  from office365.sharepoint.entity import Entity
2
4
 
3
5
 
@@ -6,16 +8,12 @@ class UserEntity(Entity):
6
8
 
7
9
  @property
8
10
  def creation_date(self):
9
- """
10
- The Datetime of the like.
11
- """
11
+ # type: () -> Optional[str]
12
+ """The Datetime of the like."""
12
13
  return self.properties.get("creationDate", None)
13
14
 
14
15
  @property
15
16
  def email(self):
16
- """
17
- The email of the user who liked the item.
18
-
19
- :rtype: str
20
- """
17
+ # type: () -> Optional[str]
18
+ """The email of the user who liked the item."""
21
19
  return self.properties.get("email", None)
@@ -7,7 +7,14 @@ from office365.sharepoint.fields.lookup_value import FieldLookupValue
7
7
  class ListItemFormUpdateValue(ClientValue):
8
8
  """Specifies the properties of a list item field and its value."""
9
9
 
10
- def __init__(self, name=None, value=None, has_exception=None, error_code=None):
10
+ def __init__(
11
+ self,
12
+ name=None,
13
+ value=None,
14
+ has_exception=None,
15
+ error_code=None,
16
+ error_message=None,
17
+ ):
11
18
  """
12
19
  :param str name: Specifies the field internal name for a field.
13
20
  :param str value: Specifies a value for a field.
@@ -19,6 +26,15 @@ class ListItemFormUpdateValue(ClientValue):
19
26
  self.FieldValue = value
20
27
  self.HasException = has_exception
21
28
  self.ErrorCode = error_code
29
+ self.ErrorMessage = error_message
30
+
31
+ def __repr__(self):
32
+ if self.HasException:
33
+ return "{0} update failed: Message: {1}".format(
34
+ self.FieldName, self.ErrorMessage
35
+ )
36
+ else:
37
+ return "{0} update succeeded".format(self.FieldName)
22
38
 
23
39
  def to_json(self, json_format=None):
24
40
  json = super(ListItemFormUpdateValue, self).to_json(json_format)
@@ -212,13 +212,13 @@ class ListItem(SecurableObject):
212
212
 
213
213
  def _picker_value_resolved(picker_result):
214
214
  # type: (ClientResult) -> None
215
- file_abs_url = self.get_property("EncodedAbsUrl")
215
+ abs_url = self.get_property("EncodedAbsUrl")
216
216
  picker_value = "[{0}]".format(picker_result.value)
217
217
  from office365.sharepoint.webs.web import Web
218
218
 
219
219
  Web.share_object(
220
220
  self.context,
221
- file_abs_url,
221
+ abs_url,
222
222
  picker_value,
223
223
  role_values[share_option],
224
224
  0,
@@ -1,3 +1,5 @@
1
+ from typing import Optional
2
+
1
3
  from office365.runtime.client_value_collection import ClientValueCollection
2
4
  from office365.sharepoint.entity import Entity
3
5
 
@@ -7,15 +9,11 @@ class ListBloomFilter(Entity):
7
9
 
8
10
  @property
9
11
  def bloom_filter_size(self):
10
- """
11
- The length of the Bloom Filter
12
- :rtype: int or None
13
- """
12
+ # type: () -> Optional[int]
13
+ """The length of the Bloom Filter"""
14
14
  return self.properties.get("BloomFilterSize", None)
15
15
 
16
16
  @property
17
17
  def index_map(self):
18
- """
19
- Specifies a list of bloom indexes for item.
20
- """
18
+ """Specifies a list of bloom indexes for item."""
21
19
  return self.properties.get("IndexMap", ClientValueCollection(int))