smartsheet-python-sdk 3.5.5__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 (195) hide show
  1. smartsheet/__init__.py +37 -0
  2. smartsheet/attachments.py +565 -0
  3. smartsheet/cells.py +164 -0
  4. smartsheet/contacts.py +78 -0
  5. smartsheet/discussions.py +411 -0
  6. smartsheet/events.py +79 -0
  7. smartsheet/exceptions.py +130 -0
  8. smartsheet/favorites.py +116 -0
  9. smartsheet/folders.py +438 -0
  10. smartsheet/groups.py +186 -0
  11. smartsheet/home.py +180 -0
  12. smartsheet/images.py +61 -0
  13. smartsheet/models/__init__.py +126 -0
  14. smartsheet/models/access_token.py +95 -0
  15. smartsheet/models/account.py +77 -0
  16. smartsheet/models/alternate_email.py +88 -0
  17. smartsheet/models/asset_share.py +165 -0
  18. smartsheet/models/asset_shares_paginated_result.py +84 -0
  19. smartsheet/models/attachment.py +181 -0
  20. smartsheet/models/auto_number_format.py +81 -0
  21. smartsheet/models/automation_action.py +162 -0
  22. smartsheet/models/automation_rule.py +164 -0
  23. smartsheet/models/boolean_object_value.py +38 -0
  24. smartsheet/models/bulk_item_failure.py +77 -0
  25. smartsheet/models/bulk_item_result.py +111 -0
  26. smartsheet/models/cell.py +193 -0
  27. smartsheet/models/cell_data_item.py +152 -0
  28. smartsheet/models/cell_history.py +67 -0
  29. smartsheet/models/cell_link.py +91 -0
  30. smartsheet/models/cell_link_widget_content.py +101 -0
  31. smartsheet/models/chart_widget_content.py +124 -0
  32. smartsheet/models/column.py +253 -0
  33. smartsheet/models/comment.py +126 -0
  34. smartsheet/models/contact.py +88 -0
  35. smartsheet/models/contact_object_value.py +59 -0
  36. smartsheet/models/container_destination.py +74 -0
  37. smartsheet/models/copy_or_move_row_destination.py +54 -0
  38. smartsheet/models/copy_or_move_row_directive.py +64 -0
  39. smartsheet/models/copy_or_move_row_result.py +67 -0
  40. smartsheet/models/criteria.py +82 -0
  41. smartsheet/models/cross_sheet_reference.py +134 -0
  42. smartsheet/models/currency.py +64 -0
  43. smartsheet/models/date_object_value.py +56 -0
  44. smartsheet/models/datetime_object_value.py +56 -0
  45. smartsheet/models/discussion.py +183 -0
  46. smartsheet/models/downloaded_file.py +106 -0
  47. smartsheet/models/duration.py +112 -0
  48. smartsheet/models/email.py +82 -0
  49. smartsheet/models/enums/__init__.py +56 -0
  50. smartsheet/models/enums/access_level.py +26 -0
  51. smartsheet/models/enums/asset_type.py +10 -0
  52. smartsheet/models/enums/attachment_parent_type.py +23 -0
  53. smartsheet/models/enums/attachment_sub_type.py +26 -0
  54. smartsheet/models/enums/attachment_type.py +29 -0
  55. smartsheet/models/enums/automation_action_frequency.py +24 -0
  56. smartsheet/models/enums/automation_action_type.py +23 -0
  57. smartsheet/models/enums/automation_rule_disabled_reason.py +27 -0
  58. smartsheet/models/enums/cell_link_status.py +28 -0
  59. smartsheet/models/enums/column_type.py +31 -0
  60. smartsheet/models/enums/criteria_target.py +21 -0
  61. smartsheet/models/enums/cross_sheet_reference_status.py +28 -0
  62. smartsheet/models/enums/currency_code.py +43 -0
  63. smartsheet/models/enums/day_descriptors.py +30 -0
  64. smartsheet/models/enums/day_ordinal.py +25 -0
  65. smartsheet/models/enums/event_action.py +76 -0
  66. smartsheet/models/enums/event_obejct_type.py +34 -0
  67. smartsheet/models/enums/event_source.py +27 -0
  68. smartsheet/models/enums/global_template.py +23 -0
  69. smartsheet/models/enums/operator.py +62 -0
  70. smartsheet/models/enums/paper_type.py +29 -0
  71. smartsheet/models/enums/predecessor_type.py +24 -0
  72. smartsheet/models/enums/publish_accessible_by.py +22 -0
  73. smartsheet/models/enums/schedule_type.py +25 -0
  74. smartsheet/models/enums/seat_type.py +17 -0
  75. smartsheet/models/enums/share_scope.py +22 -0
  76. smartsheet/models/enums/share_type.py +22 -0
  77. smartsheet/models/enums/sheet_email_format.py +23 -0
  78. smartsheet/models/enums/sheet_filter_operator.py +22 -0
  79. smartsheet/models/enums/sheet_filter_type.py +23 -0
  80. smartsheet/models/enums/sort_direction.py +22 -0
  81. smartsheet/models/enums/symbol.py +45 -0
  82. smartsheet/models/enums/system_column_type.py +25 -0
  83. smartsheet/models/enums/update_request_status.py +23 -0
  84. smartsheet/models/enums/user_status.py +23 -0
  85. smartsheet/models/enums/widget_type.py +32 -0
  86. smartsheet/models/error.py +74 -0
  87. smartsheet/models/error_result.py +117 -0
  88. smartsheet/models/event.py +153 -0
  89. smartsheet/models/event_result.py +86 -0
  90. smartsheet/models/explicit_null.py +24 -0
  91. smartsheet/models/favorite.py +81 -0
  92. smartsheet/models/folder.py +177 -0
  93. smartsheet/models/font_family.py +63 -0
  94. smartsheet/models/format_details.py +55 -0
  95. smartsheet/models/format_tables.py +191 -0
  96. smartsheet/models/group.py +134 -0
  97. smartsheet/models/group_member.py +104 -0
  98. smartsheet/models/home.py +110 -0
  99. smartsheet/models/hyperlink.py +81 -0
  100. smartsheet/models/image.py +101 -0
  101. smartsheet/models/image_url.py +91 -0
  102. smartsheet/models/image_url_map.py +68 -0
  103. smartsheet/models/image_widget_content.py +117 -0
  104. smartsheet/models/index_result.py +118 -0
  105. smartsheet/models/json_object.py +59 -0
  106. smartsheet/models/multi_contact_object_value.py +49 -0
  107. smartsheet/models/multi_picklist_object_value.py +48 -0
  108. smartsheet/models/multi_row_email.py +60 -0
  109. smartsheet/models/number_object_value.py +38 -0
  110. smartsheet/models/o_auth_error.py +86 -0
  111. smartsheet/models/object_value.py +130 -0
  112. smartsheet/models/paginated_children_result.py +80 -0
  113. smartsheet/models/predecessor.py +102 -0
  114. smartsheet/models/predecessor_list.py +49 -0
  115. smartsheet/models/primitive_object_value.py +59 -0
  116. smartsheet/models/profile_image.py +72 -0
  117. smartsheet/models/project_settings.py +89 -0
  118. smartsheet/models/recipient.py +63 -0
  119. smartsheet/models/report.py +90 -0
  120. smartsheet/models/report_cell.py +59 -0
  121. smartsheet/models/report_column.py +67 -0
  122. smartsheet/models/report_publish.py +95 -0
  123. smartsheet/models/report_row.py +68 -0
  124. smartsheet/models/report_widget_content.py +78 -0
  125. smartsheet/models/result.py +105 -0
  126. smartsheet/models/row.py +336 -0
  127. smartsheet/models/row_email.py +83 -0
  128. smartsheet/models/row_mapping.py +77 -0
  129. smartsheet/models/schedule.py +140 -0
  130. smartsheet/models/scope.py +70 -0
  131. smartsheet/models/search_result.py +67 -0
  132. smartsheet/models/search_result_item.py +150 -0
  133. smartsheet/models/selection_range.py +86 -0
  134. smartsheet/models/sent_update_request.py +172 -0
  135. smartsheet/models/server_info.py +67 -0
  136. smartsheet/models/share.py +183 -0
  137. smartsheet/models/sheet.py +462 -0
  138. smartsheet/models/sheet_email.py +81 -0
  139. smartsheet/models/sheet_filter.py +106 -0
  140. smartsheet/models/sheet_filter_details.py +76 -0
  141. smartsheet/models/sheet_publish.py +184 -0
  142. smartsheet/models/sheet_summary.py +59 -0
  143. smartsheet/models/sheet_user_permissions.py +58 -0
  144. smartsheet/models/sheet_user_settings.py +72 -0
  145. smartsheet/models/shortcut_data_item.py +102 -0
  146. smartsheet/models/shortcut_widget_content.py +61 -0
  147. smartsheet/models/sight.py +175 -0
  148. smartsheet/models/sight_publish.py +77 -0
  149. smartsheet/models/sort_criterion.py +64 -0
  150. smartsheet/models/sort_specifier.py +55 -0
  151. smartsheet/models/source.py +83 -0
  152. smartsheet/models/string_object_value.py +38 -0
  153. smartsheet/models/summary_field.py +256 -0
  154. smartsheet/models/template.py +171 -0
  155. smartsheet/models/title_rich_text_widget_content.py +68 -0
  156. smartsheet/models/token_paginated_result.py +79 -0
  157. smartsheet/models/update_request.py +110 -0
  158. smartsheet/models/user.py +58 -0
  159. smartsheet/models/user_model.py +280 -0
  160. smartsheet/models/user_plan.py +77 -0
  161. smartsheet/models/user_profile.py +89 -0
  162. smartsheet/models/version.py +57 -0
  163. smartsheet/models/web_content_widget_content.py +60 -0
  164. smartsheet/models/webhook.py +219 -0
  165. smartsheet/models/webhook_secret.py +58 -0
  166. smartsheet/models/webhook_stats.py +76 -0
  167. smartsheet/models/webhook_subscope.py +50 -0
  168. smartsheet/models/widget.py +211 -0
  169. smartsheet/models/widget_content.py +52 -0
  170. smartsheet/models/widget_hyperlink.py +74 -0
  171. smartsheet/models/workspace.py +185 -0
  172. smartsheet/object_value.py +72 -0
  173. smartsheet/passthrough.py +127 -0
  174. smartsheet/reports.py +382 -0
  175. smartsheet/search.py +100 -0
  176. smartsheet/server.py +48 -0
  177. smartsheet/session.py +70 -0
  178. smartsheet/sharing.py +163 -0
  179. smartsheet/sheets.py +2062 -0
  180. smartsheet/sights.py +370 -0
  181. smartsheet/smartsheet.py +684 -0
  182. smartsheet/templates.py +87 -0
  183. smartsheet/token.py +128 -0
  184. smartsheet/types.py +323 -0
  185. smartsheet/users.py +490 -0
  186. smartsheet/util.py +199 -0
  187. smartsheet/version.py +34 -0
  188. smartsheet/webhooks.py +161 -0
  189. smartsheet/workspaces.py +647 -0
  190. smartsheet_python_sdk-3.5.5.dist-info/METADATA +120 -0
  191. smartsheet_python_sdk-3.5.5.dist-info/RECORD +195 -0
  192. smartsheet_python_sdk-3.5.5.dist-info/WHEEL +5 -0
  193. smartsheet_python_sdk-3.5.5.dist-info/licenses/LICENSE.md +201 -0
  194. smartsheet_python_sdk-3.5.5.dist-info/licenses/NOTICE +10 -0
  195. smartsheet_python_sdk-3.5.5.dist-info/top_level.txt +1 -0
