dtlpy 1.113.10__py3-none-any.whl → 1.114.13__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 (243) hide show
  1. dtlpy/__init__.py +488 -488
  2. dtlpy/__version__.py +1 -1
  3. dtlpy/assets/__init__.py +26 -26
  4. dtlpy/assets/__pycache__/__init__.cpython-38.pyc +0 -0
  5. dtlpy/assets/code_server/config.yaml +2 -2
  6. dtlpy/assets/code_server/installation.sh +24 -24
  7. dtlpy/assets/code_server/launch.json +13 -13
  8. dtlpy/assets/code_server/settings.json +2 -2
  9. dtlpy/assets/main.py +53 -53
  10. dtlpy/assets/main_partial.py +18 -18
  11. dtlpy/assets/mock.json +11 -11
  12. dtlpy/assets/model_adapter.py +83 -83
  13. dtlpy/assets/package.json +61 -61
  14. dtlpy/assets/package_catalog.json +29 -29
  15. dtlpy/assets/package_gitignore +307 -307
  16. dtlpy/assets/service_runners/__init__.py +33 -33
  17. dtlpy/assets/service_runners/converter.py +96 -96
  18. dtlpy/assets/service_runners/multi_method.py +49 -49
  19. dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
  20. dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
  21. dtlpy/assets/service_runners/multi_method_item.py +52 -52
  22. dtlpy/assets/service_runners/multi_method_json.py +52 -52
  23. dtlpy/assets/service_runners/single_method.py +37 -37
  24. dtlpy/assets/service_runners/single_method_annotation.py +43 -43
  25. dtlpy/assets/service_runners/single_method_dataset.py +43 -43
  26. dtlpy/assets/service_runners/single_method_item.py +41 -41
  27. dtlpy/assets/service_runners/single_method_json.py +42 -42
  28. dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
  29. dtlpy/assets/voc_annotation_template.xml +23 -23
  30. dtlpy/caches/base_cache.py +32 -32
  31. dtlpy/caches/cache.py +473 -473
  32. dtlpy/caches/dl_cache.py +201 -201
  33. dtlpy/caches/filesystem_cache.py +89 -89
  34. dtlpy/caches/redis_cache.py +84 -84
  35. dtlpy/dlp/__init__.py +20 -20
  36. dtlpy/dlp/cli_utilities.py +367 -367
  37. dtlpy/dlp/command_executor.py +764 -764
  38. dtlpy/dlp/dlp +1 -1
  39. dtlpy/dlp/dlp.bat +1 -1
  40. dtlpy/dlp/dlp.py +128 -128
  41. dtlpy/dlp/parser.py +651 -651
  42. dtlpy/entities/__init__.py +83 -83
  43. dtlpy/entities/analytic.py +311 -311
  44. dtlpy/entities/annotation.py +1879 -1879
  45. dtlpy/entities/annotation_collection.py +699 -699
  46. dtlpy/entities/annotation_definitions/__init__.py +20 -20
  47. dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
  48. dtlpy/entities/annotation_definitions/box.py +195 -195
  49. dtlpy/entities/annotation_definitions/classification.py +67 -67
  50. dtlpy/entities/annotation_definitions/comparison.py +72 -72
  51. dtlpy/entities/annotation_definitions/cube.py +204 -204
  52. dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
  53. dtlpy/entities/annotation_definitions/description.py +32 -32
  54. dtlpy/entities/annotation_definitions/ellipse.py +124 -124
  55. dtlpy/entities/annotation_definitions/free_text.py +62 -62
  56. dtlpy/entities/annotation_definitions/gis.py +69 -69
  57. dtlpy/entities/annotation_definitions/note.py +139 -139
  58. dtlpy/entities/annotation_definitions/point.py +117 -117
  59. dtlpy/entities/annotation_definitions/polygon.py +182 -182
  60. dtlpy/entities/annotation_definitions/polyline.py +111 -111
  61. dtlpy/entities/annotation_definitions/pose.py +92 -92
  62. dtlpy/entities/annotation_definitions/ref_image.py +86 -86
  63. dtlpy/entities/annotation_definitions/segmentation.py +240 -240
  64. dtlpy/entities/annotation_definitions/subtitle.py +34 -34
  65. dtlpy/entities/annotation_definitions/text.py +85 -85
  66. dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
  67. dtlpy/entities/app.py +220 -220
  68. dtlpy/entities/app_module.py +107 -107
  69. dtlpy/entities/artifact.py +174 -174
  70. dtlpy/entities/assignment.py +399 -399
  71. dtlpy/entities/base_entity.py +214 -214
  72. dtlpy/entities/bot.py +113 -113
  73. dtlpy/entities/codebase.py +296 -296
  74. dtlpy/entities/collection.py +38 -38
  75. dtlpy/entities/command.py +169 -169
  76. dtlpy/entities/compute.py +442 -442
  77. dtlpy/entities/dataset.py +1285 -1285
  78. dtlpy/entities/directory_tree.py +44 -44
  79. dtlpy/entities/dpk.py +470 -470
  80. dtlpy/entities/driver.py +222 -222
  81. dtlpy/entities/execution.py +397 -397
  82. dtlpy/entities/feature.py +124 -124
  83. dtlpy/entities/feature_set.py +145 -145
  84. dtlpy/entities/filters.py +641 -641
  85. dtlpy/entities/gis_item.py +107 -107
  86. dtlpy/entities/integration.py +184 -184
  87. dtlpy/entities/item.py +953 -953
  88. dtlpy/entities/label.py +123 -123
  89. dtlpy/entities/links.py +85 -85
  90. dtlpy/entities/message.py +175 -175
  91. dtlpy/entities/model.py +694 -691
  92. dtlpy/entities/node.py +1005 -1005
  93. dtlpy/entities/ontology.py +803 -803
  94. dtlpy/entities/organization.py +287 -287
  95. dtlpy/entities/package.py +657 -657
  96. dtlpy/entities/package_defaults.py +5 -5
  97. dtlpy/entities/package_function.py +185 -185
  98. dtlpy/entities/package_module.py +113 -113
  99. dtlpy/entities/package_slot.py +118 -118
  100. dtlpy/entities/paged_entities.py +290 -267
  101. dtlpy/entities/pipeline.py +593 -593
  102. dtlpy/entities/pipeline_execution.py +279 -279
  103. dtlpy/entities/project.py +394 -394
  104. dtlpy/entities/prompt_item.py +499 -499
  105. dtlpy/entities/recipe.py +301 -301
  106. dtlpy/entities/reflect_dict.py +102 -102
  107. dtlpy/entities/resource_execution.py +138 -138
  108. dtlpy/entities/service.py +958 -958
  109. dtlpy/entities/service_driver.py +117 -117
  110. dtlpy/entities/setting.py +294 -294
  111. dtlpy/entities/task.py +491 -491
  112. dtlpy/entities/time_series.py +143 -143
  113. dtlpy/entities/trigger.py +426 -426
  114. dtlpy/entities/user.py +118 -118
  115. dtlpy/entities/webhook.py +124 -124
  116. dtlpy/examples/__init__.py +19 -19
  117. dtlpy/examples/add_labels.py +135 -135
  118. dtlpy/examples/add_metadata_to_item.py +21 -21
  119. dtlpy/examples/annotate_items_using_model.py +65 -65
  120. dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
  121. dtlpy/examples/annotations_convert_to_voc.py +9 -9
  122. dtlpy/examples/annotations_convert_to_yolo.py +9 -9
  123. dtlpy/examples/convert_annotation_types.py +51 -51
  124. dtlpy/examples/converter.py +143 -143
  125. dtlpy/examples/copy_annotations.py +22 -22
  126. dtlpy/examples/copy_folder.py +31 -31
  127. dtlpy/examples/create_annotations.py +51 -51
  128. dtlpy/examples/create_video_annotations.py +83 -83
  129. dtlpy/examples/delete_annotations.py +26 -26
  130. dtlpy/examples/filters.py +113 -113
  131. dtlpy/examples/move_item.py +23 -23
  132. dtlpy/examples/play_video_annotation.py +13 -13
  133. dtlpy/examples/show_item_and_mask.py +53 -53
  134. dtlpy/examples/triggers.py +49 -49
  135. dtlpy/examples/upload_batch_of_items.py +20 -20
  136. dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
  137. dtlpy/examples/upload_items_with_modalities.py +43 -43
  138. dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
  139. dtlpy/examples/upload_yolo_format_annotations.py +70 -70
  140. dtlpy/exceptions.py +125 -125
  141. dtlpy/miscellaneous/__init__.py +20 -20
  142. dtlpy/miscellaneous/dict_differ.py +95 -95
  143. dtlpy/miscellaneous/git_utils.py +217 -217
  144. dtlpy/miscellaneous/json_utils.py +14 -14
  145. dtlpy/miscellaneous/list_print.py +105 -105
  146. dtlpy/miscellaneous/zipping.py +130 -130
  147. dtlpy/ml/__init__.py +20 -20
  148. dtlpy/ml/base_feature_extractor_adapter.py +27 -27
  149. dtlpy/ml/base_model_adapter.py +945 -940
  150. dtlpy/ml/metrics.py +461 -461
  151. dtlpy/ml/predictions_utils.py +274 -274
  152. dtlpy/ml/summary_writer.py +57 -57
  153. dtlpy/ml/train_utils.py +60 -60
  154. dtlpy/new_instance.py +252 -252
  155. dtlpy/repositories/__init__.py +56 -56
  156. dtlpy/repositories/analytics.py +85 -85
  157. dtlpy/repositories/annotations.py +916 -916
  158. dtlpy/repositories/apps.py +383 -383
  159. dtlpy/repositories/artifacts.py +452 -452
  160. dtlpy/repositories/assignments.py +599 -599
  161. dtlpy/repositories/bots.py +213 -213
  162. dtlpy/repositories/codebases.py +559 -559
  163. dtlpy/repositories/collections.py +332 -348
  164. dtlpy/repositories/commands.py +158 -158
  165. dtlpy/repositories/compositions.py +61 -61
  166. dtlpy/repositories/computes.py +434 -406
  167. dtlpy/repositories/datasets.py +1291 -1291
  168. dtlpy/repositories/downloader.py +895 -895
  169. dtlpy/repositories/dpks.py +433 -433
  170. dtlpy/repositories/drivers.py +266 -266
  171. dtlpy/repositories/executions.py +817 -817
  172. dtlpy/repositories/feature_sets.py +226 -226
  173. dtlpy/repositories/features.py +238 -238
  174. dtlpy/repositories/integrations.py +484 -484
  175. dtlpy/repositories/items.py +909 -915
  176. dtlpy/repositories/messages.py +94 -94
  177. dtlpy/repositories/models.py +877 -867
  178. dtlpy/repositories/nodes.py +80 -80
  179. dtlpy/repositories/ontologies.py +511 -511
  180. dtlpy/repositories/organizations.py +525 -525
  181. dtlpy/repositories/packages.py +1941 -1941
  182. dtlpy/repositories/pipeline_executions.py +448 -448
  183. dtlpy/repositories/pipelines.py +642 -642
  184. dtlpy/repositories/projects.py +539 -539
  185. dtlpy/repositories/recipes.py +399 -399
  186. dtlpy/repositories/resource_executions.py +137 -137
  187. dtlpy/repositories/schema.py +120 -120
  188. dtlpy/repositories/service_drivers.py +213 -213
  189. dtlpy/repositories/services.py +1704 -1704
  190. dtlpy/repositories/settings.py +339 -339
  191. dtlpy/repositories/tasks.py +1124 -1124
  192. dtlpy/repositories/times_series.py +278 -278
  193. dtlpy/repositories/triggers.py +536 -536
  194. dtlpy/repositories/upload_element.py +257 -257
  195. dtlpy/repositories/uploader.py +651 -651
  196. dtlpy/repositories/webhooks.py +249 -249
  197. dtlpy/services/__init__.py +22 -22
  198. dtlpy/services/aihttp_retry.py +131 -131
  199. dtlpy/services/api_client.py +1782 -1782
  200. dtlpy/services/api_reference.py +40 -40
  201. dtlpy/services/async_utils.py +133 -133
  202. dtlpy/services/calls_counter.py +44 -44
  203. dtlpy/services/check_sdk.py +68 -68
  204. dtlpy/services/cookie.py +115 -115
  205. dtlpy/services/create_logger.py +156 -156
  206. dtlpy/services/events.py +84 -84
  207. dtlpy/services/logins.py +235 -235
  208. dtlpy/services/reporter.py +256 -256
  209. dtlpy/services/service_defaults.py +91 -91
  210. dtlpy/utilities/__init__.py +20 -20
  211. dtlpy/utilities/annotations/__init__.py +16 -16
  212. dtlpy/utilities/annotations/annotation_converters.py +269 -269
  213. dtlpy/utilities/base_package_runner.py +264 -264
  214. dtlpy/utilities/converter.py +1650 -1650
  215. dtlpy/utilities/dataset_generators/__init__.py +1 -1
  216. dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
  217. dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
  218. dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
  219. dtlpy/utilities/local_development/__init__.py +1 -1
  220. dtlpy/utilities/local_development/local_session.py +179 -179
  221. dtlpy/utilities/reports/__init__.py +2 -2
  222. dtlpy/utilities/reports/figures.py +343 -343
  223. dtlpy/utilities/reports/report.py +71 -71
  224. dtlpy/utilities/videos/__init__.py +17 -17
  225. dtlpy/utilities/videos/video_player.py +598 -598
  226. dtlpy/utilities/videos/videos.py +470 -470
  227. {dtlpy-1.113.10.data → dtlpy-1.114.13.data}/scripts/dlp +1 -1
  228. dtlpy-1.114.13.data/scripts/dlp.bat +2 -0
  229. {dtlpy-1.113.10.data → dtlpy-1.114.13.data}/scripts/dlp.py +128 -128
  230. {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/LICENSE +200 -200
  231. {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/METADATA +172 -172
  232. dtlpy-1.114.13.dist-info/RECORD +240 -0
  233. {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/WHEEL +1 -1
  234. tests/features/environment.py +551 -550
  235. dtlpy-1.113.10.data/scripts/dlp.bat +0 -2
  236. dtlpy-1.113.10.dist-info/RECORD +0 -244
  237. tests/assets/__init__.py +0 -0
  238. tests/assets/models_flow/__init__.py +0 -0
  239. tests/assets/models_flow/failedmain.py +0 -52
  240. tests/assets/models_flow/main.py +0 -62
  241. tests/assets/models_flow/main_model.py +0 -54
  242. {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/entry_points.txt +0 -0
  243. {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.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)