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/project.py
CHANGED
|
@@ -1,394 +1,394 @@
|
|
|
1
|
-
from collections import namedtuple
|
|
2
|
-
from enum import Enum
|
|
3
|
-
import traceback
|
|
4
|
-
import logging
|
|
5
|
-
import attr
|
|
6
|
-
|
|
7
|
-
from .. import repositories, miscellaneous, entities
|
|
8
|
-
from ..services.api_client import ApiClient
|
|
9
|
-
|
|
10
|
-
logger = logging.getLogger(name='dtlpy')
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class MemberRole(str, Enum):
|
|
14
|
-
OWNER = "owner"
|
|
15
|
-
DEVELOPER = "engineer"
|
|
16
|
-
ANNOTATOR = "annotator"
|
|
17
|
-
ANNOTATION_MANAGER = "annotationManager"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
@attr.s()
|
|
21
|
-
class Project(entities.BaseEntity):
|
|
22
|
-
"""
|
|
23
|
-
Project entity
|
|
24
|
-
"""
|
|
25
|
-
|
|
26
|
-
_contributors = attr.ib(repr=False)
|
|
27
|
-
created_at = attr.ib()
|
|
28
|
-
creator = attr.ib()
|
|
29
|
-
id = attr.ib()
|
|
30
|
-
url = attr.ib()
|
|
31
|
-
name = attr.ib()
|
|
32
|
-
org = attr.ib(repr=False)
|
|
33
|
-
updated_at = attr.ib(repr=False)
|
|
34
|
-
role = attr.ib(repr=False)
|
|
35
|
-
account = attr.ib(repr=False)
|
|
36
|
-
is_blocked = attr.ib(repr=False)
|
|
37
|
-
archived = attr.ib(repr=False)
|
|
38
|
-
|
|
39
|
-
# name change
|
|
40
|
-
feature_constraints = attr.ib()
|
|
41
|
-
|
|
42
|
-
# api
|
|
43
|
-
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
44
|
-
|
|
45
|
-
# repositories
|
|
46
|
-
_repositories = attr.ib(repr=False)
|
|
47
|
-
|
|
48
|
-
@property
|
|
49
|
-
def isBlocked(self):
|
|
50
|
-
return self.is_blocked
|
|
51
|
-
|
|
52
|
-
@property
|
|
53
|
-
def createdAt(self):
|
|
54
|
-
return self.created_at
|
|
55
|
-
|
|
56
|
-
@property
|
|
57
|
-
def updatedAt(self):
|
|
58
|
-
return self.updated_at
|
|
59
|
-
|
|
60
|
-
@_repositories.default
|
|
61
|
-
def set_repositories(self):
|
|
62
|
-
reps = namedtuple(
|
|
63
|
-
'repositories',
|
|
64
|
-
'projects triggers datasets items recipes packages codebases artifacts times_series services '
|
|
65
|
-
'executions assignments tasks bots webhooks models analytics ontologies '
|
|
66
|
-
'drivers pipelines feature_sets features integrations settings apps dpks compositions'
|
|
67
|
-
)
|
|
68
|
-
datasets = repositories.Datasets(client_api=self._client_api, project=self)
|
|
69
|
-
return reps(
|
|
70
|
-
projects=repositories.Projects(client_api=self._client_api),
|
|
71
|
-
webhooks=repositories.Webhooks(client_api=self._client_api, project=self),
|
|
72
|
-
items=repositories.Items(client_api=self._client_api, datasets=datasets, project=self),
|
|
73
|
-
recipes=repositories.Recipes(client_api=self._client_api, project=self, project_id=self.id),
|
|
74
|
-
datasets=datasets,
|
|
75
|
-
executions=repositories.Executions(client_api=self._client_api, project=self),
|
|
76
|
-
triggers=repositories.Triggers(client_api=self._client_api, project=self),
|
|
77
|
-
packages=repositories.Packages(project=self, client_api=self._client_api),
|
|
78
|
-
models=repositories.Models(project=self, client_api=self._client_api),
|
|
79
|
-
codebases=repositories.Codebases(project=self, client_api=self._client_api),
|
|
80
|
-
artifacts=repositories.Artifacts(project=self, client_api=self._client_api),
|
|
81
|
-
times_series=repositories.TimesSeries(project=self, client_api=self._client_api),
|
|
82
|
-
services=repositories.Services(client_api=self._client_api, project=self),
|
|
83
|
-
assignments=repositories.Assignments(project=self, client_api=self._client_api),
|
|
84
|
-
tasks=repositories.Tasks(client_api=self._client_api, project=self),
|
|
85
|
-
bots=repositories.Bots(client_api=self._client_api, project=self),
|
|
86
|
-
analytics=repositories.Analytics(client_api=self._client_api, project=self),
|
|
87
|
-
ontologies=repositories.Ontologies(client_api=self._client_api, project=self),
|
|
88
|
-
drivers=repositories.Drivers(client_api=self._client_api, project=self),
|
|
89
|
-
pipelines=repositories.Pipelines(client_api=self._client_api, project=self),
|
|
90
|
-
feature_sets=repositories.FeatureSets(client_api=self._client_api, project=self),
|
|
91
|
-
features=repositories.Features(client_api=self._client_api, project=self),
|
|
92
|
-
integrations=repositories.Integrations(client_api=self._client_api, project=self),
|
|
93
|
-
settings=repositories.Settings(client_api=self._client_api,
|
|
94
|
-
project=self,
|
|
95
|
-
resource=self,
|
|
96
|
-
resource_type=entities.PlatformEntityType.PROJECT),
|
|
97
|
-
apps=repositories.Apps(client_api=self._client_api, project=self),
|
|
98
|
-
dpks=repositories.Dpks(client_api=self._client_api, project=self),
|
|
99
|
-
compositions=repositories.Compositions(client_api=self._client_api, project=self)
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
@property
|
|
103
|
-
def drivers(self):
|
|
104
|
-
assert isinstance(self._repositories.drivers, repositories.Drivers)
|
|
105
|
-
return self._repositories.drivers
|
|
106
|
-
|
|
107
|
-
@property
|
|
108
|
-
def integrations(self):
|
|
109
|
-
assert isinstance(self._repositories.integrations, repositories.Integrations)
|
|
110
|
-
return self._repositories.integrations
|
|
111
|
-
|
|
112
|
-
@property
|
|
113
|
-
def platform_url(self):
|
|
114
|
-
return self._client_api._get_resource_url("projects/{}".format(self.id))
|
|
115
|
-
|
|
116
|
-
@property
|
|
117
|
-
def triggers(self):
|
|
118
|
-
assert isinstance(self._repositories.triggers, repositories.Triggers)
|
|
119
|
-
return self._repositories.triggers
|
|
120
|
-
|
|
121
|
-
@property
|
|
122
|
-
def ontologies(self):
|
|
123
|
-
assert isinstance(self._repositories.ontologies, repositories.Ontologies)
|
|
124
|
-
return self._repositories.ontologies
|
|
125
|
-
|
|
126
|
-
@property
|
|
127
|
-
def items(self):
|
|
128
|
-
assert isinstance(self._repositories.items, repositories.Items)
|
|
129
|
-
return self._repositories.items
|
|
130
|
-
|
|
131
|
-
@property
|
|
132
|
-
def recipes(self):
|
|
133
|
-
assert isinstance(self._repositories.recipes, repositories.Recipes)
|
|
134
|
-
return self._repositories.recipes
|
|
135
|
-
|
|
136
|
-
@property
|
|
137
|
-
def services(self):
|
|
138
|
-
assert isinstance(self._repositories.services, repositories.Services)
|
|
139
|
-
return self._repositories.services
|
|
140
|
-
|
|
141
|
-
@property
|
|
142
|
-
def executions(self):
|
|
143
|
-
assert isinstance(self._repositories.executions, repositories.Executions)
|
|
144
|
-
return self._repositories.executions
|
|
145
|
-
|
|
146
|
-
@property
|
|
147
|
-
def apps(self):
|
|
148
|
-
assert isinstance(self._repositories.apps, repositories.Apps)
|
|
149
|
-
return self._repositories.apps
|
|
150
|
-
|
|
151
|
-
@property
|
|
152
|
-
def dpks(self):
|
|
153
|
-
assert isinstance(self._repositories.dpks, repositories.Dpks)
|
|
154
|
-
return self._repositories.dpks
|
|
155
|
-
|
|
156
|
-
@property
|
|
157
|
-
def compositions(self):
|
|
158
|
-
assert isinstance(self._repositories.compositions, repositories.Compositions)
|
|
159
|
-
return self._repositories.compositions
|
|
160
|
-
|
|
161
|
-
@property
|
|
162
|
-
def projects(self):
|
|
163
|
-
assert isinstance(self._repositories.projects, repositories.Projects)
|
|
164
|
-
return self._repositories.projects
|
|
165
|
-
|
|
166
|
-
@property
|
|
167
|
-
def datasets(self):
|
|
168
|
-
assert isinstance(self._repositories.datasets, repositories.Datasets)
|
|
169
|
-
return self._repositories.datasets
|
|
170
|
-
|
|
171
|
-
@property
|
|
172
|
-
def pipelines(self):
|
|
173
|
-
assert isinstance(self._repositories.pipelines, repositories.Pipelines)
|
|
174
|
-
return self._repositories.pipelines
|
|
175
|
-
|
|
176
|
-
@property
|
|
177
|
-
def packages(self):
|
|
178
|
-
assert isinstance(self._repositories.packages, repositories.Packages)
|
|
179
|
-
return self._repositories.packages
|
|
180
|
-
|
|
181
|
-
@property
|
|
182
|
-
def models(self):
|
|
183
|
-
assert isinstance(self._repositories.models, repositories.Models)
|
|
184
|
-
return self._repositories.models
|
|
185
|
-
|
|
186
|
-
@property
|
|
187
|
-
def codebases(self):
|
|
188
|
-
assert isinstance(self._repositories.codebases, repositories.Codebases)
|
|
189
|
-
return self._repositories.codebases
|
|
190
|
-
|
|
191
|
-
@property
|
|
192
|
-
def webhooks(self):
|
|
193
|
-
assert isinstance(self._repositories.webhooks, repositories.Webhooks)
|
|
194
|
-
return self._repositories.webhooks
|
|
195
|
-
|
|
196
|
-
@property
|
|
197
|
-
def artifacts(self):
|
|
198
|
-
assert isinstance(self._repositories.artifacts, repositories.Artifacts)
|
|
199
|
-
return self._repositories.artifacts
|
|
200
|
-
|
|
201
|
-
@property
|
|
202
|
-
def times_series(self):
|
|
203
|
-
assert isinstance(self._repositories.times_series, repositories.TimesSeries)
|
|
204
|
-
return self._repositories.times_series
|
|
205
|
-
|
|
206
|
-
@property
|
|
207
|
-
def assignments(self):
|
|
208
|
-
assert isinstance(self._repositories.assignments, repositories.Assignments)
|
|
209
|
-
return self._repositories.assignments
|
|
210
|
-
|
|
211
|
-
@property
|
|
212
|
-
def tasks(self):
|
|
213
|
-
assert isinstance(self._repositories.tasks, repositories.Tasks)
|
|
214
|
-
return self._repositories.tasks
|
|
215
|
-
|
|
216
|
-
@property
|
|
217
|
-
def bots(self):
|
|
218
|
-
assert isinstance(self._repositories.bots, repositories.Bots)
|
|
219
|
-
return self._repositories.bots
|
|
220
|
-
|
|
221
|
-
@property
|
|
222
|
-
def analytics(self):
|
|
223
|
-
assert isinstance(self._repositories.analytics, repositories.Analytics)
|
|
224
|
-
return self._repositories.analytics
|
|
225
|
-
|
|
226
|
-
@property
|
|
227
|
-
def feature_sets(self):
|
|
228
|
-
assert isinstance(self._repositories.feature_sets, repositories.FeatureSets)
|
|
229
|
-
return self._repositories.feature_sets
|
|
230
|
-
|
|
231
|
-
@property
|
|
232
|
-
def features(self):
|
|
233
|
-
assert isinstance(self._repositories.features, repositories.Features)
|
|
234
|
-
return self._repositories.features
|
|
235
|
-
|
|
236
|
-
@property
|
|
237
|
-
def settings(self):
|
|
238
|
-
assert isinstance(self._repositories.settings, repositories.Settings)
|
|
239
|
-
return self._repositories.settings
|
|
240
|
-
|
|
241
|
-
@property
|
|
242
|
-
def contributors(self):
|
|
243
|
-
return miscellaneous.List([entities.User.from_json(_json=_json,
|
|
244
|
-
client_api=self._client_api,
|
|
245
|
-
project=self) for _json in self._contributors])
|
|
246
|
-
|
|
247
|
-
@staticmethod
|
|
248
|
-
def _protected_from_json(_json, client_api):
|
|
249
|
-
"""
|
|
250
|
-
Same as from_json but with try-except to catch if error
|
|
251
|
-
|
|
252
|
-
:param dict _json: platform json
|
|
253
|
-
:param dl.ApiClient client_api: ApiClient entity
|
|
254
|
-
:return:
|
|
255
|
-
"""
|
|
256
|
-
try:
|
|
257
|
-
project = Project.from_json(_json=_json,
|
|
258
|
-
client_api=client_api)
|
|
259
|
-
status = True
|
|
260
|
-
except Exception:
|
|
261
|
-
project = traceback.format_exc()
|
|
262
|
-
status = False
|
|
263
|
-
return status, project
|
|
264
|
-
|
|
265
|
-
@classmethod
|
|
266
|
-
def from_json(cls, _json, client_api, is_fetched=True):
|
|
267
|
-
"""
|
|
268
|
-
Build a Project object from a json
|
|
269
|
-
|
|
270
|
-
:param bool is_fetched: is Entity fetched from Platform
|
|
271
|
-
:param dict _json: _json response from host
|
|
272
|
-
:param dl.ApiClient client_api: ApiClient entity
|
|
273
|
-
:return: Project object
|
|
274
|
-
:rtype: dtlpy.entities.project.Project
|
|
275
|
-
"""
|
|
276
|
-
inst = cls(feature_constraints=_json.get('featureConstraints', None),
|
|
277
|
-
contributors=_json.get('contributors', None),
|
|
278
|
-
is_blocked=_json.get('isBlocked', None),
|
|
279
|
-
created_at=_json.get('createdAt', None),
|
|
280
|
-
updated_at=_json.get('updatedAt', None),
|
|
281
|
-
creator=_json.get('creator', None),
|
|
282
|
-
account=_json.get('account', None),
|
|
283
|
-
name=_json.get('name', None),
|
|
284
|
-
role=_json.get('role', None),
|
|
285
|
-
org=_json.get('org', None),
|
|
286
|
-
id=_json.get('id', None),
|
|
287
|
-
url=_json.get('url', None),
|
|
288
|
-
archived=_json.get('archived', None),
|
|
289
|
-
client_api=client_api)
|
|
290
|
-
inst.is_fetched = is_fetched
|
|
291
|
-
return inst
|
|
292
|
-
|
|
293
|
-
def to_json(self):
|
|
294
|
-
"""
|
|
295
|
-
Returns platform _json format of project object
|
|
296
|
-
|
|
297
|
-
:return: platform json format of project object
|
|
298
|
-
:rtype: dict
|
|
299
|
-
"""
|
|
300
|
-
output_dict = attr.asdict(self,
|
|
301
|
-
filter=attr.filters.exclude(attr.fields(Project)._client_api,
|
|
302
|
-
attr.fields(Project)._repositories,
|
|
303
|
-
attr.fields(Project).feature_constraints,
|
|
304
|
-
attr.fields(Project)._contributors,
|
|
305
|
-
attr.fields(Project).created_at,
|
|
306
|
-
attr.fields(Project).updated_at,
|
|
307
|
-
attr.fields(Project).is_blocked,
|
|
308
|
-
))
|
|
309
|
-
output_dict['contributors'] = self._contributors
|
|
310
|
-
output_dict['featureConstraints'] = self.feature_constraints
|
|
311
|
-
output_dict['createdAt'] = self.created_at
|
|
312
|
-
output_dict['updatedAt'] = self.updated_at
|
|
313
|
-
output_dict['isBlocked'] = self.is_blocked
|
|
314
|
-
|
|
315
|
-
return output_dict
|
|
316
|
-
|
|
317
|
-
def delete(self, sure=False, really=False):
|
|
318
|
-
"""
|
|
319
|
-
Delete the project forever!
|
|
320
|
-
|
|
321
|
-
:param bool sure: Are you sure you want to delete?
|
|
322
|
-
:param bool really: Really really sure?
|
|
323
|
-
:return: True if success, error if not
|
|
324
|
-
:rtype: bool
|
|
325
|
-
"""
|
|
326
|
-
return self.projects.delete(project_id=self.id,
|
|
327
|
-
sure=sure,
|
|
328
|
-
really=really)
|
|
329
|
-
|
|
330
|
-
def update(self, system_metadata=False):
|
|
331
|
-
"""
|
|
332
|
-
Update the project
|
|
333
|
-
|
|
334
|
-
:param bool system_metadata: optional - True, if you want to change metadata system
|
|
335
|
-
:return: Project object
|
|
336
|
-
:rtype: dtlpy.entities.project.Project
|
|
337
|
-
"""
|
|
338
|
-
return self.projects.update(project=self, system_metadata=system_metadata)
|
|
339
|
-
|
|
340
|
-
def checkout(self):
|
|
341
|
-
"""
|
|
342
|
-
Checkout (switch) to a project to work on.
|
|
343
|
-
|
|
344
|
-
"""
|
|
345
|
-
self.projects.checkout(project=self)
|
|
346
|
-
|
|
347
|
-
def open_in_web(self):
|
|
348
|
-
"""
|
|
349
|
-
Open the project in web platform
|
|
350
|
-
|
|
351
|
-
"""
|
|
352
|
-
self._client_api._open_in_web(url=self.platform_url)
|
|
353
|
-
|
|
354
|
-
def add_member(self, email, role: MemberRole = MemberRole.DEVELOPER):
|
|
355
|
-
"""
|
|
356
|
-
Add a member to the project.
|
|
357
|
-
|
|
358
|
-
:param str email: member email
|
|
359
|
-
:param role: The required role for the user. Use the enum dl.MemberRole
|
|
360
|
-
:return: dict that represent the user
|
|
361
|
-
:rtype: dict
|
|
362
|
-
"""
|
|
363
|
-
return self.projects.add_member(email=email, role=role, project_id=self.id)
|
|
364
|
-
|
|
365
|
-
def update_member(self, email, role: MemberRole = MemberRole.DEVELOPER):
|
|
366
|
-
"""
|
|
367
|
-
Update member's information/details from the project.
|
|
368
|
-
|
|
369
|
-
:param str email: member email
|
|
370
|
-
:param role: The required role for the user. Use the enum dl.MemberRole
|
|
371
|
-
:return: dict that represent the user
|
|
372
|
-
:rtype: dict
|
|
373
|
-
"""
|
|
374
|
-
return self.projects.update_member(email=email, role=role, project_id=self.id)
|
|
375
|
-
|
|
376
|
-
def remove_member(self, email):
|
|
377
|
-
"""
|
|
378
|
-
Remove a member from the project.
|
|
379
|
-
|
|
380
|
-
:param str email: member email
|
|
381
|
-
:return: dict that represents the user
|
|
382
|
-
:rtype: dict
|
|
383
|
-
"""
|
|
384
|
-
return self.projects.remove_member(email=email, project_id=self.id)
|
|
385
|
-
|
|
386
|
-
def list_members(self, role: MemberRole = None):
|
|
387
|
-
"""
|
|
388
|
-
List the project members.
|
|
389
|
-
|
|
390
|
-
:param role: The required role for the user. Use the enum dl.MemberRole
|
|
391
|
-
:return: list of the project members
|
|
392
|
-
:rtype: list
|
|
393
|
-
"""
|
|
394
|
-
return self.projects.list_members(project=self, role=role)
|
|
1
|
+
from collections import namedtuple
|
|
2
|
+
from enum import Enum
|
|
3
|
+
import traceback
|
|
4
|
+
import logging
|
|
5
|
+
import attr
|
|
6
|
+
|
|
7
|
+
from .. import repositories, miscellaneous, entities
|
|
8
|
+
from ..services.api_client import ApiClient
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(name='dtlpy')
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class MemberRole(str, Enum):
|
|
14
|
+
OWNER = "owner"
|
|
15
|
+
DEVELOPER = "engineer"
|
|
16
|
+
ANNOTATOR = "annotator"
|
|
17
|
+
ANNOTATION_MANAGER = "annotationManager"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@attr.s()
|
|
21
|
+
class Project(entities.BaseEntity):
|
|
22
|
+
"""
|
|
23
|
+
Project entity
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
_contributors = attr.ib(repr=False)
|
|
27
|
+
created_at = attr.ib()
|
|
28
|
+
creator = attr.ib()
|
|
29
|
+
id = attr.ib()
|
|
30
|
+
url = attr.ib()
|
|
31
|
+
name = attr.ib()
|
|
32
|
+
org = attr.ib(repr=False)
|
|
33
|
+
updated_at = attr.ib(repr=False)
|
|
34
|
+
role = attr.ib(repr=False)
|
|
35
|
+
account = attr.ib(repr=False)
|
|
36
|
+
is_blocked = attr.ib(repr=False)
|
|
37
|
+
archived = attr.ib(repr=False)
|
|
38
|
+
|
|
39
|
+
# name change
|
|
40
|
+
feature_constraints = attr.ib()
|
|
41
|
+
|
|
42
|
+
# api
|
|
43
|
+
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
44
|
+
|
|
45
|
+
# repositories
|
|
46
|
+
_repositories = attr.ib(repr=False)
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def isBlocked(self):
|
|
50
|
+
return self.is_blocked
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def createdAt(self):
|
|
54
|
+
return self.created_at
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def updatedAt(self):
|
|
58
|
+
return self.updated_at
|
|
59
|
+
|
|
60
|
+
@_repositories.default
|
|
61
|
+
def set_repositories(self):
|
|
62
|
+
reps = namedtuple(
|
|
63
|
+
'repositories',
|
|
64
|
+
'projects triggers datasets items recipes packages codebases artifacts times_series services '
|
|
65
|
+
'executions assignments tasks bots webhooks models analytics ontologies '
|
|
66
|
+
'drivers pipelines feature_sets features integrations settings apps dpks compositions'
|
|
67
|
+
)
|
|
68
|
+
datasets = repositories.Datasets(client_api=self._client_api, project=self)
|
|
69
|
+
return reps(
|
|
70
|
+
projects=repositories.Projects(client_api=self._client_api),
|
|
71
|
+
webhooks=repositories.Webhooks(client_api=self._client_api, project=self),
|
|
72
|
+
items=repositories.Items(client_api=self._client_api, datasets=datasets, project=self),
|
|
73
|
+
recipes=repositories.Recipes(client_api=self._client_api, project=self, project_id=self.id),
|
|
74
|
+
datasets=datasets,
|
|
75
|
+
executions=repositories.Executions(client_api=self._client_api, project=self),
|
|
76
|
+
triggers=repositories.Triggers(client_api=self._client_api, project=self),
|
|
77
|
+
packages=repositories.Packages(project=self, client_api=self._client_api),
|
|
78
|
+
models=repositories.Models(project=self, client_api=self._client_api),
|
|
79
|
+
codebases=repositories.Codebases(project=self, client_api=self._client_api),
|
|
80
|
+
artifacts=repositories.Artifacts(project=self, client_api=self._client_api),
|
|
81
|
+
times_series=repositories.TimesSeries(project=self, client_api=self._client_api),
|
|
82
|
+
services=repositories.Services(client_api=self._client_api, project=self),
|
|
83
|
+
assignments=repositories.Assignments(project=self, client_api=self._client_api),
|
|
84
|
+
tasks=repositories.Tasks(client_api=self._client_api, project=self),
|
|
85
|
+
bots=repositories.Bots(client_api=self._client_api, project=self),
|
|
86
|
+
analytics=repositories.Analytics(client_api=self._client_api, project=self),
|
|
87
|
+
ontologies=repositories.Ontologies(client_api=self._client_api, project=self),
|
|
88
|
+
drivers=repositories.Drivers(client_api=self._client_api, project=self),
|
|
89
|
+
pipelines=repositories.Pipelines(client_api=self._client_api, project=self),
|
|
90
|
+
feature_sets=repositories.FeatureSets(client_api=self._client_api, project=self),
|
|
91
|
+
features=repositories.Features(client_api=self._client_api, project=self),
|
|
92
|
+
integrations=repositories.Integrations(client_api=self._client_api, project=self),
|
|
93
|
+
settings=repositories.Settings(client_api=self._client_api,
|
|
94
|
+
project=self,
|
|
95
|
+
resource=self,
|
|
96
|
+
resource_type=entities.PlatformEntityType.PROJECT),
|
|
97
|
+
apps=repositories.Apps(client_api=self._client_api, project=self),
|
|
98
|
+
dpks=repositories.Dpks(client_api=self._client_api, project=self),
|
|
99
|
+
compositions=repositories.Compositions(client_api=self._client_api, project=self)
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def drivers(self):
|
|
104
|
+
assert isinstance(self._repositories.drivers, repositories.Drivers)
|
|
105
|
+
return self._repositories.drivers
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
def integrations(self):
|
|
109
|
+
assert isinstance(self._repositories.integrations, repositories.Integrations)
|
|
110
|
+
return self._repositories.integrations
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
def platform_url(self):
|
|
114
|
+
return self._client_api._get_resource_url("projects/{}".format(self.id))
|
|
115
|
+
|
|
116
|
+
@property
|
|
117
|
+
def triggers(self):
|
|
118
|
+
assert isinstance(self._repositories.triggers, repositories.Triggers)
|
|
119
|
+
return self._repositories.triggers
|
|
120
|
+
|
|
121
|
+
@property
|
|
122
|
+
def ontologies(self):
|
|
123
|
+
assert isinstance(self._repositories.ontologies, repositories.Ontologies)
|
|
124
|
+
return self._repositories.ontologies
|
|
125
|
+
|
|
126
|
+
@property
|
|
127
|
+
def items(self):
|
|
128
|
+
assert isinstance(self._repositories.items, repositories.Items)
|
|
129
|
+
return self._repositories.items
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def recipes(self):
|
|
133
|
+
assert isinstance(self._repositories.recipes, repositories.Recipes)
|
|
134
|
+
return self._repositories.recipes
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def services(self):
|
|
138
|
+
assert isinstance(self._repositories.services, repositories.Services)
|
|
139
|
+
return self._repositories.services
|
|
140
|
+
|
|
141
|
+
@property
|
|
142
|
+
def executions(self):
|
|
143
|
+
assert isinstance(self._repositories.executions, repositories.Executions)
|
|
144
|
+
return self._repositories.executions
|
|
145
|
+
|
|
146
|
+
@property
|
|
147
|
+
def apps(self):
|
|
148
|
+
assert isinstance(self._repositories.apps, repositories.Apps)
|
|
149
|
+
return self._repositories.apps
|
|
150
|
+
|
|
151
|
+
@property
|
|
152
|
+
def dpks(self):
|
|
153
|
+
assert isinstance(self._repositories.dpks, repositories.Dpks)
|
|
154
|
+
return self._repositories.dpks
|
|
155
|
+
|
|
156
|
+
@property
|
|
157
|
+
def compositions(self):
|
|
158
|
+
assert isinstance(self._repositories.compositions, repositories.Compositions)
|
|
159
|
+
return self._repositories.compositions
|
|
160
|
+
|
|
161
|
+
@property
|
|
162
|
+
def projects(self):
|
|
163
|
+
assert isinstance(self._repositories.projects, repositories.Projects)
|
|
164
|
+
return self._repositories.projects
|
|
165
|
+
|
|
166
|
+
@property
|
|
167
|
+
def datasets(self):
|
|
168
|
+
assert isinstance(self._repositories.datasets, repositories.Datasets)
|
|
169
|
+
return self._repositories.datasets
|
|
170
|
+
|
|
171
|
+
@property
|
|
172
|
+
def pipelines(self):
|
|
173
|
+
assert isinstance(self._repositories.pipelines, repositories.Pipelines)
|
|
174
|
+
return self._repositories.pipelines
|
|
175
|
+
|
|
176
|
+
@property
|
|
177
|
+
def packages(self):
|
|
178
|
+
assert isinstance(self._repositories.packages, repositories.Packages)
|
|
179
|
+
return self._repositories.packages
|
|
180
|
+
|
|
181
|
+
@property
|
|
182
|
+
def models(self):
|
|
183
|
+
assert isinstance(self._repositories.models, repositories.Models)
|
|
184
|
+
return self._repositories.models
|
|
185
|
+
|
|
186
|
+
@property
|
|
187
|
+
def codebases(self):
|
|
188
|
+
assert isinstance(self._repositories.codebases, repositories.Codebases)
|
|
189
|
+
return self._repositories.codebases
|
|
190
|
+
|
|
191
|
+
@property
|
|
192
|
+
def webhooks(self):
|
|
193
|
+
assert isinstance(self._repositories.webhooks, repositories.Webhooks)
|
|
194
|
+
return self._repositories.webhooks
|
|
195
|
+
|
|
196
|
+
@property
|
|
197
|
+
def artifacts(self):
|
|
198
|
+
assert isinstance(self._repositories.artifacts, repositories.Artifacts)
|
|
199
|
+
return self._repositories.artifacts
|
|
200
|
+
|
|
201
|
+
@property
|
|
202
|
+
def times_series(self):
|
|
203
|
+
assert isinstance(self._repositories.times_series, repositories.TimesSeries)
|
|
204
|
+
return self._repositories.times_series
|
|
205
|
+
|
|
206
|
+
@property
|
|
207
|
+
def assignments(self):
|
|
208
|
+
assert isinstance(self._repositories.assignments, repositories.Assignments)
|
|
209
|
+
return self._repositories.assignments
|
|
210
|
+
|
|
211
|
+
@property
|
|
212
|
+
def tasks(self):
|
|
213
|
+
assert isinstance(self._repositories.tasks, repositories.Tasks)
|
|
214
|
+
return self._repositories.tasks
|
|
215
|
+
|
|
216
|
+
@property
|
|
217
|
+
def bots(self):
|
|
218
|
+
assert isinstance(self._repositories.bots, repositories.Bots)
|
|
219
|
+
return self._repositories.bots
|
|
220
|
+
|
|
221
|
+
@property
|
|
222
|
+
def analytics(self):
|
|
223
|
+
assert isinstance(self._repositories.analytics, repositories.Analytics)
|
|
224
|
+
return self._repositories.analytics
|
|
225
|
+
|
|
226
|
+
@property
|
|
227
|
+
def feature_sets(self):
|
|
228
|
+
assert isinstance(self._repositories.feature_sets, repositories.FeatureSets)
|
|
229
|
+
return self._repositories.feature_sets
|
|
230
|
+
|
|
231
|
+
@property
|
|
232
|
+
def features(self):
|
|
233
|
+
assert isinstance(self._repositories.features, repositories.Features)
|
|
234
|
+
return self._repositories.features
|
|
235
|
+
|
|
236
|
+
@property
|
|
237
|
+
def settings(self):
|
|
238
|
+
assert isinstance(self._repositories.settings, repositories.Settings)
|
|
239
|
+
return self._repositories.settings
|
|
240
|
+
|
|
241
|
+
@property
|
|
242
|
+
def contributors(self):
|
|
243
|
+
return miscellaneous.List([entities.User.from_json(_json=_json,
|
|
244
|
+
client_api=self._client_api,
|
|
245
|
+
project=self) for _json in self._contributors])
|
|
246
|
+
|
|
247
|
+
@staticmethod
|
|
248
|
+
def _protected_from_json(_json, client_api):
|
|
249
|
+
"""
|
|
250
|
+
Same as from_json but with try-except to catch if error
|
|
251
|
+
|
|
252
|
+
:param dict _json: platform json
|
|
253
|
+
:param dl.ApiClient client_api: ApiClient entity
|
|
254
|
+
:return:
|
|
255
|
+
"""
|
|
256
|
+
try:
|
|
257
|
+
project = Project.from_json(_json=_json,
|
|
258
|
+
client_api=client_api)
|
|
259
|
+
status = True
|
|
260
|
+
except Exception:
|
|
261
|
+
project = traceback.format_exc()
|
|
262
|
+
status = False
|
|
263
|
+
return status, project
|
|
264
|
+
|
|
265
|
+
@classmethod
|
|
266
|
+
def from_json(cls, _json, client_api, is_fetched=True):
|
|
267
|
+
"""
|
|
268
|
+
Build a Project object from a json
|
|
269
|
+
|
|
270
|
+
:param bool is_fetched: is Entity fetched from Platform
|
|
271
|
+
:param dict _json: _json response from host
|
|
272
|
+
:param dl.ApiClient client_api: ApiClient entity
|
|
273
|
+
:return: Project object
|
|
274
|
+
:rtype: dtlpy.entities.project.Project
|
|
275
|
+
"""
|
|
276
|
+
inst = cls(feature_constraints=_json.get('featureConstraints', None),
|
|
277
|
+
contributors=_json.get('contributors', None),
|
|
278
|
+
is_blocked=_json.get('isBlocked', None),
|
|
279
|
+
created_at=_json.get('createdAt', None),
|
|
280
|
+
updated_at=_json.get('updatedAt', None),
|
|
281
|
+
creator=_json.get('creator', None),
|
|
282
|
+
account=_json.get('account', None),
|
|
283
|
+
name=_json.get('name', None),
|
|
284
|
+
role=_json.get('role', None),
|
|
285
|
+
org=_json.get('org', None),
|
|
286
|
+
id=_json.get('id', None),
|
|
287
|
+
url=_json.get('url', None),
|
|
288
|
+
archived=_json.get('archived', None),
|
|
289
|
+
client_api=client_api)
|
|
290
|
+
inst.is_fetched = is_fetched
|
|
291
|
+
return inst
|
|
292
|
+
|
|
293
|
+
def to_json(self):
|
|
294
|
+
"""
|
|
295
|
+
Returns platform _json format of project object
|
|
296
|
+
|
|
297
|
+
:return: platform json format of project object
|
|
298
|
+
:rtype: dict
|
|
299
|
+
"""
|
|
300
|
+
output_dict = attr.asdict(self,
|
|
301
|
+
filter=attr.filters.exclude(attr.fields(Project)._client_api,
|
|
302
|
+
attr.fields(Project)._repositories,
|
|
303
|
+
attr.fields(Project).feature_constraints,
|
|
304
|
+
attr.fields(Project)._contributors,
|
|
305
|
+
attr.fields(Project).created_at,
|
|
306
|
+
attr.fields(Project).updated_at,
|
|
307
|
+
attr.fields(Project).is_blocked,
|
|
308
|
+
))
|
|
309
|
+
output_dict['contributors'] = self._contributors
|
|
310
|
+
output_dict['featureConstraints'] = self.feature_constraints
|
|
311
|
+
output_dict['createdAt'] = self.created_at
|
|
312
|
+
output_dict['updatedAt'] = self.updated_at
|
|
313
|
+
output_dict['isBlocked'] = self.is_blocked
|
|
314
|
+
|
|
315
|
+
return output_dict
|
|
316
|
+
|
|
317
|
+
def delete(self, sure=False, really=False):
|
|
318
|
+
"""
|
|
319
|
+
Delete the project forever!
|
|
320
|
+
|
|
321
|
+
:param bool sure: Are you sure you want to delete?
|
|
322
|
+
:param bool really: Really really sure?
|
|
323
|
+
:return: True if success, error if not
|
|
324
|
+
:rtype: bool
|
|
325
|
+
"""
|
|
326
|
+
return self.projects.delete(project_id=self.id,
|
|
327
|
+
sure=sure,
|
|
328
|
+
really=really)
|
|
329
|
+
|
|
330
|
+
def update(self, system_metadata=False):
|
|
331
|
+
"""
|
|
332
|
+
Update the project
|
|
333
|
+
|
|
334
|
+
:param bool system_metadata: optional - True, if you want to change metadata system
|
|
335
|
+
:return: Project object
|
|
336
|
+
:rtype: dtlpy.entities.project.Project
|
|
337
|
+
"""
|
|
338
|
+
return self.projects.update(project=self, system_metadata=system_metadata)
|
|
339
|
+
|
|
340
|
+
def checkout(self):
|
|
341
|
+
"""
|
|
342
|
+
Checkout (switch) to a project to work on.
|
|
343
|
+
|
|
344
|
+
"""
|
|
345
|
+
self.projects.checkout(project=self)
|
|
346
|
+
|
|
347
|
+
def open_in_web(self):
|
|
348
|
+
"""
|
|
349
|
+
Open the project in web platform
|
|
350
|
+
|
|
351
|
+
"""
|
|
352
|
+
self._client_api._open_in_web(url=self.platform_url)
|
|
353
|
+
|
|
354
|
+
def add_member(self, email, role: MemberRole = MemberRole.DEVELOPER):
|
|
355
|
+
"""
|
|
356
|
+
Add a member to the project.
|
|
357
|
+
|
|
358
|
+
:param str email: member email
|
|
359
|
+
:param role: The required role for the user. Use the enum dl.MemberRole
|
|
360
|
+
:return: dict that represent the user
|
|
361
|
+
:rtype: dict
|
|
362
|
+
"""
|
|
363
|
+
return self.projects.add_member(email=email, role=role, project_id=self.id)
|
|
364
|
+
|
|
365
|
+
def update_member(self, email, role: MemberRole = MemberRole.DEVELOPER):
|
|
366
|
+
"""
|
|
367
|
+
Update member's information/details from the project.
|
|
368
|
+
|
|
369
|
+
:param str email: member email
|
|
370
|
+
:param role: The required role for the user. Use the enum dl.MemberRole
|
|
371
|
+
:return: dict that represent the user
|
|
372
|
+
:rtype: dict
|
|
373
|
+
"""
|
|
374
|
+
return self.projects.update_member(email=email, role=role, project_id=self.id)
|
|
375
|
+
|
|
376
|
+
def remove_member(self, email):
|
|
377
|
+
"""
|
|
378
|
+
Remove a member from the project.
|
|
379
|
+
|
|
380
|
+
:param str email: member email
|
|
381
|
+
:return: dict that represents the user
|
|
382
|
+
:rtype: dict
|
|
383
|
+
"""
|
|
384
|
+
return self.projects.remove_member(email=email, project_id=self.id)
|
|
385
|
+
|
|
386
|
+
def list_members(self, role: MemberRole = None):
|
|
387
|
+
"""
|
|
388
|
+
List the project members.
|
|
389
|
+
|
|
390
|
+
:param role: The required role for the user. Use the enum dl.MemberRole
|
|
391
|
+
:return: list of the project members
|
|
392
|
+
:rtype: list
|
|
393
|
+
"""
|
|
394
|
+
return self.projects.list_members(project=self, role=role)
|