dtlpy 1.115.44__py3-none-any.whl → 1.116.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 (238) hide show
  1. dtlpy/__init__.py +491 -491
  2. dtlpy/__version__.py +1 -1
  3. dtlpy/assets/__init__.py +26 -26
  4. dtlpy/assets/code_server/config.yaml +2 -2
  5. dtlpy/assets/code_server/installation.sh +24 -24
  6. dtlpy/assets/code_server/launch.json +13 -13
  7. dtlpy/assets/code_server/settings.json +2 -2
  8. dtlpy/assets/main.py +53 -53
  9. dtlpy/assets/main_partial.py +18 -18
  10. dtlpy/assets/mock.json +11 -11
  11. dtlpy/assets/model_adapter.py +83 -83
  12. dtlpy/assets/package.json +61 -61
  13. dtlpy/assets/package_catalog.json +29 -29
  14. dtlpy/assets/package_gitignore +307 -307
  15. dtlpy/assets/service_runners/__init__.py +33 -33
  16. dtlpy/assets/service_runners/converter.py +96 -96
  17. dtlpy/assets/service_runners/multi_method.py +49 -49
  18. dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
  19. dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
  20. dtlpy/assets/service_runners/multi_method_item.py +52 -52
  21. dtlpy/assets/service_runners/multi_method_json.py +52 -52
  22. dtlpy/assets/service_runners/single_method.py +37 -37
  23. dtlpy/assets/service_runners/single_method_annotation.py +43 -43
  24. dtlpy/assets/service_runners/single_method_dataset.py +43 -43
  25. dtlpy/assets/service_runners/single_method_item.py +41 -41
  26. dtlpy/assets/service_runners/single_method_json.py +42 -42
  27. dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
  28. dtlpy/assets/voc_annotation_template.xml +23 -23
  29. dtlpy/caches/base_cache.py +32 -32
  30. dtlpy/caches/cache.py +473 -473
  31. dtlpy/caches/dl_cache.py +201 -201
  32. dtlpy/caches/filesystem_cache.py +89 -89
  33. dtlpy/caches/redis_cache.py +84 -84
  34. dtlpy/dlp/__init__.py +20 -20
  35. dtlpy/dlp/cli_utilities.py +367 -367
  36. dtlpy/dlp/command_executor.py +764 -764
  37. dtlpy/dlp/dlp +1 -1
  38. dtlpy/dlp/dlp.bat +1 -1
  39. dtlpy/dlp/dlp.py +128 -128
  40. dtlpy/dlp/parser.py +651 -651
  41. dtlpy/entities/__init__.py +83 -83
  42. dtlpy/entities/analytic.py +347 -347
  43. dtlpy/entities/annotation.py +1879 -1879
  44. dtlpy/entities/annotation_collection.py +699 -699
  45. dtlpy/entities/annotation_definitions/__init__.py +20 -20
  46. dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
  47. dtlpy/entities/annotation_definitions/box.py +195 -195
  48. dtlpy/entities/annotation_definitions/classification.py +67 -67
  49. dtlpy/entities/annotation_definitions/comparison.py +72 -72
  50. dtlpy/entities/annotation_definitions/cube.py +204 -204
  51. dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
  52. dtlpy/entities/annotation_definitions/description.py +32 -32
  53. dtlpy/entities/annotation_definitions/ellipse.py +124 -124
  54. dtlpy/entities/annotation_definitions/free_text.py +62 -62
  55. dtlpy/entities/annotation_definitions/gis.py +69 -69
  56. dtlpy/entities/annotation_definitions/note.py +139 -139
  57. dtlpy/entities/annotation_definitions/point.py +117 -117
  58. dtlpy/entities/annotation_definitions/polygon.py +182 -182
  59. dtlpy/entities/annotation_definitions/polyline.py +111 -111
  60. dtlpy/entities/annotation_definitions/pose.py +92 -92
  61. dtlpy/entities/annotation_definitions/ref_image.py +86 -86
  62. dtlpy/entities/annotation_definitions/segmentation.py +240 -240
  63. dtlpy/entities/annotation_definitions/subtitle.py +34 -34
  64. dtlpy/entities/annotation_definitions/text.py +85 -85
  65. dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
  66. dtlpy/entities/app.py +220 -220
  67. dtlpy/entities/app_module.py +107 -107
  68. dtlpy/entities/artifact.py +174 -174
  69. dtlpy/entities/assignment.py +399 -399
  70. dtlpy/entities/base_entity.py +214 -214
  71. dtlpy/entities/bot.py +113 -113
  72. dtlpy/entities/codebase.py +292 -292
  73. dtlpy/entities/collection.py +38 -38
  74. dtlpy/entities/command.py +169 -169
  75. dtlpy/entities/compute.py +449 -449
  76. dtlpy/entities/dataset.py +1299 -1299
  77. dtlpy/entities/directory_tree.py +44 -44
  78. dtlpy/entities/dpk.py +470 -470
  79. dtlpy/entities/driver.py +235 -235
  80. dtlpy/entities/execution.py +397 -397
  81. dtlpy/entities/feature.py +124 -124
  82. dtlpy/entities/feature_set.py +145 -145
  83. dtlpy/entities/filters.py +798 -798
  84. dtlpy/entities/gis_item.py +107 -107
  85. dtlpy/entities/integration.py +184 -184
  86. dtlpy/entities/item.py +959 -959
  87. dtlpy/entities/label.py +123 -123
  88. dtlpy/entities/links.py +85 -85
  89. dtlpy/entities/message.py +175 -175
  90. dtlpy/entities/model.py +684 -684
  91. dtlpy/entities/node.py +1005 -1005
  92. dtlpy/entities/ontology.py +810 -803
  93. dtlpy/entities/organization.py +287 -287
  94. dtlpy/entities/package.py +657 -657
  95. dtlpy/entities/package_defaults.py +5 -5
  96. dtlpy/entities/package_function.py +185 -185
  97. dtlpy/entities/package_module.py +113 -113
  98. dtlpy/entities/package_slot.py +118 -118
  99. dtlpy/entities/paged_entities.py +299 -299
  100. dtlpy/entities/pipeline.py +624 -624
  101. dtlpy/entities/pipeline_execution.py +279 -279
  102. dtlpy/entities/project.py +394 -394
  103. dtlpy/entities/prompt_item.py +505 -505
  104. dtlpy/entities/recipe.py +301 -301
  105. dtlpy/entities/reflect_dict.py +102 -102
  106. dtlpy/entities/resource_execution.py +138 -138
  107. dtlpy/entities/service.py +963 -963
  108. dtlpy/entities/service_driver.py +117 -117
  109. dtlpy/entities/setting.py +294 -294
  110. dtlpy/entities/task.py +495 -495
  111. dtlpy/entities/time_series.py +143 -143
  112. dtlpy/entities/trigger.py +426 -426
  113. dtlpy/entities/user.py +118 -118
  114. dtlpy/entities/webhook.py +124 -124
  115. dtlpy/examples/__init__.py +19 -19
  116. dtlpy/examples/add_labels.py +135 -135
  117. dtlpy/examples/add_metadata_to_item.py +21 -21
  118. dtlpy/examples/annotate_items_using_model.py +65 -65
  119. dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
  120. dtlpy/examples/annotations_convert_to_voc.py +9 -9
  121. dtlpy/examples/annotations_convert_to_yolo.py +9 -9
  122. dtlpy/examples/convert_annotation_types.py +51 -51
  123. dtlpy/examples/converter.py +143 -143
  124. dtlpy/examples/copy_annotations.py +22 -22
  125. dtlpy/examples/copy_folder.py +31 -31
  126. dtlpy/examples/create_annotations.py +51 -51
  127. dtlpy/examples/create_video_annotations.py +83 -83
  128. dtlpy/examples/delete_annotations.py +26 -26
  129. dtlpy/examples/filters.py +113 -113
  130. dtlpy/examples/move_item.py +23 -23
  131. dtlpy/examples/play_video_annotation.py +13 -13
  132. dtlpy/examples/show_item_and_mask.py +53 -53
  133. dtlpy/examples/triggers.py +49 -49
  134. dtlpy/examples/upload_batch_of_items.py +20 -20
  135. dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
  136. dtlpy/examples/upload_items_with_modalities.py +43 -43
  137. dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
  138. dtlpy/examples/upload_yolo_format_annotations.py +70 -70
  139. dtlpy/exceptions.py +125 -125
  140. dtlpy/miscellaneous/__init__.py +20 -20
  141. dtlpy/miscellaneous/dict_differ.py +95 -95
  142. dtlpy/miscellaneous/git_utils.py +217 -217
  143. dtlpy/miscellaneous/json_utils.py +14 -14
  144. dtlpy/miscellaneous/list_print.py +105 -105
  145. dtlpy/miscellaneous/zipping.py +130 -130
  146. dtlpy/ml/__init__.py +20 -20
  147. dtlpy/ml/base_feature_extractor_adapter.py +27 -27
  148. dtlpy/ml/base_model_adapter.py +1257 -1230
  149. dtlpy/ml/metrics.py +461 -461
  150. dtlpy/ml/predictions_utils.py +274 -274
  151. dtlpy/ml/summary_writer.py +57 -57
  152. dtlpy/ml/train_utils.py +60 -60
  153. dtlpy/new_instance.py +252 -252
  154. dtlpy/repositories/__init__.py +56 -56
  155. dtlpy/repositories/analytics.py +85 -85
  156. dtlpy/repositories/annotations.py +916 -916
  157. dtlpy/repositories/apps.py +383 -383
  158. dtlpy/repositories/artifacts.py +452 -452
  159. dtlpy/repositories/assignments.py +599 -599
  160. dtlpy/repositories/bots.py +213 -213
  161. dtlpy/repositories/codebases.py +559 -559
  162. dtlpy/repositories/collections.py +332 -332
  163. dtlpy/repositories/commands.py +152 -152
  164. dtlpy/repositories/compositions.py +61 -61
  165. dtlpy/repositories/computes.py +439 -439
  166. dtlpy/repositories/datasets.py +1504 -1504
  167. dtlpy/repositories/downloader.py +976 -923
  168. dtlpy/repositories/dpks.py +433 -433
  169. dtlpy/repositories/drivers.py +482 -482
  170. dtlpy/repositories/executions.py +815 -815
  171. dtlpy/repositories/feature_sets.py +226 -226
  172. dtlpy/repositories/features.py +255 -255
  173. dtlpy/repositories/integrations.py +484 -484
  174. dtlpy/repositories/items.py +912 -912
  175. dtlpy/repositories/messages.py +94 -94
  176. dtlpy/repositories/models.py +1000 -1000
  177. dtlpy/repositories/nodes.py +80 -80
  178. dtlpy/repositories/ontologies.py +511 -511
  179. dtlpy/repositories/organizations.py +525 -525
  180. dtlpy/repositories/packages.py +1941 -1941
  181. dtlpy/repositories/pipeline_executions.py +451 -451
  182. dtlpy/repositories/pipelines.py +640 -640
  183. dtlpy/repositories/projects.py +539 -539
  184. dtlpy/repositories/recipes.py +419 -399
  185. dtlpy/repositories/resource_executions.py +137 -137
  186. dtlpy/repositories/schema.py +120 -120
  187. dtlpy/repositories/service_drivers.py +213 -213
  188. dtlpy/repositories/services.py +1704 -1704
  189. dtlpy/repositories/settings.py +339 -339
  190. dtlpy/repositories/tasks.py +1477 -1477
  191. dtlpy/repositories/times_series.py +278 -278
  192. dtlpy/repositories/triggers.py +536 -536
  193. dtlpy/repositories/upload_element.py +257 -257
  194. dtlpy/repositories/uploader.py +661 -661
  195. dtlpy/repositories/webhooks.py +249 -249
  196. dtlpy/services/__init__.py +22 -22
  197. dtlpy/services/aihttp_retry.py +131 -131
  198. dtlpy/services/api_client.py +1785 -1785
  199. dtlpy/services/api_reference.py +40 -40
  200. dtlpy/services/async_utils.py +133 -133
  201. dtlpy/services/calls_counter.py +44 -44
  202. dtlpy/services/check_sdk.py +68 -68
  203. dtlpy/services/cookie.py +115 -115
  204. dtlpy/services/create_logger.py +156 -156
  205. dtlpy/services/events.py +84 -84
  206. dtlpy/services/logins.py +235 -235
  207. dtlpy/services/reporter.py +256 -256
  208. dtlpy/services/service_defaults.py +91 -91
  209. dtlpy/utilities/__init__.py +20 -20
  210. dtlpy/utilities/annotations/__init__.py +16 -16
  211. dtlpy/utilities/annotations/annotation_converters.py +269 -269
  212. dtlpy/utilities/base_package_runner.py +285 -264
  213. dtlpy/utilities/converter.py +1650 -1650
  214. dtlpy/utilities/dataset_generators/__init__.py +1 -1
  215. dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
  216. dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
  217. dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
  218. dtlpy/utilities/local_development/__init__.py +1 -1
  219. dtlpy/utilities/local_development/local_session.py +179 -179
  220. dtlpy/utilities/reports/__init__.py +2 -2
  221. dtlpy/utilities/reports/figures.py +343 -343
  222. dtlpy/utilities/reports/report.py +71 -71
  223. dtlpy/utilities/videos/__init__.py +17 -17
  224. dtlpy/utilities/videos/video_player.py +598 -598
  225. dtlpy/utilities/videos/videos.py +470 -470
  226. {dtlpy-1.115.44.data → dtlpy-1.116.6.data}/scripts/dlp +1 -1
  227. dtlpy-1.116.6.data/scripts/dlp.bat +2 -0
  228. {dtlpy-1.115.44.data → dtlpy-1.116.6.data}/scripts/dlp.py +128 -128
  229. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/METADATA +186 -186
  230. dtlpy-1.116.6.dist-info/RECORD +239 -0
  231. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/WHEEL +1 -1
  232. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/licenses/LICENSE +200 -200
  233. tests/features/environment.py +551 -551
  234. dtlpy/assets/__pycache__/__init__.cpython-310.pyc +0 -0
  235. dtlpy-1.115.44.data/scripts/dlp.bat +0 -2
  236. dtlpy-1.115.44.dist-info/RECORD +0 -240
  237. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/entry_points.txt +0 -0
  238. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/top_level.txt +0 -0
