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.
- smartsheet/__init__.py +37 -0
- smartsheet/attachments.py +565 -0
- smartsheet/cells.py +164 -0
- smartsheet/contacts.py +78 -0
- smartsheet/discussions.py +411 -0
- smartsheet/events.py +79 -0
- smartsheet/exceptions.py +130 -0
- smartsheet/favorites.py +116 -0
- smartsheet/folders.py +438 -0
- smartsheet/groups.py +186 -0
- smartsheet/home.py +180 -0
- smartsheet/images.py +61 -0
- smartsheet/models/__init__.py +126 -0
- smartsheet/models/access_token.py +95 -0
- smartsheet/models/account.py +77 -0
- smartsheet/models/alternate_email.py +88 -0
- smartsheet/models/asset_share.py +165 -0
- smartsheet/models/asset_shares_paginated_result.py +84 -0
- smartsheet/models/attachment.py +181 -0
- smartsheet/models/auto_number_format.py +81 -0
- smartsheet/models/automation_action.py +162 -0
- smartsheet/models/automation_rule.py +164 -0
- smartsheet/models/boolean_object_value.py +38 -0
- smartsheet/models/bulk_item_failure.py +77 -0
- smartsheet/models/bulk_item_result.py +111 -0
- smartsheet/models/cell.py +193 -0
- smartsheet/models/cell_data_item.py +152 -0
- smartsheet/models/cell_history.py +67 -0
- smartsheet/models/cell_link.py +91 -0
- smartsheet/models/cell_link_widget_content.py +101 -0
- smartsheet/models/chart_widget_content.py +124 -0
- smartsheet/models/column.py +253 -0
- smartsheet/models/comment.py +126 -0
- smartsheet/models/contact.py +88 -0
- smartsheet/models/contact_object_value.py +59 -0
- smartsheet/models/container_destination.py +74 -0
- smartsheet/models/copy_or_move_row_destination.py +54 -0
- smartsheet/models/copy_or_move_row_directive.py +64 -0
- smartsheet/models/copy_or_move_row_result.py +67 -0
- smartsheet/models/criteria.py +82 -0
- smartsheet/models/cross_sheet_reference.py +134 -0
- smartsheet/models/currency.py +64 -0
- smartsheet/models/date_object_value.py +56 -0
- smartsheet/models/datetime_object_value.py +56 -0
- smartsheet/models/discussion.py +183 -0
- smartsheet/models/downloaded_file.py +106 -0
- smartsheet/models/duration.py +112 -0
- smartsheet/models/email.py +82 -0
- smartsheet/models/enums/__init__.py +56 -0
- smartsheet/models/enums/access_level.py +26 -0
- smartsheet/models/enums/asset_type.py +10 -0
- smartsheet/models/enums/attachment_parent_type.py +23 -0
- smartsheet/models/enums/attachment_sub_type.py +26 -0
- smartsheet/models/enums/attachment_type.py +29 -0
- smartsheet/models/enums/automation_action_frequency.py +24 -0
- smartsheet/models/enums/automation_action_type.py +23 -0
- smartsheet/models/enums/automation_rule_disabled_reason.py +27 -0
- smartsheet/models/enums/cell_link_status.py +28 -0
- smartsheet/models/enums/column_type.py +31 -0
- smartsheet/models/enums/criteria_target.py +21 -0
- smartsheet/models/enums/cross_sheet_reference_status.py +28 -0
- smartsheet/models/enums/currency_code.py +43 -0
- smartsheet/models/enums/day_descriptors.py +30 -0
- smartsheet/models/enums/day_ordinal.py +25 -0
- smartsheet/models/enums/event_action.py +76 -0
- smartsheet/models/enums/event_obejct_type.py +34 -0
- smartsheet/models/enums/event_source.py +27 -0
- smartsheet/models/enums/global_template.py +23 -0
- smartsheet/models/enums/operator.py +62 -0
- smartsheet/models/enums/paper_type.py +29 -0
- smartsheet/models/enums/predecessor_type.py +24 -0
- smartsheet/models/enums/publish_accessible_by.py +22 -0
- smartsheet/models/enums/schedule_type.py +25 -0
- smartsheet/models/enums/seat_type.py +17 -0
- smartsheet/models/enums/share_scope.py +22 -0
- smartsheet/models/enums/share_type.py +22 -0
- smartsheet/models/enums/sheet_email_format.py +23 -0
- smartsheet/models/enums/sheet_filter_operator.py +22 -0
- smartsheet/models/enums/sheet_filter_type.py +23 -0
- smartsheet/models/enums/sort_direction.py +22 -0
- smartsheet/models/enums/symbol.py +45 -0
- smartsheet/models/enums/system_column_type.py +25 -0
- smartsheet/models/enums/update_request_status.py +23 -0
- smartsheet/models/enums/user_status.py +23 -0
- smartsheet/models/enums/widget_type.py +32 -0
- smartsheet/models/error.py +74 -0
- smartsheet/models/error_result.py +117 -0
- smartsheet/models/event.py +153 -0
- smartsheet/models/event_result.py +86 -0
- smartsheet/models/explicit_null.py +24 -0
- smartsheet/models/favorite.py +81 -0
- smartsheet/models/folder.py +177 -0
- smartsheet/models/font_family.py +63 -0
- smartsheet/models/format_details.py +55 -0
- smartsheet/models/format_tables.py +191 -0
- smartsheet/models/group.py +134 -0
- smartsheet/models/group_member.py +104 -0
- smartsheet/models/home.py +110 -0
- smartsheet/models/hyperlink.py +81 -0
- smartsheet/models/image.py +101 -0
- smartsheet/models/image_url.py +91 -0
- smartsheet/models/image_url_map.py +68 -0
- smartsheet/models/image_widget_content.py +117 -0
- smartsheet/models/index_result.py +118 -0
- smartsheet/models/json_object.py +59 -0
- smartsheet/models/multi_contact_object_value.py +49 -0
- smartsheet/models/multi_picklist_object_value.py +48 -0
- smartsheet/models/multi_row_email.py +60 -0
- smartsheet/models/number_object_value.py +38 -0
- smartsheet/models/o_auth_error.py +86 -0
- smartsheet/models/object_value.py +130 -0
- smartsheet/models/paginated_children_result.py +80 -0
- smartsheet/models/predecessor.py +102 -0
- smartsheet/models/predecessor_list.py +49 -0
- smartsheet/models/primitive_object_value.py +59 -0
- smartsheet/models/profile_image.py +72 -0
- smartsheet/models/project_settings.py +89 -0
- smartsheet/models/recipient.py +63 -0
- smartsheet/models/report.py +90 -0
- smartsheet/models/report_cell.py +59 -0
- smartsheet/models/report_column.py +67 -0
- smartsheet/models/report_publish.py +95 -0
- smartsheet/models/report_row.py +68 -0
- smartsheet/models/report_widget_content.py +78 -0
- smartsheet/models/result.py +105 -0
- smartsheet/models/row.py +336 -0
- smartsheet/models/row_email.py +83 -0
- smartsheet/models/row_mapping.py +77 -0
- smartsheet/models/schedule.py +140 -0
- smartsheet/models/scope.py +70 -0
- smartsheet/models/search_result.py +67 -0
- smartsheet/models/search_result_item.py +150 -0
- smartsheet/models/selection_range.py +86 -0
- smartsheet/models/sent_update_request.py +172 -0
- smartsheet/models/server_info.py +67 -0
- smartsheet/models/share.py +183 -0
- smartsheet/models/sheet.py +462 -0
- smartsheet/models/sheet_email.py +81 -0
- smartsheet/models/sheet_filter.py +106 -0
- smartsheet/models/sheet_filter_details.py +76 -0
- smartsheet/models/sheet_publish.py +184 -0
- smartsheet/models/sheet_summary.py +59 -0
- smartsheet/models/sheet_user_permissions.py +58 -0
- smartsheet/models/sheet_user_settings.py +72 -0
- smartsheet/models/shortcut_data_item.py +102 -0
- smartsheet/models/shortcut_widget_content.py +61 -0
- smartsheet/models/sight.py +175 -0
- smartsheet/models/sight_publish.py +77 -0
- smartsheet/models/sort_criterion.py +64 -0
- smartsheet/models/sort_specifier.py +55 -0
- smartsheet/models/source.py +83 -0
- smartsheet/models/string_object_value.py +38 -0
- smartsheet/models/summary_field.py +256 -0
- smartsheet/models/template.py +171 -0
- smartsheet/models/title_rich_text_widget_content.py +68 -0
- smartsheet/models/token_paginated_result.py +79 -0
- smartsheet/models/update_request.py +110 -0
- smartsheet/models/user.py +58 -0
- smartsheet/models/user_model.py +280 -0
- smartsheet/models/user_plan.py +77 -0
- smartsheet/models/user_profile.py +89 -0
- smartsheet/models/version.py +57 -0
- smartsheet/models/web_content_widget_content.py +60 -0
- smartsheet/models/webhook.py +219 -0
- smartsheet/models/webhook_secret.py +58 -0
- smartsheet/models/webhook_stats.py +76 -0
- smartsheet/models/webhook_subscope.py +50 -0
- smartsheet/models/widget.py +211 -0
- smartsheet/models/widget_content.py +52 -0
- smartsheet/models/widget_hyperlink.py +74 -0
- smartsheet/models/workspace.py +185 -0
- smartsheet/object_value.py +72 -0
- smartsheet/passthrough.py +127 -0
- smartsheet/reports.py +382 -0
- smartsheet/search.py +100 -0
- smartsheet/server.py +48 -0
- smartsheet/session.py +70 -0
- smartsheet/sharing.py +163 -0
- smartsheet/sheets.py +2062 -0
- smartsheet/sights.py +370 -0
- smartsheet/smartsheet.py +684 -0
- smartsheet/templates.py +87 -0
- smartsheet/token.py +128 -0
- smartsheet/types.py +323 -0
- smartsheet/users.py +490 -0
- smartsheet/util.py +199 -0
- smartsheet/version.py +34 -0
- smartsheet/webhooks.py +161 -0
- smartsheet/workspaces.py +647 -0
- smartsheet_python_sdk-3.5.5.dist-info/METADATA +120 -0
- smartsheet_python_sdk-3.5.5.dist-info/RECORD +195 -0
- smartsheet_python_sdk-3.5.5.dist-info/WHEEL +5 -0
- smartsheet_python_sdk-3.5.5.dist-info/licenses/LICENSE.md +201 -0
- smartsheet_python_sdk-3.5.5.dist-info/licenses/NOTICE +10 -0
- 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
|