dtlpy 1.115.44__py3-none-any.whl → 1.117.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dtlpy/__init__.py +491 -491
- dtlpy/__version__.py +1 -1
- dtlpy/assets/__init__.py +26 -26
- 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 +347 -347
- 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 +292 -292
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +449 -449
- dtlpy/entities/dataset.py +1299 -1299
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +235 -235
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +152 -145
- dtlpy/entities/filters.py +798 -798
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +975 -959
- dtlpy/entities/label.py +123 -123
- dtlpy/entities/links.py +85 -85
- dtlpy/entities/message.py +175 -175
- dtlpy/entities/model.py +684 -684
- dtlpy/entities/node.py +1005 -1005
- dtlpy/entities/ontology.py +810 -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 +299 -299
- dtlpy/entities/pipeline.py +624 -624
- dtlpy/entities/pipeline_execution.py +279 -279
- dtlpy/entities/project.py +394 -394
- dtlpy/entities/prompt_item.py +505 -505
- dtlpy/entities/recipe.py +301 -301
- dtlpy/entities/reflect_dict.py +102 -102
- dtlpy/entities/resource_execution.py +138 -138
- dtlpy/entities/service.py +974 -963
- dtlpy/entities/service_driver.py +117 -117
- dtlpy/entities/setting.py +294 -294
- dtlpy/entities/task.py +495 -495
- 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 +1287 -1230
- 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 -332
- dtlpy/repositories/commands.py +152 -152
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +439 -439
- dtlpy/repositories/datasets.py +1585 -1504
- dtlpy/repositories/downloader.py +1157 -923
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +482 -482
- dtlpy/repositories/executions.py +815 -815
- dtlpy/repositories/feature_sets.py +256 -226
- dtlpy/repositories/features.py +255 -255
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +912 -912
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +1000 -1000
- 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 +451 -451
- dtlpy/repositories/pipelines.py +640 -640
- dtlpy/repositories/projects.py +539 -539
- dtlpy/repositories/recipes.py +429 -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 +1477 -1477
- dtlpy/repositories/times_series.py +278 -278
- dtlpy/repositories/triggers.py +536 -536
- dtlpy/repositories/upload_element.py +257 -257
- dtlpy/repositories/uploader.py +661 -661
- dtlpy/repositories/webhooks.py +249 -249
- dtlpy/services/__init__.py +22 -22
- dtlpy/services/aihttp_retry.py +131 -131
- dtlpy/services/api_client.py +1786 -1785
- 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 +285 -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.115.44.data → dtlpy-1.117.6.data}/scripts/dlp +1 -1
- dtlpy-1.117.6.data/scripts/dlp.bat +2 -0
- {dtlpy-1.115.44.data → dtlpy-1.117.6.data}/scripts/dlp.py +128 -128
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/METADATA +186 -186
- dtlpy-1.117.6.dist-info/RECORD +239 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/WHEEL +1 -1
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/licenses/LICENSE +200 -200
- tests/features/environment.py +551 -551
- dtlpy/assets/__pycache__/__init__.cpython-310.pyc +0 -0
- dtlpy-1.115.44.data/scripts/dlp.bat +0 -2
- dtlpy-1.115.44.dist-info/RECORD +0 -240
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/top_level.txt +0 -0
dtlpy/entities/organization.py
CHANGED
|
@@ -1,287 +1,287 @@
|
|
|
1
|
-
from collections import namedtuple
|
|
2
|
-
from enum import Enum
|
|
3
|
-
import traceback
|
|
4
|
-
import logging
|
|
5
|
-
import attr
|
|
6
|
-
|
|
7
|
-
from .. import repositories, entities
|
|
8
|
-
from ..services.api_client import ApiClient
|
|
9
|
-
|
|
10
|
-
logger = logging.getLogger(name='dtlpy')
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class PodType(str, Enum):
|
|
14
|
-
SMALL = "small"
|
|
15
|
-
MEDIUM = "medium"
|
|
16
|
-
HIGH = "high"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class CacheAction(str, Enum):
|
|
20
|
-
APPLY = "apply"
|
|
21
|
-
DESTROY = "destroy"
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class OrganizationsPlans(str, Enum):
|
|
25
|
-
PREMIUM = "premium"
|
|
26
|
-
FREEMIUM = "freemium"
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class MemberOrgRole(str, Enum):
|
|
30
|
-
OWNER = "owner"
|
|
31
|
-
ADMIN = "admin"
|
|
32
|
-
MEMBER = "member"
|
|
33
|
-
WORKER = "worker"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
@attr.s()
|
|
37
|
-
class Organization(entities.BaseEntity):
|
|
38
|
-
"""
|
|
39
|
-
Organization entity
|
|
40
|
-
"""
|
|
41
|
-
|
|
42
|
-
members = attr.ib(type=list)
|
|
43
|
-
groups = attr.ib(type=list)
|
|
44
|
-
account = attr.ib(type=dict)
|
|
45
|
-
created_at = attr.ib()
|
|
46
|
-
updated_at = attr.ib()
|
|
47
|
-
id = attr.ib(repr=False)
|
|
48
|
-
name = attr.ib(repr=False)
|
|
49
|
-
logo_url = attr.ib(repr=False)
|
|
50
|
-
plan = attr.ib(repr=False)
|
|
51
|
-
owner = attr.ib(repr=False)
|
|
52
|
-
creator = attr.ib(repr=False)
|
|
53
|
-
|
|
54
|
-
# api
|
|
55
|
-
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
56
|
-
|
|
57
|
-
# repositories
|
|
58
|
-
_repositories = attr.ib(repr=False)
|
|
59
|
-
|
|
60
|
-
@property
|
|
61
|
-
def createdAt(self):
|
|
62
|
-
return self.created_at
|
|
63
|
-
|
|
64
|
-
@property
|
|
65
|
-
def updatedAt(self):
|
|
66
|
-
return self.updated_at
|
|
67
|
-
|
|
68
|
-
@property
|
|
69
|
-
def createdBy(self):
|
|
70
|
-
return self.creator
|
|
71
|
-
|
|
72
|
-
@_repositories.default
|
|
73
|
-
def set_repositories(self):
|
|
74
|
-
reps = namedtuple('repositories',
|
|
75
|
-
field_names=['organizations', 'projects', 'integrations', 'services', 'settings'])
|
|
76
|
-
|
|
77
|
-
r = reps(projects=repositories.Projects(client_api=self._client_api, org=self),
|
|
78
|
-
organizations=repositories.Organizations(client_api=self._client_api),
|
|
79
|
-
integrations=repositories.Integrations(client_api=self._client_api, org=self),
|
|
80
|
-
services=repositories.Services(client_api=self._client_api),
|
|
81
|
-
settings=repositories.Settings(client_api=self._client_api,
|
|
82
|
-
org=self,
|
|
83
|
-
resource=self,
|
|
84
|
-
resource_type=entities.PlatformEntityType.ORG)
|
|
85
|
-
)
|
|
86
|
-
return r
|
|
87
|
-
|
|
88
|
-
@property
|
|
89
|
-
def platform_url(self):
|
|
90
|
-
return self._client_api._get_resource_url("iam/{}/members".format(self.id))
|
|
91
|
-
|
|
92
|
-
@property
|
|
93
|
-
def accounts(self):
|
|
94
|
-
return [self.account]
|
|
95
|
-
|
|
96
|
-
@property
|
|
97
|
-
def projects(self):
|
|
98
|
-
assert isinstance(self._repositories.projects, repositories.Projects)
|
|
99
|
-
return self._repositories.projects
|
|
100
|
-
|
|
101
|
-
@property
|
|
102
|
-
def services(self):
|
|
103
|
-
assert isinstance(self._repositories.services, repositories.Services)
|
|
104
|
-
return self._repositories.services
|
|
105
|
-
|
|
106
|
-
@property
|
|
107
|
-
def settings(self):
|
|
108
|
-
assert isinstance(self._repositories.settings, repositories.Settings)
|
|
109
|
-
return self._repositories.settings
|
|
110
|
-
|
|
111
|
-
@property
|
|
112
|
-
def organizations(self):
|
|
113
|
-
assert isinstance(self._repositories.organizations, repositories.Organizations)
|
|
114
|
-
return self._repositories.organizations
|
|
115
|
-
|
|
116
|
-
@property
|
|
117
|
-
def integrations(self):
|
|
118
|
-
assert isinstance(self._repositories.integrations, repositories.Integrations)
|
|
119
|
-
return self._repositories.integrations
|
|
120
|
-
|
|
121
|
-
@staticmethod
|
|
122
|
-
def _protected_from_json(_json, client_api):
|
|
123
|
-
"""
|
|
124
|
-
Same as from_json but with try-except to catch if error
|
|
125
|
-
|
|
126
|
-
:param _json: platform json
|
|
127
|
-
:param client_api: ApiClient entity
|
|
128
|
-
|
|
129
|
-
:return: update status: bool, Organization entity
|
|
130
|
-
"""
|
|
131
|
-
try:
|
|
132
|
-
organization = Organization.from_json(_json=_json,
|
|
133
|
-
client_api=client_api)
|
|
134
|
-
status = True
|
|
135
|
-
except Exception:
|
|
136
|
-
organization = traceback.format_exc()
|
|
137
|
-
status = False
|
|
138
|
-
return status, organization
|
|
139
|
-
|
|
140
|
-
@classmethod
|
|
141
|
-
def from_json(cls, _json, client_api, is_fetched=True):
|
|
142
|
-
"""
|
|
143
|
-
Build a Project entity object from a json
|
|
144
|
-
|
|
145
|
-
:param bool is_fetched: is Entity fetched from Platform
|
|
146
|
-
:param dict _json: _json response from host
|
|
147
|
-
:param dl.ApiClient client_api: ApiClient entity
|
|
148
|
-
:return: Organization object
|
|
149
|
-
:rtype: dtlpy.entities.organization.Organization
|
|
150
|
-
"""
|
|
151
|
-
inst = cls(members=_json.get('members', None),
|
|
152
|
-
groups=_json.get('groups', None),
|
|
153
|
-
account=_json.get('account', None),
|
|
154
|
-
created_at=_json.get('createdAt', None),
|
|
155
|
-
updated_at=_json.get('updatedAt', None),
|
|
156
|
-
id=_json.get('id', None),
|
|
157
|
-
name=_json.get('name', None),
|
|
158
|
-
logo_url=_json.get('logoUrl', None),
|
|
159
|
-
plan=_json.get('plan', None),
|
|
160
|
-
owner=_json.get('owner', None),
|
|
161
|
-
creator=_json.get('creator', None),
|
|
162
|
-
client_api=client_api)
|
|
163
|
-
inst.is_fetched = is_fetched
|
|
164
|
-
return inst
|
|
165
|
-
|
|
166
|
-
def to_json(self):
|
|
167
|
-
"""
|
|
168
|
-
Returns platform _json format of object
|
|
169
|
-
|
|
170
|
-
:return: platform json format of object
|
|
171
|
-
:rtype: dict
|
|
172
|
-
"""
|
|
173
|
-
output_dict = attr.asdict(self,
|
|
174
|
-
filter=attr.filters.exclude(attr.fields(Organization)._client_api,
|
|
175
|
-
attr.fields(Organization)._repositories,
|
|
176
|
-
attr.fields(Organization).created_at,
|
|
177
|
-
attr.fields(Organization).updated_at,
|
|
178
|
-
attr.fields(Organization).creator,
|
|
179
|
-
))
|
|
180
|
-
output_dict['members'] = self.members
|
|
181
|
-
output_dict['groups'] = self.groups
|
|
182
|
-
output_dict['account'] = self.account
|
|
183
|
-
output_dict['accounts'] = self.accounts
|
|
184
|
-
output_dict['createdAt'] = self.created_at
|
|
185
|
-
output_dict['updatedAt'] = self.updated_at
|
|
186
|
-
output_dict['id'] = self.id
|
|
187
|
-
output_dict['name'] = self.name
|
|
188
|
-
output_dict['logo_url'] = self.logo_url
|
|
189
|
-
output_dict['plan'] = self.plan
|
|
190
|
-
output_dict['owner'] = self.owner
|
|
191
|
-
output_dict['creator'] = self.creator
|
|
192
|
-
|
|
193
|
-
return output_dict
|
|
194
|
-
|
|
195
|
-
def list_groups(self):
|
|
196
|
-
"""
|
|
197
|
-
List all organization groups (groups that were created within the organization).
|
|
198
|
-
|
|
199
|
-
Prerequisites: You must be an organization "owner" to use this method.
|
|
200
|
-
|
|
201
|
-
:return: groups list
|
|
202
|
-
:rtype: list
|
|
203
|
-
|
|
204
|
-
"""
|
|
205
|
-
return self.organizations.list_groups(organization=self)
|
|
206
|
-
|
|
207
|
-
def list_members(self, role: MemberOrgRole = None):
|
|
208
|
-
"""
|
|
209
|
-
List all organization members.
|
|
210
|
-
|
|
211
|
-
Prerequisites: You must be an organization "owner" to use this method.
|
|
212
|
-
|
|
213
|
-
:param str role: MemberOrgRole.ADMIN, MemberOrgRole.OWNER, MemberOrgRole.MEMBER, MemberOrgRole.WORKER
|
|
214
|
-
:return: projects list
|
|
215
|
-
:rtype: list
|
|
216
|
-
"""
|
|
217
|
-
return self.organizations.list_members(organization=self, role=role)
|
|
218
|
-
|
|
219
|
-
def update(self, plan: str):
|
|
220
|
-
"""
|
|
221
|
-
Update Organization.
|
|
222
|
-
|
|
223
|
-
Prerequisities: You must be an Organization **superuser** to update an organization.
|
|
224
|
-
|
|
225
|
-
:param str plan: OrganizationsPlans.FREEMIUM, OrganizationsPlans.PREMIUM
|
|
226
|
-
|
|
227
|
-
:return: organization object
|
|
228
|
-
"""
|
|
229
|
-
return self.organizations.update(organization=self, plan=plan)
|
|
230
|
-
|
|
231
|
-
def add_member(self, email, role: MemberOrgRole = MemberOrgRole):
|
|
232
|
-
"""
|
|
233
|
-
Add members to your organization. Read about members and groups [here](https://dataloop.ai/docs/org-members-groups).
|
|
234
|
-
|
|
235
|
-
Prerequisities: To add members to an organization, you must be in the role of an "owner" in that organization.
|
|
236
|
-
|
|
237
|
-
:param str email: the member's email
|
|
238
|
-
:param str role: MemberOrgRole.ADMIN, MemberOrgRole.OWNER, MemberOrgRole.MEMBER, MemberOrgRole.WORKER
|
|
239
|
-
:return: True if successful or error if unsuccessful
|
|
240
|
-
:rtype: bool
|
|
241
|
-
"""
|
|
242
|
-
return self.organizations.add_member(organization=self, email=email, role=role)
|
|
243
|
-
|
|
244
|
-
def delete_member(self, user_id: str, sure: bool = False, really: bool = False):
|
|
245
|
-
"""
|
|
246
|
-
Delete member from the Organization.
|
|
247
|
-
|
|
248
|
-
Prerequisites: Must be an organization "owner" to delete members.
|
|
249
|
-
|
|
250
|
-
:param str user_id: user id
|
|
251
|
-
:param bool sure: Are you sure you want to delete?
|
|
252
|
-
:param bool really: Really really sure?
|
|
253
|
-
:return: True if success and error if not
|
|
254
|
-
:rtype: bool
|
|
255
|
-
"""
|
|
256
|
-
return self.organizations.delete_member(organization=self, user_id=user_id, sure=sure, really=really)
|
|
257
|
-
|
|
258
|
-
def update_member(self, email: str, role: MemberOrgRole = MemberOrgRole.MEMBER):
|
|
259
|
-
"""
|
|
260
|
-
Update member role.
|
|
261
|
-
|
|
262
|
-
Prerequisities: You must be an organization "owner" to update a member's role.
|
|
263
|
-
|
|
264
|
-
:param str email: the member's email
|
|
265
|
-
:param str role: MemberOrgRole.ADMIN, MemberOrgRole.OWNER, MemberOrgRole.MEMBER, MemberOrgRole.WORKER
|
|
266
|
-
:return: json of the member fields
|
|
267
|
-
:rtype: dict
|
|
268
|
-
"""
|
|
269
|
-
return self.organizations.update_member(organization=self, email=email, role=role)
|
|
270
|
-
|
|
271
|
-
def open_in_web(self):
|
|
272
|
-
"""
|
|
273
|
-
Open the organizations in web platform
|
|
274
|
-
|
|
275
|
-
"""
|
|
276
|
-
self._client_api._open_in_web(url=self.platform_url)
|
|
277
|
-
|
|
278
|
-
def cache_action(self, mode=CacheAction.APPLY, pod_type=PodType.SMALL):
|
|
279
|
-
"""
|
|
280
|
-
Open the organizations in web platform
|
|
281
|
-
|
|
282
|
-
:param str mode: dl.CacheAction.APPLY or dl.CacheAction.DESTROY
|
|
283
|
-
:param dl.PodType pod_type: dl.PodType.SMALL, dl.PodType.MEDIUM, dl.PodType.HIGH
|
|
284
|
-
:return: True if success
|
|
285
|
-
:rtype: bool
|
|
286
|
-
"""
|
|
287
|
-
return self.services._cache_action(organization=self, mode=mode, pod_type=pod_type)
|
|
1
|
+
from collections import namedtuple
|
|
2
|
+
from enum import Enum
|
|
3
|
+
import traceback
|
|
4
|
+
import logging
|
|
5
|
+
import attr
|
|
6
|
+
|
|
7
|
+
from .. import repositories, entities
|
|
8
|
+
from ..services.api_client import ApiClient
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(name='dtlpy')
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class PodType(str, Enum):
|
|
14
|
+
SMALL = "small"
|
|
15
|
+
MEDIUM = "medium"
|
|
16
|
+
HIGH = "high"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class CacheAction(str, Enum):
|
|
20
|
+
APPLY = "apply"
|
|
21
|
+
DESTROY = "destroy"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class OrganizationsPlans(str, Enum):
|
|
25
|
+
PREMIUM = "premium"
|
|
26
|
+
FREEMIUM = "freemium"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class MemberOrgRole(str, Enum):
|
|
30
|
+
OWNER = "owner"
|
|
31
|
+
ADMIN = "admin"
|
|
32
|
+
MEMBER = "member"
|
|
33
|
+
WORKER = "worker"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@attr.s()
|
|
37
|
+
class Organization(entities.BaseEntity):
|
|
38
|
+
"""
|
|
39
|
+
Organization entity
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
members = attr.ib(type=list)
|
|
43
|
+
groups = attr.ib(type=list)
|
|
44
|
+
account = attr.ib(type=dict)
|
|
45
|
+
created_at = attr.ib()
|
|
46
|
+
updated_at = attr.ib()
|
|
47
|
+
id = attr.ib(repr=False)
|
|
48
|
+
name = attr.ib(repr=False)
|
|
49
|
+
logo_url = attr.ib(repr=False)
|
|
50
|
+
plan = attr.ib(repr=False)
|
|
51
|
+
owner = attr.ib(repr=False)
|
|
52
|
+
creator = attr.ib(repr=False)
|
|
53
|
+
|
|
54
|
+
# api
|
|
55
|
+
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
56
|
+
|
|
57
|
+
# repositories
|
|
58
|
+
_repositories = attr.ib(repr=False)
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def createdAt(self):
|
|
62
|
+
return self.created_at
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def updatedAt(self):
|
|
66
|
+
return self.updated_at
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def createdBy(self):
|
|
70
|
+
return self.creator
|
|
71
|
+
|
|
72
|
+
@_repositories.default
|
|
73
|
+
def set_repositories(self):
|
|
74
|
+
reps = namedtuple('repositories',
|
|
75
|
+
field_names=['organizations', 'projects', 'integrations', 'services', 'settings'])
|
|
76
|
+
|
|
77
|
+
r = reps(projects=repositories.Projects(client_api=self._client_api, org=self),
|
|
78
|
+
organizations=repositories.Organizations(client_api=self._client_api),
|
|
79
|
+
integrations=repositories.Integrations(client_api=self._client_api, org=self),
|
|
80
|
+
services=repositories.Services(client_api=self._client_api),
|
|
81
|
+
settings=repositories.Settings(client_api=self._client_api,
|
|
82
|
+
org=self,
|
|
83
|
+
resource=self,
|
|
84
|
+
resource_type=entities.PlatformEntityType.ORG)
|
|
85
|
+
)
|
|
86
|
+
return r
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def platform_url(self):
|
|
90
|
+
return self._client_api._get_resource_url("iam/{}/members".format(self.id))
|
|
91
|
+
|
|
92
|
+
@property
|
|
93
|
+
def accounts(self):
|
|
94
|
+
return [self.account]
|
|
95
|
+
|
|
96
|
+
@property
|
|
97
|
+
def projects(self):
|
|
98
|
+
assert isinstance(self._repositories.projects, repositories.Projects)
|
|
99
|
+
return self._repositories.projects
|
|
100
|
+
|
|
101
|
+
@property
|
|
102
|
+
def services(self):
|
|
103
|
+
assert isinstance(self._repositories.services, repositories.Services)
|
|
104
|
+
return self._repositories.services
|
|
105
|
+
|
|
106
|
+
@property
|
|
107
|
+
def settings(self):
|
|
108
|
+
assert isinstance(self._repositories.settings, repositories.Settings)
|
|
109
|
+
return self._repositories.settings
|
|
110
|
+
|
|
111
|
+
@property
|
|
112
|
+
def organizations(self):
|
|
113
|
+
assert isinstance(self._repositories.organizations, repositories.Organizations)
|
|
114
|
+
return self._repositories.organizations
|
|
115
|
+
|
|
116
|
+
@property
|
|
117
|
+
def integrations(self):
|
|
118
|
+
assert isinstance(self._repositories.integrations, repositories.Integrations)
|
|
119
|
+
return self._repositories.integrations
|
|
120
|
+
|
|
121
|
+
@staticmethod
|
|
122
|
+
def _protected_from_json(_json, client_api):
|
|
123
|
+
"""
|
|
124
|
+
Same as from_json but with try-except to catch if error
|
|
125
|
+
|
|
126
|
+
:param _json: platform json
|
|
127
|
+
:param client_api: ApiClient entity
|
|
128
|
+
|
|
129
|
+
:return: update status: bool, Organization entity
|
|
130
|
+
"""
|
|
131
|
+
try:
|
|
132
|
+
organization = Organization.from_json(_json=_json,
|
|
133
|
+
client_api=client_api)
|
|
134
|
+
status = True
|
|
135
|
+
except Exception:
|
|
136
|
+
organization = traceback.format_exc()
|
|
137
|
+
status = False
|
|
138
|
+
return status, organization
|
|
139
|
+
|
|
140
|
+
@classmethod
|
|
141
|
+
def from_json(cls, _json, client_api, is_fetched=True):
|
|
142
|
+
"""
|
|
143
|
+
Build a Project entity object from a json
|
|
144
|
+
|
|
145
|
+
:param bool is_fetched: is Entity fetched from Platform
|
|
146
|
+
:param dict _json: _json response from host
|
|
147
|
+
:param dl.ApiClient client_api: ApiClient entity
|
|
148
|
+
:return: Organization object
|
|
149
|
+
:rtype: dtlpy.entities.organization.Organization
|
|
150
|
+
"""
|
|
151
|
+
inst = cls(members=_json.get('members', None),
|
|
152
|
+
groups=_json.get('groups', None),
|
|
153
|
+
account=_json.get('account', None),
|
|
154
|
+
created_at=_json.get('createdAt', None),
|
|
155
|
+
updated_at=_json.get('updatedAt', None),
|
|
156
|
+
id=_json.get('id', None),
|
|
157
|
+
name=_json.get('name', None),
|
|
158
|
+
logo_url=_json.get('logoUrl', None),
|
|
159
|
+
plan=_json.get('plan', None),
|
|
160
|
+
owner=_json.get('owner', None),
|
|
161
|
+
creator=_json.get('creator', None),
|
|
162
|
+
client_api=client_api)
|
|
163
|
+
inst.is_fetched = is_fetched
|
|
164
|
+
return inst
|
|
165
|
+
|
|
166
|
+
def to_json(self):
|
|
167
|
+
"""
|
|
168
|
+
Returns platform _json format of object
|
|
169
|
+
|
|
170
|
+
:return: platform json format of object
|
|
171
|
+
:rtype: dict
|
|
172
|
+
"""
|
|
173
|
+
output_dict = attr.asdict(self,
|
|
174
|
+
filter=attr.filters.exclude(attr.fields(Organization)._client_api,
|
|
175
|
+
attr.fields(Organization)._repositories,
|
|
176
|
+
attr.fields(Organization).created_at,
|
|
177
|
+
attr.fields(Organization).updated_at,
|
|
178
|
+
attr.fields(Organization).creator,
|
|
179
|
+
))
|
|
180
|
+
output_dict['members'] = self.members
|
|
181
|
+
output_dict['groups'] = self.groups
|
|
182
|
+
output_dict['account'] = self.account
|
|
183
|
+
output_dict['accounts'] = self.accounts
|
|
184
|
+
output_dict['createdAt'] = self.created_at
|
|
185
|
+
output_dict['updatedAt'] = self.updated_at
|
|
186
|
+
output_dict['id'] = self.id
|
|
187
|
+
output_dict['name'] = self.name
|
|
188
|
+
output_dict['logo_url'] = self.logo_url
|
|
189
|
+
output_dict['plan'] = self.plan
|
|
190
|
+
output_dict['owner'] = self.owner
|
|
191
|
+
output_dict['creator'] = self.creator
|
|
192
|
+
|
|
193
|
+
return output_dict
|
|
194
|
+
|
|
195
|
+
def list_groups(self):
|
|
196
|
+
"""
|
|
197
|
+
List all organization groups (groups that were created within the organization).
|
|
198
|
+
|
|
199
|
+
Prerequisites: You must be an organization "owner" to use this method.
|
|
200
|
+
|
|
201
|
+
:return: groups list
|
|
202
|
+
:rtype: list
|
|
203
|
+
|
|
204
|
+
"""
|
|
205
|
+
return self.organizations.list_groups(organization=self)
|
|
206
|
+
|
|
207
|
+
def list_members(self, role: MemberOrgRole = None):
|
|
208
|
+
"""
|
|
209
|
+
List all organization members.
|
|
210
|
+
|
|
211
|
+
Prerequisites: You must be an organization "owner" to use this method.
|
|
212
|
+
|
|
213
|
+
:param str role: MemberOrgRole.ADMIN, MemberOrgRole.OWNER, MemberOrgRole.MEMBER, MemberOrgRole.WORKER
|
|
214
|
+
:return: projects list
|
|
215
|
+
:rtype: list
|
|
216
|
+
"""
|
|
217
|
+
return self.organizations.list_members(organization=self, role=role)
|
|
218
|
+
|
|
219
|
+
def update(self, plan: str):
|
|
220
|
+
"""
|
|
221
|
+
Update Organization.
|
|
222
|
+
|
|
223
|
+
Prerequisities: You must be an Organization **superuser** to update an organization.
|
|
224
|
+
|
|
225
|
+
:param str plan: OrganizationsPlans.FREEMIUM, OrganizationsPlans.PREMIUM
|
|
226
|
+
|
|
227
|
+
:return: organization object
|
|
228
|
+
"""
|
|
229
|
+
return self.organizations.update(organization=self, plan=plan)
|
|
230
|
+
|
|
231
|
+
def add_member(self, email, role: MemberOrgRole = MemberOrgRole):
|
|
232
|
+
"""
|
|
233
|
+
Add members to your organization. Read about members and groups [here](https://dataloop.ai/docs/org-members-groups).
|
|
234
|
+
|
|
235
|
+
Prerequisities: To add members to an organization, you must be in the role of an "owner" in that organization.
|
|
236
|
+
|
|
237
|
+
:param str email: the member's email
|
|
238
|
+
:param str role: MemberOrgRole.ADMIN, MemberOrgRole.OWNER, MemberOrgRole.MEMBER, MemberOrgRole.WORKER
|
|
239
|
+
:return: True if successful or error if unsuccessful
|
|
240
|
+
:rtype: bool
|
|
241
|
+
"""
|
|
242
|
+
return self.organizations.add_member(organization=self, email=email, role=role)
|
|
243
|
+
|
|
244
|
+
def delete_member(self, user_id: str, sure: bool = False, really: bool = False):
|
|
245
|
+
"""
|
|
246
|
+
Delete member from the Organization.
|
|
247
|
+
|
|
248
|
+
Prerequisites: Must be an organization "owner" to delete members.
|
|
249
|
+
|
|
250
|
+
:param str user_id: user id
|
|
251
|
+
:param bool sure: Are you sure you want to delete?
|
|
252
|
+
:param bool really: Really really sure?
|
|
253
|
+
:return: True if success and error if not
|
|
254
|
+
:rtype: bool
|
|
255
|
+
"""
|
|
256
|
+
return self.organizations.delete_member(organization=self, user_id=user_id, sure=sure, really=really)
|
|
257
|
+
|
|
258
|
+
def update_member(self, email: str, role: MemberOrgRole = MemberOrgRole.MEMBER):
|
|
259
|
+
"""
|
|
260
|
+
Update member role.
|
|
261
|
+
|
|
262
|
+
Prerequisities: You must be an organization "owner" to update a member's role.
|
|
263
|
+
|
|
264
|
+
:param str email: the member's email
|
|
265
|
+
:param str role: MemberOrgRole.ADMIN, MemberOrgRole.OWNER, MemberOrgRole.MEMBER, MemberOrgRole.WORKER
|
|
266
|
+
:return: json of the member fields
|
|
267
|
+
:rtype: dict
|
|
268
|
+
"""
|
|
269
|
+
return self.organizations.update_member(organization=self, email=email, role=role)
|
|
270
|
+
|
|
271
|
+
def open_in_web(self):
|
|
272
|
+
"""
|
|
273
|
+
Open the organizations in web platform
|
|
274
|
+
|
|
275
|
+
"""
|
|
276
|
+
self._client_api._open_in_web(url=self.platform_url)
|
|
277
|
+
|
|
278
|
+
def cache_action(self, mode=CacheAction.APPLY, pod_type=PodType.SMALL):
|
|
279
|
+
"""
|
|
280
|
+
Open the organizations in web platform
|
|
281
|
+
|
|
282
|
+
:param str mode: dl.CacheAction.APPLY or dl.CacheAction.DESTROY
|
|
283
|
+
:param dl.PodType pod_type: dl.PodType.SMALL, dl.PodType.MEDIUM, dl.PodType.HIGH
|
|
284
|
+
:return: True if success
|
|
285
|
+
:rtype: bool
|
|
286
|
+
"""
|
|
287
|
+
return self.services._cache_action(organization=self, mode=mode, pod_type=pod_type)
|