smartsheet/folders.py ADDED
@@ -0,0 +1,438 @@
1
+ # pylint: disable=C0111,R0902,R0913
2
+ # Smartsheet Python SDK.
3
+ #
4
+ # Copyright 2016 Smartsheet.com, Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License"): you may
7
+ # not use this file except in compliance with the License. You may obtain
8
+ # a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15
+ # License for the specific language governing permissions and limitations
16
+ # under the License.
17
+
18
+ from __future__ import absolute_import
19
+
20
+ import logging
21
+ import os.path
22
+
23
+ from . import fresh_operation
24
+ from .models.folder import Folder
25
+ from .util import deprecated
26
+
27
+
28
+ class Folders:
29
+
30
+ """Class for handling Folders operations."""
31
+
32
+ def __init__(self, smartsheet_obj):
33
+ """Init Folders with base Smartsheet object."""
34
+ self._base = smartsheet_obj
35
+ self._log = logging.getLogger(__name__)
36
+
37
+ def copy_folder(
38
+ self, folder_id, container_destination_obj, include=None, skip_remap=None
39
+ ):
40
+ """Creates a copy of the specified Folder.
41
+
42
+ Args:
43
+ folder_id (int): Folder ID
44
+ container_destination_obj
45
+ (ContainerDestination): Container Destination object.
46
+ include (list[str]): A comma separated list of
47
+ elements to copy. Valid list values: attachments,
48
+ attachments, cellLinks, data, discussions, filters, forms, ruleRecipients,
49
+ rules, shares, all (deprecated).
50
+ skip_remap (list[str]): A comma separated list
51
+ of references to NOT re-map for the newly created resource.
52
+ Valid list items: cellLinks, reports, sheetHyperlinks, sights
53
+
54
+ Returns:
55
+ Result
56
+ """
57
+ _op = fresh_operation("copy_folder")
58
+ _op["method"] = "POST"
59
+ _op["path"] = "/folders/" + str(folder_id) + "/copy"
60
+ _op["query_params"]["include"] = include
61
+ _op["query_params"]["skipRemap"] = skip_remap
62
+ _op["json"] = container_destination_obj
63
+
64
+ expected = ["Result", "Folder"]
65
+
66
+ prepped_request = self._base.prepare_request(_op)
67
+ response = self._base.request(prepped_request, expected, _op)
68
+
69
+ return response
70
+
71
+ def create_folder_in_folder(self, folder_id, folder_obj):
72
+ """Create a Folder in the specified Folder
73
+
74
+ Args:
75
+ folder_id (int): Folder ID
76
+ folder_obj (Folder): Folder object.
77
+
78
+ Returns:
79
+ Result
80
+ """
81
+ if isinstance(folder_obj, str):
82
+ folder_obj = Folder({"name": folder_obj})
83
+
84
+ _op = fresh_operation("create_folder_in_folder")
85
+ _op["method"] = "POST"
86
+ _op["path"] = "/folders/" + str(folder_id) + "/folders"
87
+ _op["json"] = folder_obj
88
+
89
+ expected = ["Result", "Folder"]
90
+
91
+ prepped_request = self._base.prepare_request(_op)
92
+ response = self._base.request(prepped_request, expected, _op)
93
+
94
+ return response
95
+
96
+ def create_sheet_in_folder(self, folder_id, sheet_obj):
97
+ """Create a Sheet from scratch in the specified Folder.
98
+
99
+ Args:
100
+ folder_id (int): Folder ID
101
+ sheet_obj (Sheet): Sheet object.
102
+
103
+ Returns:
104
+ Result
105
+ """
106
+ _op = fresh_operation("create_sheet_in_folder")
107
+ _op["method"] = "POST"
108
+ _op["path"] = "/folders/" + str(folder_id) + "/sheets"
109
+ _op["json"] = sheet_obj
110
+
111
+ expected = ["Result", "Sheet"]
112
+
113
+ prepped_request = self._base.prepare_request(_op)
114
+ response = self._base.request(prepped_request, expected, _op)
115
+
116
+ return response
117
+
118
+ # pylint: disable=invalid-name
119
+ def create_sheet_in_folder_from_template(self, folder_id, sheet_obj, include=None):
120
+ """Create a Sheet in the specified Folder from the specified Template.
121
+
122
+ The Sheet object should be limited to the following
123
+ attributes:
124
+
125
+ name (required): need not be unique.
126
+ fromId (required): the ID of the Template to use in creating the
127
+ Sheet.
128
+
129
+ The optional Include parameter is a list of elements to copy from
130
+ the Template. It may include: data, attachments, discussions,
131
+ cellLinks, forms
132
+
133
+ Args:
134
+ folder_id (int): Folder ID
135
+ sheet_obj (Sheet): Sheet object.
136
+ include (list[str]): A list of optional elements
137
+ to include from the source Template. Valid list values:
138
+ data, attachments, discussions, cellLinks, forms.
139
+
140
+ Returns:
141
+ Result
142
+ """
143
+ _op = fresh_operation("create_sheet_in_folder_from_template")
144
+ _op["method"] = "POST"
145
+ _op["path"] = "/folders/" + str(folder_id) + "/sheets"
146
+ _op["query_params"]["include"] = include
147
+ _op["json"] = sheet_obj
148
+
149
+ expected = ["Result", "Sheet"]
150
+
151
+ prepped_request = self._base.prepare_request(_op)
152
+ response = self._base.request(prepped_request, expected, _op)
153
+
154
+ return response
155
+
156
+ # pylint: enable=invalid-name
157
+
158
+ def delete_folder(self, folder_id):
159
+ """Delete the Folder (and its contents) specified in the request.
160
+
161
+ Args:
162
+ folder_id (int): Folder ID
163
+
164
+ Returns:
165
+ Result
166
+ """
167
+ _op = fresh_operation("delete_folder")
168
+ _op["method"] = "DELETE"
169
+ _op["path"] = "/folders/" + str(folder_id)
170
+
171
+ expected = ["Result", None]
172
+ prepped_request = self._base.prepare_request(_op)
173
+ response = self._base.request(prepped_request, expected, _op)
174
+
175
+ return response
176
+
177
+ @deprecated
178
+ def get_folder(self, folder_id, include=None):
179
+ """Get the specified Folder (and list its contents).
180
+
181
+ Deprecated: 3.1.0
182
+ Use `get_folder_metadata` and `get_folder_children` instead.
183
+
184
+ Args:
185
+ folder_id (int): Folder ID
186
+ include (list[str]): A comma-separated list of
187
+ optional elements to include in the response. Valid list
188
+ values: ownerInfo, sheetVersion, source.
189
+
190
+ Returns:
191
+ Folder
192
+ """
193
+ _op = fresh_operation("get_folder")
194
+ _op["method"] = "GET"
195
+ _op["path"] = "/folders/" + str(folder_id)
196
+ _op["query_params"]["include"] = include
197
+
198
+ expected = "Folder"
199
+ prepped_request = self._base.prepare_request(_op)
200
+ response = self._base.request(prepped_request, expected, _op)
201
+
202
+ return response
203
+
204
+ @deprecated
205
+ def list_folders(self, folder_id, page_size=None, page=None, include_all=None):
206
+ """Get a list of top-level child Folders within the specified Folder.
207
+
208
+ Deprecated: 3.1.0
209
+ Use `get_folder_children` with children_resource_types=['folders'] instead.
210
+
211
+ Args:
212
+ folder_id (int): Folder ID
213
+ page_size (int): The maximum number of items to
214
+ return per page.
215
+ page (int): Which page to return.
216
+ include_all (bool): If true, include all results
217
+ (i.e. do not paginate).
218
+
219
+ Returns:
220
+ IndexResult
221
+ """
222
+ _op = fresh_operation("list_folders")
223
+ _op["method"] = "GET"
224
+ _op["path"] = "/folders/" + str(folder_id) + "/folders"
225
+ _op["query_params"]["pageSize"] = page_size
226
+ _op["query_params"]["page"] = page
227
+ _op["query_params"]["includeAll"] = include_all
228
+
229
+ expected = ["IndexResult", "Folder"]
230
+
231
+ prepped_request = self._base.prepare_request(_op)
232
+ response = self._base.request(prepped_request, expected, _op)
233
+
234
+ return response
235
+
236
+ def move_folder(self, folder_id, container_destination_obj):
237
+ """Moves the specified Folder to another location.
238
+
239
+ Args:
240
+ folder_id (int): Folder ID
241
+ container_destination_obj
242
+ (ContainerDestination): Container Destination object.
243
+
244
+ Returns:
245
+ Result
246
+ """
247
+ _op = fresh_operation("move_folder")
248
+ _op["method"] = "POST"
249
+ _op["path"] = "/folders/" + str(folder_id) + "/move"
250
+ _op["json"] = container_destination_obj
251
+
252
+ expected = ["Result", "Folder"]
253
+
254
+ prepped_request = self._base.prepare_request(_op)
255
+ response = self._base.request(prepped_request, expected, _op)
256
+
257
+ return response
258
+
259
+ def update_folder(self, folder_id, folder_obj):
260
+ """Update the specified Folder.
261
+
262
+ Args:
263
+ folder_id (int): Folder ID
264
+ folder_obj (Folder): Folder object.
265
+
266
+ Returns:
267
+ Result
268
+ """
269
+ if isinstance(folder_obj, str):
270
+ folder_obj = Folder({"name": folder_obj})
271
+
272
+ _op = fresh_operation("update_folder")
273
+ _op["method"] = "PUT"
274
+ _op["path"] = "/folders/" + str(folder_id)
275
+ _op["json"] = folder_obj
276
+
277
+ expected = ["Result", "Folder"]
278
+
279
+ prepped_request = self._base.prepare_request(_op)
280
+ response = self._base.request(prepped_request, expected, _op)
281
+
282
+ return response
283
+
284
+ def get_folder_metadata(self, folder_id, include=None):
285
+ """Get the metadata of a folder.
286
+
287
+ Args:
288
+ folder_id (int): Folder ID
289
+ include (list[str]): A list of optional elements to include
290
+ in the response. Valid list values: source.
291
+
292
+ Returns:
293
+ Folder
294
+ """
295
+ _op = fresh_operation("get_folder_metadata")
296
+ _op["method"] = "GET"
297
+ _op["path"] = "/folders/" + str(folder_id) + "/metadata"
298
+ _op["query_params"]["include"] = include
299
+
300
+ expected = "Folder"
301
+ prepped_request = self._base.prepare_request(_op)
302
+ response = self._base.request(prepped_request, expected, _op)
303
+
304
+ return response
305
+
306
+ def get_folder_children(self, folder_id, children_resource_types=None, include=None, last_key=None, max_items=None):
307
+ """Get the children of a folder.
308
+
309
+ Args:
310
+ folder_id (int): Folder ID
311
+ children_resource_types (list[str]): The types of the children resources.
312
+ If not provided, returns children of all types.
313
+ Valid list values: sheets, reports, sights, folders.
314
+ include (list[str]): A list of optional elements to include in the
315
+ response. Valid list values: source, ownerInfo.
316
+ last_key (str): The token from a previous request that will allow this one
317
+ to fetch the next page of results.
318
+ max_items (int): The maximum number of items to return in the response.
319
+
320
+ Returns:
321
+ PaginatedChildrenResult
322
+ """
323
+ _op = fresh_operation("get_folder_children")
324
+ _op["method"] = "GET"
325
+ _op["path"] = "/folders/" + str(folder_id) + "/children"
326
+ _op["query_params"]["childrenResourceTypes"] = children_resource_types
327
+ _op["query_params"]["include"] = include
328
+ _op["query_params"]["lastKey"] = last_key
329
+ _op["query_params"]["maxItems"] = max_items
330
+
331
+ expected = "PaginatedChildrenResult"
332
+ prepped_request = self._base.prepare_request(_op)
333
+ response = self._base.request(prepped_request, expected, _op)
334
+
335
+ return response
336
+
337
+ def import_csv_sheet(
338
+ self,
339
+ folder_id,
340
+ file,
341
+ sheet_name=None,
342
+ header_row_index=None,
343
+ primary_column_index=None,
344
+ ):
345
+ """Imports a sheet in the specified folder.
346
+
347
+ Args:
348
+ folder_id (int): folder ID
349
+ file (string): path to CSV file.
350
+ sheet_name (string): destination sheet name
351
+ header_row_index (int): index (0 based) of row to be used for column names
352
+ primary_column_index (int): index (0 based) of primary column
353
+
354
+ Returns:
355
+ Result
356
+ """
357
+ if not all(val is not None for val in ["folder_id", "file"]):
358
+ raise ValueError(
359
+ ("One or more required values are missing from call to " + __name__)
360
+ )
361
+
362
+ return self._import_sheet(
363
+ folder_id,
364
+ file,
365
+ "text/csv",
366
+ sheet_name,
367
+ header_row_index,
368
+ primary_column_index,
369
+ )
370
+
371
+ def import_xlsx_sheet(
372
+ self,
373
+ folder_id,
374
+ file,
375
+ sheet_name=None,
376
+ header_row_index=None,
377
+ primary_column_index=None,
378
+ ):
379
+ """Imports a sheet in the specified folder.
380
+
381
+ Args:
382
+ folder_id (int): folder ID
383
+ file (string): path to XLSX file.
384
+ sheet_name (string): destination sheet name
385
+ header_row_index (int): index (0 based) of row to be used for column names
386
+ primary_column_index (int): index (0 based) of primary column
387
+
388
+ Returns:
389
+ Result
390
+ """
391
+ if not all(val is not None for val in ["folder_id", "file"]):
392
+ raise ValueError(
393
+ ("One or more required values are missing from call to " + __name__)
394
+ )
395
+
396
+ return self._import_sheet(
397
+ folder_id,
398
+ file,
399
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
400
+ sheet_name,
401
+ header_row_index,
402
+ primary_column_index,
403
+ )
404
+
405
+ def _import_sheet(
406
+ self,
407
+ folder_id,
408
+ file,
409
+ file_type,
410
+ sheet_name,
411
+ header_row_index,
412
+ primary_column_index,
413
+ ):
414
+ """Internal function used to import sheet"""
415
+
416
+ if sheet_name is None:
417
+ head, tail = os.path.split(file)
418
+ sheet_name = tail or os.path.basename(head)
419
+
420
+ _data = open(file, "rb").read()
421
+ _op = fresh_operation("import_sheet_into_folder")
422
+ _op["method"] = "POST"
423
+ _op["path"] = "/folders/" + str(folder_id) + "/sheets/import"
424
+ _op["headers"] = {
425
+ "content-type": file_type,
426
+ "content-disposition": "attachment",
427
+ }
428
+ _op["form_data"] = _data
429
+ _op["query_params"]["sheetName"] = sheet_name
430
+ _op["query_params"]["headerRowIndex"] = header_row_index
431
+ _op["query_params"]["primaryColumnIndex"] = primary_column_index
432
+
433
+ expected = ["Result", "Sheet"]
434
+
435
+ prepped_request = self._base.prepare_request(_op)
436
+ response = self._base.request(prepped_request, expected, _op)
437
+
438
+ return response
smartsheet/groups.py ADDED
@@ -0,0 +1,186 @@
1
+ # pylint: disable=C0111,R0902,R0913
2
+ # Smartsheet Python SDK.
3
+ #
4
+ # Copyright 2018 Smartsheet.com, Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License"): you may
7
+ # not use this file except in compliance with the License. You may obtain
8
+ # a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15
+ # License for the specific language governing permissions and limitations
16
+ # under the License.
17
+
18
+ from __future__ import absolute_import
19
+
20
+ import logging
21
+
22
+ from . import fresh_operation
23
+
24
+
25
+ class Groups:
26
+
27
+ """Class for handling Groups operations."""
28
+
29
+ def __init__(self, smartsheet_obj):
30
+ """Init Groups with base Smartsheet object."""
31
+ self._base = smartsheet_obj
32
+ self._log = logging.getLogger(__name__)
33
+
34
+ def add_members(self, group_id, group_member_obj):
35
+ """Add one or more members to a Group.
36
+
37
+ Args:
38
+ group_id (int): Group ID
39
+ group_member_obj (GroupMember): Group member
40
+ object(s).
41
+
42
+ Returns:
43
+ Result
44
+ """
45
+ _op = fresh_operation("add_members")
46
+ _op["method"] = "POST"
47
+ _op["path"] = "/groups/" + str(group_id) + "/members"
48
+ _op["json"] = group_member_obj
49
+
50
+ expected = ["Result", "GroupMember"]
51
+
52
+ prepped_request = self._base.prepare_request(_op)
53
+ response = self._base.request(prepped_request, expected, _op)
54
+
55
+ return response
56
+
57
+ def create_group(self, group_obj):
58
+ """Create a new Group
59
+
60
+ Args:
61
+ group_obj (Group): Group object.
62
+
63
+ Returns:
64
+ Result
65
+ """
66
+ _op = fresh_operation("create_group")
67
+ _op["method"] = "POST"
68
+ _op["path"] = "/groups"
69
+ _op["json"] = group_obj
70
+
71
+ expected = ["Result", "Group"]
72
+
73
+ prepped_request = self._base.prepare_request(_op)
74
+ response = self._base.request(prepped_request, expected, _op)
75
+
76
+ return response
77
+
78
+ def delete_group(self, group_id):
79
+ """Delete the specified Group.
80
+
81
+ Args:
82
+ group_id (int): Group ID
83
+
84
+ Returns:
85
+ Result
86
+ """
87
+ _op = fresh_operation("delete_group")
88
+ _op["method"] = "DELETE"
89
+ _op["path"] = "/groups/" + str(group_id)
90
+
91
+ expected = ["Result", None]
92
+ prepped_request = self._base.prepare_request(_op)
93
+ response = self._base.request(prepped_request, expected, _op)
94
+
95
+ return response
96
+
97
+ def get_group(self, group_id):
98
+ """Get the specified Group.
99
+
100
+ Args:
101
+ group_id (int): Group ID
102
+
103
+ Returns:
104
+ Group
105
+ """
106
+ _op = fresh_operation("get_group")
107
+ _op["method"] = "GET"
108
+ _op["path"] = "/groups/" + str(group_id)
109
+
110
+ expected = "Group"
111
+ prepped_request = self._base.prepare_request(_op)
112
+ response = self._base.request(prepped_request, expected, _op)
113
+
114
+ return response
115
+
116
+ def list_groups(self, page_size=None, page=None, include_all=None):
117
+ """Get all Groups in an organization.
118
+
119
+ Get the list of all Groups in an organization. To fetch the
120
+ members of an individual group, use the getGroup operation.
121
+
122
+ Args:
123
+ page_size (int): The maximum number of items to
124
+ return per page.
125
+ page (int): Which page to return.
126
+ include_all (bool): If true, include all results
127
+ (i.e. do not paginate).
128
+
129
+ Returns:
130
+ IndexResult
131
+ """
132
+ _op = fresh_operation("list_groups")
133
+ _op["method"] = "GET"
134
+ _op["path"] = "/groups"
135
+ _op["query_params"]["pageSize"] = page_size
136
+ _op["query_params"]["page"] = page
137
+ _op["query_params"]["includeAll"] = include_all
138
+
139
+ expected = ["IndexResult", "Group"]
140
+
141
+ prepped_request = self._base.prepare_request(_op)
142
+ response = self._base.request(prepped_request, expected, _op)
143
+
144
+ return response
145
+
146
+ def remove_member(self, group_id, user_id):
147
+ """Removes a member from the specified Group.
148
+
149
+ Args:
150
+ group_id (int): Group ID
151
+ user_id (int): User ID
152
+
153
+ Returns:
154
+ Result
155
+ """
156
+ _op = fresh_operation("remove_member")
157
+ _op["method"] = "DELETE"
158
+ _op["path"] = "/groups/" + str(group_id) + "/members/" + str(user_id)
159
+
160
+ expected = ["Result", None]
161
+ prepped_request = self._base.prepare_request(_op)
162
+ response = self._base.request(prepped_request, expected, _op)
163
+
164
+ return response
165
+
166
+ def update_group(self, group_id, group_obj):
167
+ """Updates the specified Group.
168
+
169
+ Args:
170
+ group_id (int): Group ID
171
+ group_obj (Group): Group object.
172
+
173
+ Returns:
174
+ Result
175
+ """
176
+ _op = fresh_operation("update_group")
177
+ _op["method"] = "PUT"
178
+ _op["path"] = "/groups/" + str(group_id)
179
+ _op["json"] = group_obj
180
+
181
+ expected = ["Result", "Group"]
182
+
183
+ prepped_request = self._base.prepare_request(_op)
184
+ response = self._base.request(prepped_request, expected, _op)
185
+
186
+ return response