@@ -1,525 +1,525 @@
1
- import logging
2
-
3
- from .. import entities, miscellaneous, exceptions, _api_reference
4
- from ..services.api_client import ApiClient
5
-
6
- logger = logging.getLogger(name='dtlpy')
7
-
8
-
9
- class Organizations:
10
- """
11
- Organizations Repository
12
-
13
- Read our `documentation <https://dataloop.ai/docs/org-setup>`_ to learn more about Organizations in the Dataloop platform.
14
- """
15
-
16
- def __init__(self, client_api: ApiClient):
17
- self._client_api = client_api
18
-
19
- def create(self, organization_json: dict) -> entities.Organization:
20
- """
21
- Create a new organization.
22
-
23
- **Prerequisites**: This method can only be used by a **superuser**.
24
-
25
- :param dict organization_json: json contain the Organization fields
26
- :return: Organization object
27
- :rtype: dtlpy.entities.organization.Organization
28
- """
29
-
30
- raise exceptions.PlatformException(error='2001', message='Method organizations.create() was removed')
31
-
32
- def list_groups(self, organization: entities.Organization = None,
33
- organization_id: str = None,
34
- organization_name: str = None):
35
- """
36
- List all organization groups (groups that were created within the organization).
37
-
38
- **Prerequisites**: You must be an organization *owner* to use this method.
39
-
40
- You must provide at least ONE of the following params: organization, organization_name, or organization_id.
41
-
42
- :param entities.Organization organization: Organization object
43
- :param str organization_id: Organization id
44
- :param str organization_name: Organization name
45
- :return: groups list
46
- :rtype: list
47
-
48
- **Example**:
49
-
50
- .. code-block:: python
51
-
52
- groups_list = dl.organizations.list_groups(organization_id='organization_id')
53
- """
54
- if organization is None and organization_id is None and organization_name is None:
55
- raise exceptions.PlatformException(
56
- error='400',
57
- message='Must provide an identifier in inputs')
58
-
59
- if organization is None:
60
- organization = self.get(organization_id=organization_id, organization_name=organization_name)
61
-
62
- url_path = '/orgs/{}/groups'.format(organization.id)
63
-
64
- success, response = self._client_api.gen_request(req_type='get',
65
- path=url_path)
66
- if not success:
67
- raise exceptions.PlatformException(response)
68
-
69
- groups = miscellaneous.List(response.json())
70
- return groups
71
-
72
- def list_integrations(self, organization: entities.Organization = None,
73
- organization_id: str = None,
74
- organization_name: str = None,
75
- only_available=False):
76
- """
77
- List all organization integrations with external cloud storage.
78
-
79
- **Prerequisites**: You must be an organization *owner* to use this method.
80
-
81
- You must provide at least ONE of the following params: organization_id, organization_name, or organization.
82
-
83
- :param entities.Organization organization: Organization object
84
- :param str organization_id: Organization id
85
- :param str organization_name: Organization name
86
- :param bool only_available: if True list only the available integrations
87
- :return: integrations list
88
- :rtype: list
89
-
90
- **Example**:
91
-
92
- .. code-block:: python
93
-
94
- list_integrations = dl.organizations.list_integrations(organization='organization-entity',
95
- only_available=True)
96
- """
97
- if organization is None and organization_id is None and organization_name is None:
98
- raise exceptions.PlatformException(
99
- error='400',
100
- message='Must provide an identifier in inputs')
101
-
102
- if organization is None:
103
- organization = self.get(organization_id=organization_id, organization_name=organization_name)
104
-
105
- if only_available:
106
- url_path = '/orgs/{}/availableIntegrations'.format(organization.id)
107
- else:
108
- url_path = '/orgs/{}/integrations'.format(organization.id)
109
-
110
- success, response = self._client_api.gen_request(req_type='get',
111
- path=url_path)
112
- if not success:
113
- raise exceptions.PlatformException(response)
114
-
115
- available_integrations = miscellaneous.List(response.json())
116
- return available_integrations
117
-
118
- @_api_reference.add(path='/orgs/{orgId}/members', method='get')
119
- def list_members(self, organization: entities.Organization = None,
120
- organization_id: str = None,
121
- organization_name: str = None,
122
- role: entities.MemberOrgRole = None):
123
- """
124
- List all organization members.
125
-
126
- **Prerequisites**: You must be an organization *owner* to use this method.
127
-
128
- You must provide at least ONE of the following params: organization_id, organization_name, or organization.
129
-
130
- :param entities.Organization organization: Organization object
131
- :param str organization_id: Organization id
132
- :param str organization_name: Organization name
133
- :param entities.MemberOrgRole role: MemberOrgRole.ADMIN, MemberOrgRole.OWNER, MemberOrgRole.MEMBER, MemberOrgRole.WORKER
134
- :return: projects list
135
- :rtype: list
136
-
137
- **Example**:
138
-
139
- .. code-block:: python
140
-
141
- list_members = dl.organizations.list_members(organization='organization-entity',
142
- role=dl.MemberOrgRole.MEMBER)
143
- """
144
- if organization is None and organization_id is None and organization_name is None:
145
- raise exceptions.PlatformException(
146
- error='400',
147
- message='Must provide an identifier in inputs')
148
-
149
- if organization is None:
150
- organization = self.get(organization_id=organization_id, organization_name=organization_name)
151
-
152
- url_path = '/orgs/{}/members'.format(organization.id)
153
-
154
- if role is not None and role not in list(entities.MemberOrgRole):
155
- raise ValueError('Unknown role {!r}, role must be one of: {}'.format(role,
156
- ', '.join(
157
- list(entities.MemberOrgRole))))
158
-
159
- success, response = self._client_api.gen_request(req_type='get',
160
- path=url_path)
161
- if not success:
162
- raise exceptions.PlatformException(response)
163
-
164
- members = miscellaneous.List(
165
- [entities.User.from_json(_json=user, client_api=self._client_api, project=None) for user in
166
- response.json()])
167
-
168
- if role is not None:
169
- members = [member for member in members if member.role == role]
170
-
171
- return members
172
-
173
- @_api_reference.add(path='/orgs', method='get')
174
- def list(self) -> miscellaneous.List[entities.Organization]:
175
- """
176
- Lists all the organizations in Dataloop.
177
-
178
- **Prerequisites**: You must be a **superuser** to use this method.
179
-
180
- :return: List of Organization objects
181
- :rtype: list
182
-
183
- **Example**:
184
-
185
- .. code-block:: python
186
-
187
- organizations = dl.organizations.list()
188
- """
189
- success, response = self._client_api.gen_request(req_type='get',
190
- path='/orgs')
191
-
192
- if success:
193
- pool = self._client_api.thread_pools(pool_name='entity.create')
194
- organization_json = response.json()
195
- jobs = [None for _ in range(len(organization_json))]
196
- # return triggers list
197
- for i_organization, organization in enumerate(organization_json):
198
- jobs[i_organization] = pool.submit(entities.Organization._protected_from_json,
199
- **{'client_api': self._client_api,
200
- '_json': organization})
201
-
202
- # get all results
203
- results = [j.result() for j in jobs]
204
- # log errors
205
- _ = [logger.warning(r[1]) for r in results if r[0] is False]
206
- # return good jobs
207
- organization = miscellaneous.List([r[1] for r in results if r[0] is True])
208
- else:
209
- logger.error('Platform error getting organization')
210
- raise exceptions.PlatformException(response)
211
- return organization
212
-
213
- @_api_reference.add(path='/orgs/{orgId}', method='get')
214
- def get(self,
215
- organization_id: str = None,
216
- organization_name: str = None,
217
- fetch: bool = None) -> entities.Organization:
218
- """
219
- Get Organization object to be able to use it in your code.
220
-
221
- **Prerequisites**: You must be a **superuser** to use this method.
222
-
223
- You must provide at least ONE of the following params: organization_name or organization_id.
224
-
225
- :param str organization_id: optional - search by id
226
- :param str organization_name: optional - search by name
227
- :param fetch: optional - fetch entity from platform, default taken from cookie
228
- :return: Organization object
229
- :rtype: dtlpy.entities.organization.Organization
230
-
231
- **Example**:
232
-
233
- .. code-block:: python
234
-
235
- org = dl.organizations.get(organization_id='organization_id')
236
- """
237
- if organization_name is None and organization_id is None:
238
- raise exceptions.PlatformException(
239
- error='400',
240
- message='Must provide an identifier in inputs')
241
-
242
- if fetch is None:
243
- fetch = self._client_api.fetch_entities
244
-
245
- if fetch:
246
- if organization_id is not None:
247
- success, response = self._client_api.gen_request(req_type='get',
248
- path='/orgs/{}'.format(organization_id))
249
- if not success:
250
- raise exceptions.PlatformException(response)
251
- organization = entities.Organization.from_json(
252
- client_api=self._client_api,
253
- _json=response.json()
254
- )
255
- else:
256
- organizations = self.list()
257
- organization = [organization for organization in organizations if
258
- organization.name == organization_name]
259
- if not organization:
260
- # list is empty
261
- raise exceptions.PlatformException(error='404',
262
- message='organization not found. Name: {}'.format(
263
- organization_name))
264
- # project = None
265
- elif len(organization) > 1:
266
- # more than one matching project
267
- raise exceptions.PlatformException(
268
- error='404',
269
- message='More than one project with same name. Please "get" by id')
270
- else:
271
- organization = organization[0]
272
- else:
273
- organization = entities.Organization.from_json(
274
- _json={'id': organization_id,
275
- 'name': organization_name},
276
- client_api=self._client_api)
277
-
278
- return organization
279
-
280
- def update(self, plan: str,
281
- organization: entities.Organization = None,
282
- organization_id: str = None,
283
- organization_name: str = None) -> entities.Organization:
284
- """
285
- Update an organization.
286
-
287
- **Prerequisites**: You must be a **superuser** to update an organization.
288
-
289
- You must provide at least ONE of the following params: organization, organization_name, or organization_id.
290
-
291
- :param str plan: OrganizationsPlans.FREEMIUM, OrganizationsPlans.PREMIUM
292
- :param entities.Organization organization: Organization object
293
- :param str organization_id: Organization id
294
- :param str organization_name: Organization name
295
- :return: organization object
296
- :rtype: dtlpy.entities.organization.Organization
297
-
298
- **Example**:
299
-
300
- .. code-block:: python
301
-
302
- org = dl.organizations.update(organization='organization-entity',
303
- plan=dl.OrganizationsPlans.FREEMIUM)
304
- """
305
- if organization is None and organization_id is None and organization_name is None:
306
- raise exceptions.PlatformException(
307
- error='400',
308
- message='Must provide an identifier in inputs')
309
-
310
- if organization is None:
311
- organization = self.get(organization_id=organization_id, organization_name=organization_name)
312
-
313
- if plan not in list(entities.OrganizationsPlans):
314
- raise ValueError('Unknown role {!r}, role must be one of: {}'.format(plan,
315
- ', '.join(list(
316
- entities.OrganizationsPlans))))
317
- payload = {'plan': plan}
318
- url_path = '/orgs/{}/plan'.format(organization.id)
319
- success, response = self._client_api.gen_request(req_type='patch',
320
- path=url_path,
321
- json_req=payload)
322
- if success:
323
- return organization
324
- else:
325
- raise exceptions.PlatformException(response)
326
-
327
- @_api_reference.add(path='/orgs/{orgId}/members', method='post')
328
- def add_member(self, email: str,
329
- role: entities.MemberOrgRole = entities.MemberOrgRole.MEMBER,
330
- organization_id: str = None,
331
- organization_name: str = None,
332
- organization: entities.Organization = None):
333
- """
334
- Add members to your organization. Read about members and groups `here <https://dataloop.ai/docs/org-members-groups>`_.
335
-
336
- **Prerequisities**: To add members to an organization, you must be an *owner* in that organization.
337
-
338
- You must provide at least ONE of the following params: organization, organization_name, or organization_id.
339
-
340
- :param str email: the member's email
341
- :param str role: MemberOrgRole.ADMIN, MemberOrgRole.OWNER, MemberOrgRole.MEMBER, MemberOrgRole.WORKER
342
- :param str organization_id: Organization id
343
- :param str organization_name: Organization name
344
- :param entities.Organization organization: Organization object
345
- :return: True if successful or error if unsuccessful
346
- :rtype: bool
347
-
348
- **Example**:
349
-
350
- .. code-block:: python
351
-
352
- success = dl.organizations.add_member(email='user@domain.com',
353
- organization_id='organization_id',
354
- role=dl.MemberOrgRole.MEMBER)
355
- """
356
-
357
- if organization is None and organization_id is None and organization_name is None:
358
- raise exceptions.PlatformException(
359
- error='400',
360
- message='Must provide an identifier in inputs')
361
-
362
- if organization is None:
363
- organization = self.get(organization_id=organization_id, organization_name=organization_name)
364
-
365
- if not isinstance(email, list):
366
- email = [email]
367
-
368
- if role not in list(entities.MemberOrgRole):
369
- raise ValueError('Unknown role {!r}, role must be one of: {}'.format(role,
370
- ', '.join(
371
- list(entities.MemberOrgRole))))
372
-
373
- url_path = '/orgs/{}/members'.format(organization.id)
374
- payload = {"emails": email, 'role': role}
375
- success, response = self._client_api.gen_request(req_type='post',
376
- path=url_path,
377
- json_req=payload)
378
- if not success:
379
- raise exceptions.PlatformException(response)
380
- else:
381
- return True
382
-
383
- @_api_reference.add(path='/orgs/{orgId}/members/{memberId}', method='delete')
384
- def delete_member(self, user_id: str,
385
- organization_id: str = None,
386
- organization_name: str = None,
387
- organization: entities.Organization = None,
388
- sure: bool = False,
389
- really: bool = False) -> bool:
390
- """
391
- Delete member from the Organization.
392
-
393
- **Prerequisites**: Must be an organization *owner* to delete members.
394
-
395
- You must provide at least ONE of the following params: organization_id, organization_name, organization.
396
-
397
- :param str user_id: user id
398
- :param str organization_id: Organization id
399
- :param str organization_name: Organization name
400
- :param entities.Organization organization: Organization object
401
- :param bool sure: Are you sure you want to delete?
402
- :param bool really: Really really sure?
403
- :return: True if success and error if not
404
- :rtype: bool
405
-
406
- **Example**:
407
-
408
- .. code-block:: python
409
-
410
- success = dl.organizations.delete_member(user_id='user_id',
411
- organization_id='organization_id',
412
- sure=True,
413
- really=True)
414
- """
415
- if sure and really:
416
- if organization is None and organization_id is None and organization_name is None:
417
- raise exceptions.PlatformException(
418
- error='400',
419
- message='Must provide an identifier in inputs')
420
-
421
- if organization is None:
422
- organization = self.get(organization_id=organization_id, organization_name=organization_name)
423
-
424
- url_path = '/orgs/{}/members/{}'.format(organization.id, user_id)
425
- success, response = self._client_api.gen_request(req_type='delete',
426
- path=url_path)
427
- if not success:
428
- raise exceptions.PlatformException(response)
429
- else:
430
- return True
431
- else:
432
- raise exceptions.PlatformException(
433
- error='403',
434
- message='Cant delete member from SDK. Please login to platform to delete')
435
-
436
- @_api_reference.add(path='/orgs/{orgId}/members', method='patch')
437
- def update_member(self, email: str,
438
- role: entities.MemberOrgRole = entities.MemberOrgRole.MEMBER,
439
- organization_id: str = None,
440
- organization_name: str = None,
441
- organization: entities.Organization = None):
442
- """
443
- Update member role.
444
-
445
- **Prerequisites**: You must be an organization *owner* to update a member's role.
446
-
447
- You must provide at least ONE of the following params: organization, organization_name, or organization_id.
448
-
449
- :param str email: the member's email
450
- :param str role: MemberOrgRole.ADMIN, MemberOrgRole.OWNER, MemberOrgRole.MEMBER, MemberOrgRole.WORKER
451
- :param str organization_id: Organization id
452
- :param str organization_name: Organization name
453
- :param entities.Organization organization: Organization object
454
- :return: json of the member fields
455
- :rtype: dict
456
-
457
- **Example**:
458
-
459
- .. code-block:: python
460
-
461
- member_json = dl.organizations.update_member(email='user@domain.com',
462
- organization_id='organization_id',
463
- role=dl.MemberOrgRole.MEMBER)
464
- """
465
- if organization is None and organization_id is None and organization_name is None:
466
- raise exceptions.PlatformException(
467
- error='400',
468
- message='Must provide an identifier in inputs')
469
-
470
- if organization is None:
471
- organization = self.get(organization_id=organization_id, organization_name=organization_name)
472
-
473
- url_path = '/orgs/{}/members'.format(organization.id)
474
- payload = dict(role=role, email=email)
475
-
476
- if role not in list(entities.MemberOrgRole):
477
- raise ValueError('Unknown role {!r}, role must be one of: {}'.format(role,
478
- ', '.join(
479
- list(entities.MemberOrgRole))))
480
-
481
- success, response = self._client_api.gen_request(req_type='patch',
482
- path=url_path,
483
- json_req=payload)
484
- if not success:
485
- raise exceptions.PlatformException(response)
486
-
487
- return response.json()
488
-
489
- def cache_action(self,
490
- organization_id: str = None,
491
- organization_name: str = None,
492
- organization: entities.Organization = None,
493
- mode=entities.CacheAction.APPLY,
494
- pod_type=entities.PodType.SMALL):
495
- """
496
- Add or remove Cache for the org
497
-
498
- **Prerequisites**: You must be an organization *owner*
499
-
500
- You must provide at least ONE of the following params: organization, organization_name, or organization_id.
501
-
502
- :param str organization_id: Organization id
503
- :param str organization_name: Organization name
504
- :param entities.Organization organization: Organization object
505
- :param str mode: dl.CacheAction.APPLY or dl.CacheAction.DESTROY
506
- :param entities.PodType pod_type: dl.PodType.SMALL, dl.PodType.MEDIUM, dl.PodType.HIGH
507
- :return: True if success
508
- :rtype: bool
509
-
510
- **Example**:
511
-
512
- .. code-block:: python
513
-
514
- success = dl.organizations.enable_cache(organization_id='organization_id',
515
- mode=dl.CacheAction.APPLY)
516
- """
517
- if organization is None and organization_id is None and organization_name is None:
518
- raise exceptions.PlatformException(
519
- error='400',
520
- message='Must provide an identifier in inputs')
521
-
522
- if organization is None:
523
- organization = self.get(organization_id=organization_id, organization_name=organization_name)
524
-
525
- return organization.cache_action(mode=mode, pod_type=pod_type)
1
+ import logging
2
+
3
+ from .. import entities, miscellaneous, exceptions, _api_reference
4
+ from ..services.api_client import ApiClient
5
+
6
+ logger = logging.getLogger(name='dtlpy')
7
+
8
+
9
+ class Organizations:
10
+ """
11
+ Organizations Repository
12
+
13
+ Read our `documentation <https://dataloop.ai/docs/org-setup>`_ to learn more about Organizations in the Dataloop platform.
14
+ """
15
+
16
+ def __init__(self, client_api: ApiClient):
17
+ self._client_api = client_api
18
+
19
+ def create(self, organization_json: dict) -> entities.Organization:
20
+ """
21
+ Create a new organization.
22
+
23
+ **Prerequisites**: This method can only be used by a **superuser**.
24
+
25
+ :param dict organization_json: json contain the Organization fields
26
+ :return: Organization object
27
+ :rtype: dtlpy.entities.organization.Organization
28
+ """
29
+
30
+ raise exceptions.PlatformException(error='2001', message='Method organizations.create() was removed')
31
+
32
+ def list_groups(self, organization: entities.Organization = None,
33
+ organization_id: str = None,
34
+ organization_name: str = None):
35
+ """
36
+ List all organization groups (groups that were created within the organization).
37
+
38
+ **Prerequisites**: You must be an organization *owner* to use this method.
39
+
40
+ You must provide at least ONE of the following params: organization, organization_name, or organization_id.
41
+
42
+ :param entities.Organization organization: Organization object
43
+ :param str organization_id: Organization id
44
+ :param str organization_name: Organization name
45
+ :return: groups list
46
+ :rtype: list
47
+
48
+ **Example**:
49
+
50
+ .. code-block:: python
51
+
52
+ groups_list = dl.organizations.list_groups(organization_id='organization_id')
53
+ """
54
+ if organization is None and organization_id is None and organization_name is None:
55
+ raise exceptions.PlatformException(
56
+ error='400',
57
+ message='Must provide an identifier in inputs')
58
+
59
+ if organization is None:
60
+ organization = self.get(organization_id=organization_id, organization_name=organization_name)
61
+
62
+ url_path = '/orgs/{}/groups'.format(organization.id)
63
+
64
+ success, response = self._client_api.gen_request(req_type='get',
65
+ path=url_path)
66
+ if not success:
67
+ raise exceptions.PlatformException(response)
68
+
69
+ groups = miscellaneous.List(response.json())
70
+ return groups
71
+
72
+ def list_integrations(self, organization: entities.Organization = None,
73
+ organization_id: str = None,
74
+ organization_name: str = None,
75
+ only_available=False):
76
+ """
77
+ List all organization integrations with external cloud storage.
78
+
79
+ **Prerequisites**: You must be an organization *owner* to use this method.
80
+
81
+ You must provide at least ONE of the following params: organization_id, organization_name, or organization.
82
+
83
+ :param entities.Organization organization: Organization object
84
+ :param str organization_id: Organization id
85
+ :param str organization_name: Organization name
86
+ :param bool only_available: if True list only the available integrations
87
+ :return: integrations list
88
+ :rtype: list
89
+
90
+ **Example**:
91
+
92
+ .. code-block:: python
93
+
94
+ list_integrations = dl.organizations.list_integrations(organization='organization-entity',
95
+ only_available=True)
96
+ """
97
+ if organization is None and organization_id is None and organization_name is None:
98
+ raise exceptions.PlatformException(
99
+ error='400',
100
+ message='Must provide an identifier in inputs')
101
+
102
+ if organization is None:
103
+ organization = self.get(organization_id=organization_id, organization_name=organization_name)
104
+
105
+ if only_available:
106
+ url_path = '/orgs/{}/availableIntegrations'.format(organization.id)
107
+ else:
108
+ url_path = '/orgs/{}/integrations'.format(organization.id)
109
+
110
+ success, response = self._client_api.gen_request(req_type='get',
111
+ path=url_path)
112
+ if not success:
113
+ raise exceptions.PlatformException(response)
114
+
115
+ available_integrations = miscellaneous.List(response.json())
116
+ return available_integrations
117
+
118
+ @_api_reference.add(path='/orgs/{orgId}/members', method='get')
119
+ def list_members(self, organization: entities.Organization = None,
120
+ organization_id: str = None,
121
+ organization_name: str = None,
122
+ role: entities.MemberOrgRole = None):
123
+ """
124
+ List all organization members.
125
+
126
+ **Prerequisites**: You must be an organization *owner* to use this method.
127
+
128
+ You must provide at least ONE of the following params: organization_id, organization_name, or organization.
129
+
130
+ :param entities.Organization organization: Organization object
131
+ :param str organization_id: Organization id
132
+ :param str organization_name: Organization name
133
+ :param entities.MemberOrgRole role: MemberOrgRole.ADMIN, MemberOrgRole.OWNER, MemberOrgRole.MEMBER, MemberOrgRole.WORKER
134
+ :return: projects list
135
+ :rtype: list
136
+
137
+ **Example**:
138
+
139
+ .. code-block:: python
140
+
141
+ list_members = dl.organizations.list_members(organization='organization-entity',
142
+ role=dl.MemberOrgRole.MEMBER)
143
+ """
144
+ if organization is None and organization_id is None and organization_name is None:
145
+ raise exceptions.PlatformException(
146
+ error='400',
147
+ message='Must provide an identifier in inputs')
148
+
149
+ if organization is None:
150
+ organization = self.get(organization_id=organization_id, organization_name=organization_name)
151
+
152
+ url_path = '/orgs/{}/members'.format(organization.id)
153
+
154
+ if role is not None and role not in list(entities.MemberOrgRole):
155
+ raise ValueError('Unknown role {!r}, role must be one of: {}'.format(role,
156
+ ', '.join(
157
+ list(entities.MemberOrgRole))))
158
+
159
+ success, response = self._client_api.gen_request(req_type='get',
160
+ path=url_path)
161
+ if not success:
162
+ raise exceptions.PlatformException(response)
163
+
164
+ members = miscellaneous.List(
165
+ [entities.User.from_json(_json=user, client_api=self._client_api, project=None) for user in
166
+ response.json()])
167
+
168
+ if role is not None:
169
+ members = [member for member in members if member.role == role]
170
+
171
+ return members
172
+
173
+ @_api_reference.add(path='/orgs', method='get')
174
+ def list(self) -> miscellaneous.List[entities.Organization]:
175
+ """
176
+ Lists all the organizations in Dataloop.
177
+
178
+ **Prerequisites**: You must be a **superuser** to use this method.
179
+
180
+ :return: List of Organization objects
181
+ :rtype: list
182
+
183
+ **Example**:
184
+
185
+ .. code-block:: python
186
+
187
+ organizations = dl.organizations.list()
188
+ """
189
+ success, response = self._client_api.gen_request(req_type='get',
190
+ path='/orgs')
191
+
192
+ if success:
193
+ pool = self._client_api.thread_pools(pool_name='entity.create')
194
+ organization_json = response.json()
195
+ jobs = [None for _ in range(len(organization_json))]
196
+ # return triggers list
197
+ for i_organization, organization in enumerate(organization_json):
198
+ jobs[i_organization] = pool.submit(entities.Organization._protected_from_json,
199
+ **{'client_api': self._client_api,
200
+ '_json': organization})
201
+
202
+ # get all results
203
+ results = [j.result() for j in jobs]
204
+ # log errors
205
+ _ = [logger.warning(r[1]) for r in results if r[0] is False]
206
+ # return good jobs
207
+ organization = miscellaneous.List([r[1] for r in results if r[0] is True])
208
+ else:
209
+ logger.error('Platform error getting organization')
210
+ raise exceptions.PlatformException(response)
211
+ return organization
212
+
213
+ @_api_reference.add(path='/orgs/{orgId}', method='get')
214
+ def get(self,
215
+ organization_id: str = None,
216
+ organization_name: str = None,
217
+ fetch: bool = None) -> entities.Organization:
218
+ """
219
+ Get Organization object to be able to use it in your code.
220
+
221
+ **Prerequisites**: You must be a **superuser** to use this method.
222
+
223
+ You must provide at least ONE of the following params: organization_name or organization_id.
224
+
225
+ :param str organization_id: optional - search by id
226
+ :param str organization_name: optional - search by name
227
+ :param fetch: optional - fetch entity from platform, default taken from cookie
228
+ :return: Organization object
229
+ :rtype: dtlpy.entities.organization.Organization
230
+
231
+ **Example**:
232
+
233
+ .. code-block:: python
234
+
235
+ org = dl.organizations.get(organization_id='organization_id')
236
+ """
237
+ if organization_name is None and organization_id is None:
238
+ raise exceptions.PlatformException(
239
+ error='400',
240
+ message='Must provide an identifier in inputs')
241
+
242
+ if fetch is None:
243
+ fetch = self._client_api.fetch_entities
244
+
245
+ if fetch:
246
+ if organization_id is not None:
247
+ success, response = self._client_api.gen_request(req_type='get',
248
+ path='/orgs/{}'.format(organization_id))
249
+ if not success:
250
+ raise exceptions.PlatformException(response)
251
+ organization = entities.Organization.from_json(
252
+ client_api=self._client_api,
253
+ _json=response.json()
254
+ )
255
+ else:
256
+ organizations = self.list()
257
+ organization = [organization for organization in organizations if
258
+ organization.name == organization_name]
259
+ if not organization:
260
+ # list is empty
261
+ raise exceptions.PlatformException(error='404',
262
+ message='organization not found. Name: {}'.format(
263
+ organization_name))
264
+ # project = None
265
+ elif len(organization) > 1:
266
+ # more than one matching project
267
+ raise exceptions.PlatformException(
268
+ error='404',
269
+ message='More than one project with same name. Please "get" by id')
270
+ else:
271
+ organization = organization[0]
272
+ else:
273
+ organization = entities.Organization.from_json(
274
+ _json={'id': organization_id,
275
+ 'name': organization_name},
276
+ client_api=self._client_api)
277
+
278
+ return organization
279
+
280
+ def update(self, plan: str,
281
+ organization: entities.Organization = None,
282
+ organization_id: str = None,
283
+ organization_name: str = None) -> entities.Organization:
284
+ """
285
+ Update an organization.
286
+
287
+ **Prerequisites**: You must be a **superuser** to update an organization.
288
+
289
+ You must provide at least ONE of the following params: organization, organization_name, or organization_id.
290
+
291
+ :param str plan: OrganizationsPlans.FREEMIUM, OrganizationsPlans.PREMIUM
292
+ :param entities.Organization organization: Organization object
293
+ :param str organization_id: Organization id
294
+ :param str organization_name: Organization name
295
+ :return: organization object
296
+ :rtype: dtlpy.entities.organization.Organization
297
+
298
+ **Example**:
299
+
300
+ .. code-block:: python
301
+
302
+ org = dl.organizations.update(organization='organization-entity',
303
+ plan=dl.OrganizationsPlans.FREEMIUM)
304
+ """
305
+ if organization is None and organization_id is None and organization_name is None:
306
+ raise exceptions.PlatformException(
307
+ error='400',
308
+ message='Must provide an identifier in inputs')
309
+
310
+ if organization is None:
311
+ organization = self.get(organization_id=organization_id, organization_name=organization_name)
312
+
313
+ if plan not in list(entities.OrganizationsPlans):
314
+ raise ValueError('Unknown role {!r}, role must be one of: {}'.format(plan,
315
+ ', '.join(list(
316
+ entities.OrganizationsPlans))))
317
+ payload = {'plan': plan}
318
+ url_path = '/orgs/{}/plan'.format(organization.id)
319
+ success, response = self._client_api.gen_request(req_type='patch',
320
+ path=url_path,
321
+ json_req=payload)
322
+ if success:
323
+ return organization
324
+ else:
325
+ raise exceptions.PlatformException(response)
326
+
327
+ @_api_reference.add(path='/orgs/{orgId}/members', method='post')
328
+ def add_member(self, email: str,
329
+ role: entities.MemberOrgRole = entities.MemberOrgRole.MEMBER,
330
+ organization_id: str = None,
331
+ organization_name: str = None,
332
+ organization: entities.Organization = None):
333
+ """
334
+ Add members to your organization. Read about members and groups `here <https://dataloop.ai/docs/org-members-groups>`_.
335
+
336
+ **Prerequisities**: To add members to an organization, you must be an *owner* in that organization.
337
+
338
+ You must provide at least ONE of the following params: organization, organization_name, or organization_id.
339
+
340
+ :param str email: the member's email
341
+ :param str role: MemberOrgRole.ADMIN, MemberOrgRole.OWNER, MemberOrgRole.MEMBER, MemberOrgRole.WORKER
342
+ :param str organization_id: Organization id
343
+ :param str organization_name: Organization name
344
+ :param entities.Organization organization: Organization object
345
+ :return: True if successful or error if unsuccessful
346
+ :rtype: bool
347
+
348
+ **Example**:
349
+
350
+ .. code-block:: python
351
+
352
+ success = dl.organizations.add_member(email='user@domain.com',
353
+ organization_id='organization_id',
354
+ role=dl.MemberOrgRole.MEMBER)
355
+ """
356
+
357
+ if organization is None and organization_id is None and organization_name is None:
358
+ raise exceptions.PlatformException(
359
+ error='400',
360
+ message='Must provide an identifier in inputs')
361
+
362
+ if organization is None:
363
+ organization = self.get(organization_id=organization_id, organization_name=organization_name)
364
+
365
+ if not isinstance(email, list):
366
+ email = [email]
367
+
368
+ if role not in list(entities.MemberOrgRole):
369
+ raise ValueError('Unknown role {!r}, role must be one of: {}'.format(role,
370
+ ', '.join(
371
+ list(entities.MemberOrgRole))))
372
+
373
+ url_path = '/orgs/{}/members'.format(organization.id)
374
+ payload = {"emails": email, 'role': role}
375
+ success, response = self._client_api.gen_request(req_type='post',
376
+ path=url_path,
377
+ json_req=payload)
378
+ if not success:
379
+ raise exceptions.PlatformException(response)
380
+ else:
381
+ return True
382
+
383
+ @_api_reference.add(path='/orgs/{orgId}/members/{memberId}', method='delete')
384
+ def delete_member(self, user_id: str,
385
+ organization_id: str = None,
386
+ organization_name: str = None,
387
+ organization: entities.Organization = None,
388
+ sure: bool = False,
389
+ really: bool = False) -> bool:
390
+ """
391
+ Delete member from the Organization.
392
+
393
+ **Prerequisites**: Must be an organization *owner* to delete members.
394
+
395
+ You must provide at least ONE of the following params: organization_id, organization_name, organization.
396
+
397
+ :param str user_id: user id
398
+ :param str organization_id: Organization id
399
+ :param str organization_name: Organization name
400
+ :param entities.Organization organization: Organization object
401
+ :param bool sure: Are you sure you want to delete?
402
+ :param bool really: Really really sure?
403
+ :return: True if success and error if not
404
+ :rtype: bool
405
+
406
+ **Example**:
407
+
408
+ .. code-block:: python
409
+
410
+ success = dl.organizations.delete_member(user_id='user_id',
411
+ organization_id='organization_id',
412
+ sure=True,
413
+ really=True)
414
+ """
415
+ if sure and really:
416
+ if organization is None and organization_id is None and organization_name is None:
417
+ raise exceptions.PlatformException(
418
+ error='400',
419
+ message='Must provide an identifier in inputs')
420
+
421
+ if organization is None:
422
+ organization = self.get(organization_id=organization_id, organization_name=organization_name)
423
+
424
+ url_path = '/orgs/{}/members/{}'.format(organization.id, user_id)
425
+ success, response = self._client_api.gen_request(req_type='delete',
426
+ path=url_path)
427
+ if not success:
428
+ raise exceptions.PlatformException(response)
429
+ else:
430
+ return True
431
+ else:
432
+ raise exceptions.PlatformException(
433
+ error='403',
434
+ message='Cant delete member from SDK. Please login to platform to delete')
435
+
436
+ @_api_reference.add(path='/orgs/{orgId}/members', method='patch')
437
+ def update_member(self, email: str,
438
+ role: entities.MemberOrgRole = entities.MemberOrgRole.MEMBER,
439
+ organization_id: str = None,
440
+ organization_name: str = None,
441
+ organization: entities.Organization = None):
442
+ """
443
+ Update member role.
444
+
445
+ **Prerequisites**: You must be an organization *owner* to update a member's role.
446
+
447
+ You must provide at least ONE of the following params: organization, organization_name, or organization_id.
448
+
449
+ :param str email: the member's email
450
+ :param str role: MemberOrgRole.ADMIN, MemberOrgRole.OWNER, MemberOrgRole.MEMBER, MemberOrgRole.WORKER
451
+ :param str organization_id: Organization id
452
+ :param str organization_name: Organization name
453
+ :param entities.Organization organization: Organization object
454
+ :return: json of the member fields
455
+ :rtype: dict
456
+
457
+ **Example**:
458
+
459
+ .. code-block:: python
460
+
461
+ member_json = dl.organizations.update_member(email='user@domain.com',
462
+ organization_id='organization_id',
463
+ role=dl.MemberOrgRole.MEMBER)
464
+ """
465
+ if organization is None and organization_id is None and organization_name is None:
466
+ raise exceptions.PlatformException(
467
+ error='400',
468
+ message='Must provide an identifier in inputs')
469
+
470
+ if organization is None:
471
+ organization = self.get(organization_id=organization_id, organization_name=organization_name)
472
+
473
+ url_path = '/orgs/{}/members'.format(organization.id)
474
+ payload = dict(role=role, email=email)
475
+
476
+ if role not in list(entities.MemberOrgRole):
477
+ raise ValueError('Unknown role {!r}, role must be one of: {}'.format(role,
478
+ ', '.join(
479
+ list(entities.MemberOrgRole))))
480
+
481
+ success, response = self._client_api.gen_request(req_type='patch',
482
+ path=url_path,
483
+ json_req=payload)
484
+ if not success:
485
+ raise exceptions.PlatformException(response)
486
+
487
+ return response.json()
488
+
489
+ def cache_action(self,
490
+ organization_id: str = None,
491
+ organization_name: str = None,
492
+ organization: entities.Organization = None,
493
+ mode=entities.CacheAction.APPLY,
494
+ pod_type=entities.PodType.SMALL):
495
+ """
496
+ Add or remove Cache for the org
497
+
498
+ **Prerequisites**: You must be an organization *owner*
499
+
500
+ You must provide at least ONE of the following params: organization, organization_name, or organization_id.
501
+
502
+ :param str organization_id: Organization id
503
+ :param str organization_name: Organization name
504
+ :param entities.Organization organization: Organization object
505
+ :param str mode: dl.CacheAction.APPLY or dl.CacheAction.DESTROY
506
+ :param entities.PodType pod_type: dl.PodType.SMALL, dl.PodType.MEDIUM, dl.PodType.HIGH
507
+ :return: True if success
508
+ :rtype: bool
509
+
510
+ **Example**:
511
+
512
+ .. code-block:: python
513
+
514
+ success = dl.organizations.enable_cache(organization_id='organization_id',
515
+ mode=dl.CacheAction.APPLY)
516
+ """
517
+ if organization is None and organization_id is None and organization_name is None:
518
+ raise exceptions.PlatformException(
519
+ error='400',
520
+ message='Must provide an identifier in inputs')
521
+
522
+ if organization is None:
523
+ organization = self.get(organization_id=organization_id, organization_name=organization_name)
524
+
525
+ return organization.cache_action(mode=mode, pod_type=pod_type)