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.
- dtlpy/__init__.py +488 -488
- dtlpy/__version__.py +1 -1
- dtlpy/assets/__init__.py +26 -26
- dtlpy/assets/__pycache__/__init__.cpython-38.pyc +0 -0
- dtlpy/assets/code_server/config.yaml +2 -2
- dtlpy/assets/code_server/installation.sh +24 -24
- dtlpy/assets/code_server/launch.json +13 -13
- dtlpy/assets/code_server/settings.json +2 -2
- dtlpy/assets/main.py +53 -53
- dtlpy/assets/main_partial.py +18 -18
- dtlpy/assets/mock.json +11 -11
- dtlpy/assets/model_adapter.py +83 -83
- dtlpy/assets/package.json +61 -61
- dtlpy/assets/package_catalog.json +29 -29
- dtlpy/assets/package_gitignore +307 -307
- dtlpy/assets/service_runners/__init__.py +33 -33
- dtlpy/assets/service_runners/converter.py +96 -96
- dtlpy/assets/service_runners/multi_method.py +49 -49
- dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
- dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
- dtlpy/assets/service_runners/multi_method_item.py +52 -52
- dtlpy/assets/service_runners/multi_method_json.py +52 -52
- dtlpy/assets/service_runners/single_method.py +37 -37
- dtlpy/assets/service_runners/single_method_annotation.py +43 -43
- dtlpy/assets/service_runners/single_method_dataset.py +43 -43
- dtlpy/assets/service_runners/single_method_item.py +41 -41
- dtlpy/assets/service_runners/single_method_json.py +42 -42
- dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
- dtlpy/assets/voc_annotation_template.xml +23 -23
- dtlpy/caches/base_cache.py +32 -32
- dtlpy/caches/cache.py +473 -473
- dtlpy/caches/dl_cache.py +201 -201
- dtlpy/caches/filesystem_cache.py +89 -89
- dtlpy/caches/redis_cache.py +84 -84
- dtlpy/dlp/__init__.py +20 -20
- dtlpy/dlp/cli_utilities.py +367 -367
- dtlpy/dlp/command_executor.py +764 -764
- dtlpy/dlp/dlp +1 -1
- dtlpy/dlp/dlp.bat +1 -1
- dtlpy/dlp/dlp.py +128 -128
- dtlpy/dlp/parser.py +651 -651
- dtlpy/entities/__init__.py +83 -83
- dtlpy/entities/analytic.py +311 -311
- dtlpy/entities/annotation.py +1879 -1879
- dtlpy/entities/annotation_collection.py +699 -699
- dtlpy/entities/annotation_definitions/__init__.py +20 -20
- dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
- dtlpy/entities/annotation_definitions/box.py +195 -195
- dtlpy/entities/annotation_definitions/classification.py +67 -67
- dtlpy/entities/annotation_definitions/comparison.py +72 -72
- dtlpy/entities/annotation_definitions/cube.py +204 -204
- dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
- dtlpy/entities/annotation_definitions/description.py +32 -32
- dtlpy/entities/annotation_definitions/ellipse.py +124 -124
- dtlpy/entities/annotation_definitions/free_text.py +62 -62
- dtlpy/entities/annotation_definitions/gis.py +69 -69
- dtlpy/entities/annotation_definitions/note.py +139 -139
- dtlpy/entities/annotation_definitions/point.py +117 -117
- dtlpy/entities/annotation_definitions/polygon.py +182 -182
- dtlpy/entities/annotation_definitions/polyline.py +111 -111
- dtlpy/entities/annotation_definitions/pose.py +92 -92
- dtlpy/entities/annotation_definitions/ref_image.py +86 -86
- dtlpy/entities/annotation_definitions/segmentation.py +240 -240
- dtlpy/entities/annotation_definitions/subtitle.py +34 -34
- dtlpy/entities/annotation_definitions/text.py +85 -85
- dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
- dtlpy/entities/app.py +220 -220
- dtlpy/entities/app_module.py +107 -107
- dtlpy/entities/artifact.py +174 -174
- dtlpy/entities/assignment.py +399 -399
- dtlpy/entities/base_entity.py +214 -214
- dtlpy/entities/bot.py +113 -113
- dtlpy/entities/codebase.py +296 -296
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +442 -442
- dtlpy/entities/dataset.py +1285 -1285
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +222 -222
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +145 -145
- dtlpy/entities/filters.py +641 -641
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +953 -953
- dtlpy/entities/label.py +123 -123
- dtlpy/entities/links.py +85 -85
- dtlpy/entities/message.py +175 -175
- dtlpy/entities/model.py +694 -691
- dtlpy/entities/node.py +1005 -1005
- dtlpy/entities/ontology.py +803 -803
- dtlpy/entities/organization.py +287 -287
- dtlpy/entities/package.py +657 -657
- dtlpy/entities/package_defaults.py +5 -5
- dtlpy/entities/package_function.py +185 -185
- dtlpy/entities/package_module.py +113 -113
- dtlpy/entities/package_slot.py +118 -118
- dtlpy/entities/paged_entities.py +290 -267
- dtlpy/entities/pipeline.py +593 -593
- dtlpy/entities/pipeline_execution.py +279 -279
- dtlpy/entities/project.py +394 -394
- dtlpy/entities/prompt_item.py +499 -499
- dtlpy/entities/recipe.py +301 -301
- dtlpy/entities/reflect_dict.py +102 -102
- dtlpy/entities/resource_execution.py +138 -138
- dtlpy/entities/service.py +958 -958
- dtlpy/entities/service_driver.py +117 -117
- dtlpy/entities/setting.py +294 -294
- dtlpy/entities/task.py +491 -491
- dtlpy/entities/time_series.py +143 -143
- dtlpy/entities/trigger.py +426 -426
- dtlpy/entities/user.py +118 -118
- dtlpy/entities/webhook.py +124 -124
- dtlpy/examples/__init__.py +19 -19
- dtlpy/examples/add_labels.py +135 -135
- dtlpy/examples/add_metadata_to_item.py +21 -21
- dtlpy/examples/annotate_items_using_model.py +65 -65
- dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
- dtlpy/examples/annotations_convert_to_voc.py +9 -9
- dtlpy/examples/annotations_convert_to_yolo.py +9 -9
- dtlpy/examples/convert_annotation_types.py +51 -51
- dtlpy/examples/converter.py +143 -143
- dtlpy/examples/copy_annotations.py +22 -22
- dtlpy/examples/copy_folder.py +31 -31
- dtlpy/examples/create_annotations.py +51 -51
- dtlpy/examples/create_video_annotations.py +83 -83
- dtlpy/examples/delete_annotations.py +26 -26
- dtlpy/examples/filters.py +113 -113
- dtlpy/examples/move_item.py +23 -23
- dtlpy/examples/play_video_annotation.py +13 -13
- dtlpy/examples/show_item_and_mask.py +53 -53
- dtlpy/examples/triggers.py +49 -49
- dtlpy/examples/upload_batch_of_items.py +20 -20
- dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
- dtlpy/examples/upload_items_with_modalities.py +43 -43
- dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
- dtlpy/examples/upload_yolo_format_annotations.py +70 -70
- dtlpy/exceptions.py +125 -125
- dtlpy/miscellaneous/__init__.py +20 -20
- dtlpy/miscellaneous/dict_differ.py +95 -95
- dtlpy/miscellaneous/git_utils.py +217 -217
- dtlpy/miscellaneous/json_utils.py +14 -14
- dtlpy/miscellaneous/list_print.py +105 -105
- dtlpy/miscellaneous/zipping.py +130 -130
- dtlpy/ml/__init__.py +20 -20
- dtlpy/ml/base_feature_extractor_adapter.py +27 -27
- dtlpy/ml/base_model_adapter.py +945 -940
- dtlpy/ml/metrics.py +461 -461
- dtlpy/ml/predictions_utils.py +274 -274
- dtlpy/ml/summary_writer.py +57 -57
- dtlpy/ml/train_utils.py +60 -60
- dtlpy/new_instance.py +252 -252
- dtlpy/repositories/__init__.py +56 -56
- dtlpy/repositories/analytics.py +85 -85
- dtlpy/repositories/annotations.py +916 -916
- dtlpy/repositories/apps.py +383 -383
- dtlpy/repositories/artifacts.py +452 -452
- dtlpy/repositories/assignments.py +599 -599
- dtlpy/repositories/bots.py +213 -213
- dtlpy/repositories/codebases.py +559 -559
- dtlpy/repositories/collections.py +332 -348
- dtlpy/repositories/commands.py +158 -158
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +434 -406
- dtlpy/repositories/datasets.py +1291 -1291
- dtlpy/repositories/downloader.py +895 -895
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +266 -266
- dtlpy/repositories/executions.py +817 -817
- dtlpy/repositories/feature_sets.py +226 -226
- dtlpy/repositories/features.py +238 -238
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +909 -915
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +877 -867
- dtlpy/repositories/nodes.py +80 -80
- dtlpy/repositories/ontologies.py +511 -511
- dtlpy/repositories/organizations.py +525 -525
- dtlpy/repositories/packages.py +1941 -1941
- dtlpy/repositories/pipeline_executions.py +448 -448
- dtlpy/repositories/pipelines.py +642 -642
- dtlpy/repositories/projects.py +539 -539
- dtlpy/repositories/recipes.py +399 -399
- dtlpy/repositories/resource_executions.py +137 -137
- dtlpy/repositories/schema.py +120 -120
- dtlpy/repositories/service_drivers.py +213 -213
- dtlpy/repositories/services.py +1704 -1704
- dtlpy/repositories/settings.py +339 -339
- dtlpy/repositories/tasks.py +1124 -1124
- dtlpy/repositories/times_series.py +278 -278
- dtlpy/repositories/triggers.py +536 -536
- dtlpy/repositories/upload_element.py +257 -257
- dtlpy/repositories/uploader.py +651 -651
- dtlpy/repositories/webhooks.py +249 -249
- dtlpy/services/__init__.py +22 -22
- dtlpy/services/aihttp_retry.py +131 -131
- dtlpy/services/api_client.py +1782 -1782
- dtlpy/services/api_reference.py +40 -40
- dtlpy/services/async_utils.py +133 -133
- dtlpy/services/calls_counter.py +44 -44
- dtlpy/services/check_sdk.py +68 -68
- dtlpy/services/cookie.py +115 -115
- dtlpy/services/create_logger.py +156 -156
- dtlpy/services/events.py +84 -84
- dtlpy/services/logins.py +235 -235
- dtlpy/services/reporter.py +256 -256
- dtlpy/services/service_defaults.py +91 -91
- dtlpy/utilities/__init__.py +20 -20
- dtlpy/utilities/annotations/__init__.py +16 -16
- dtlpy/utilities/annotations/annotation_converters.py +269 -269
- dtlpy/utilities/base_package_runner.py +264 -264
- dtlpy/utilities/converter.py +1650 -1650
- dtlpy/utilities/dataset_generators/__init__.py +1 -1
- dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
- dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
- dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
- dtlpy/utilities/local_development/__init__.py +1 -1
- dtlpy/utilities/local_development/local_session.py +179 -179
- dtlpy/utilities/reports/__init__.py +2 -2
- dtlpy/utilities/reports/figures.py +343 -343
- dtlpy/utilities/reports/report.py +71 -71
- dtlpy/utilities/videos/__init__.py +17 -17
- dtlpy/utilities/videos/video_player.py +598 -598
- dtlpy/utilities/videos/videos.py +470 -470
- {dtlpy-1.113.10.data → dtlpy-1.114.13.data}/scripts/dlp +1 -1
- dtlpy-1.114.13.data/scripts/dlp.bat +2 -0
- {dtlpy-1.113.10.data → dtlpy-1.114.13.data}/scripts/dlp.py +128 -128
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/LICENSE +200 -200
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/METADATA +172 -172
- dtlpy-1.114.13.dist-info/RECORD +240 -0
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/WHEEL +1 -1
- tests/features/environment.py +551 -550
- dtlpy-1.113.10.data/scripts/dlp.bat +0 -2
- dtlpy-1.113.10.dist-info/RECORD +0 -244
- tests/assets/__init__.py +0 -0
- tests/assets/models_flow/__init__.py +0 -0
- tests/assets/models_flow/failedmain.py +0 -52
- tests/assets/models_flow/main.py +0 -62
- tests/assets/models_flow/main_model.py +0 -54
- {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/entry_points.txt +0 -0
- {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)
|