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
dtlpy/repositories/bots.py
CHANGED
|
@@ -1,213 +1,213 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
from .. import entities, miscellaneous, exceptions
|
|
3
|
-
from ..services.api_client import ApiClient
|
|
4
|
-
|
|
5
|
-
logger = logging.getLogger(name='dtlpy')
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class Bots:
|
|
9
|
-
"""
|
|
10
|
-
Bots Repository
|
|
11
|
-
|
|
12
|
-
The Bots class allows the user to manage bots and their properties.
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
def __init__(self, client_api: ApiClient, project: entities.Project):
|
|
16
|
-
self._client_api = client_api
|
|
17
|
-
self._project = project
|
|
18
|
-
|
|
19
|
-
@property
|
|
20
|
-
def project(self) -> entities.Project:
|
|
21
|
-
if self._project is None:
|
|
22
|
-
raise exceptions.PlatformException(
|
|
23
|
-
error='2001',
|
|
24
|
-
message='Missing "project". need to set a Project entity or use project.bots repository')
|
|
25
|
-
assert isinstance(self._project, entities.Project)
|
|
26
|
-
return self._project
|
|
27
|
-
|
|
28
|
-
@project.setter
|
|
29
|
-
def project(self, project: entities.Project):
|
|
30
|
-
if not isinstance(project, entities.Project):
|
|
31
|
-
raise ValueError('Must input a valid Project entity')
|
|
32
|
-
self._project = project
|
|
33
|
-
|
|
34
|
-
###########
|
|
35
|
-
# methods #
|
|
36
|
-
###########
|
|
37
|
-
def list(self) -> miscellaneous.List[entities.Bot]:
|
|
38
|
-
"""
|
|
39
|
-
Get a project or package bots list.
|
|
40
|
-
|
|
41
|
-
**Prerequisites**: You must be in the role of an *owner* or *developer*. You must have a service.
|
|
42
|
-
|
|
43
|
-
:return: List of Bots objects
|
|
44
|
-
:rtype: list
|
|
45
|
-
|
|
46
|
-
**Example**:
|
|
47
|
-
|
|
48
|
-
.. code-block:: python
|
|
49
|
-
|
|
50
|
-
bots_list = service.bots.list()
|
|
51
|
-
|
|
52
|
-
"""
|
|
53
|
-
success, response = self._client_api.gen_request(req_type='get',
|
|
54
|
-
path='/projects/{}/bots'.format(self.project.id))
|
|
55
|
-
|
|
56
|
-
if success:
|
|
57
|
-
bots_json = response.json()
|
|
58
|
-
pool = self._client_api.thread_pools(pool_name='entity.create')
|
|
59
|
-
jobs = [None for _ in range(len(bots_json))]
|
|
60
|
-
# return triggers list
|
|
61
|
-
for i_bot, bot in enumerate(bots_json):
|
|
62
|
-
jobs[i_bot] = pool.submit(entities.Bot._protected_from_json,
|
|
63
|
-
**{'project': self.project,
|
|
64
|
-
'bots': self,
|
|
65
|
-
'client_api': self._client_api,
|
|
66
|
-
'_json': bot})
|
|
67
|
-
|
|
68
|
-
# get all results
|
|
69
|
-
results = [j.result() for j in jobs]
|
|
70
|
-
# log errors
|
|
71
|
-
_ = [logger.warning(r[1]) for r in results if r[0] is False]
|
|
72
|
-
# return good jobs
|
|
73
|
-
bots = miscellaneous.List([r[1] for r in results if r[0] is True])
|
|
74
|
-
else:
|
|
75
|
-
logger.error('Platform error getting bots')
|
|
76
|
-
raise exceptions.PlatformException(response)
|
|
77
|
-
return bots
|
|
78
|
-
|
|
79
|
-
def get(self,
|
|
80
|
-
bot_email: str = None,
|
|
81
|
-
bot_id: str = None,
|
|
82
|
-
bot_name: str = None):
|
|
83
|
-
"""
|
|
84
|
-
Get a Bot object.
|
|
85
|
-
|
|
86
|
-
**Prerequisites**: You must be in the role of an *owner* or *developer*. You must have a service.
|
|
87
|
-
|
|
88
|
-
:param str bot_email: get bot by email
|
|
89
|
-
:param str bot_id: get bot by id
|
|
90
|
-
:param str bot_name: get bot by name
|
|
91
|
-
:return: Bot object
|
|
92
|
-
:rtype: dtlpy.entities.bot.Bot
|
|
93
|
-
|
|
94
|
-
**Example**:
|
|
95
|
-
|
|
96
|
-
.. code-block:: python
|
|
97
|
-
|
|
98
|
-
service.bots.get(bot_id='bot_id')
|
|
99
|
-
|
|
100
|
-
"""
|
|
101
|
-
if bot_id is None:
|
|
102
|
-
if bot_name is not None:
|
|
103
|
-
bots = self.list()
|
|
104
|
-
bot = [bot for bot in bots if bot.name == bot_name]
|
|
105
|
-
|
|
106
|
-
elif bot_email is not None:
|
|
107
|
-
bots = self.list()
|
|
108
|
-
bot = [bot for bot in bots if bot.email == bot_email]
|
|
109
|
-
else:
|
|
110
|
-
raise exceptions.PlatformException('400', 'Must choose by "bot_id" or "bot_name"')
|
|
111
|
-
if not bot:
|
|
112
|
-
# list is empty
|
|
113
|
-
raise exceptions.PlatformException('404', 'Bot not found. Name: {}'.format(bot_email))
|
|
114
|
-
# project = None
|
|
115
|
-
elif len(bot) > 1:
|
|
116
|
-
# more than one matching project
|
|
117
|
-
raise exceptions.PlatformException('404', 'More than one bot with same name. Please "get" by id')
|
|
118
|
-
else:
|
|
119
|
-
bot_id = bot[0].id
|
|
120
|
-
|
|
121
|
-
success, response = self._client_api.gen_request(req_type='get',
|
|
122
|
-
path='/projects/{}/bots/{}'.format(self.project.id,
|
|
123
|
-
bot_id))
|
|
124
|
-
if success:
|
|
125
|
-
bot = entities.Bot.from_json(_json=response.json(),
|
|
126
|
-
project=self.project,
|
|
127
|
-
bots=self, client_api=self._client_api)
|
|
128
|
-
# verify input bot name and bot email are same as the given id
|
|
129
|
-
if bot_name is not None and bot.name != bot_name:
|
|
130
|
-
logger.warning(
|
|
131
|
-
"Mismatch found in bots.get: bot_name is different then bot.name: "
|
|
132
|
-
"{!r} != {!r}".format(
|
|
133
|
-
bot_name,
|
|
134
|
-
bot.name))
|
|
135
|
-
if bot_email is not None and bot.email != bot_email:
|
|
136
|
-
logger.warning(
|
|
137
|
-
"Mismatch found in bots.get: bot_email is different then bot.email: "
|
|
138
|
-
"{!r} != {!r}".format(
|
|
139
|
-
bot_email,
|
|
140
|
-
bot.email))
|
|
141
|
-
else:
|
|
142
|
-
raise exceptions.PlatformException(response)
|
|
143
|
-
|
|
144
|
-
assert isinstance(bot, entities.Bot)
|
|
145
|
-
return bot
|
|
146
|
-
|
|
147
|
-
def delete(self,
|
|
148
|
-
bot_id: str = None,
|
|
149
|
-
bot_email: str = None):
|
|
150
|
-
"""
|
|
151
|
-
Delete a Bot.
|
|
152
|
-
|
|
153
|
-
**Prerequisites**: You must be in the role of an *owner* or *developer*. You must have a service.
|
|
154
|
-
|
|
155
|
-
You must provide at least ONE of the following params: bot_id, bot_email
|
|
156
|
-
|
|
157
|
-
:param str bot_id: bot id to delete
|
|
158
|
-
:param str bot_email: bot email to delete
|
|
159
|
-
:return: True if successful
|
|
160
|
-
:rtype: bool
|
|
161
|
-
|
|
162
|
-
**Example**:
|
|
163
|
-
|
|
164
|
-
.. code-block:: python
|
|
165
|
-
|
|
166
|
-
service.bots.delete(bot_id='bot_id')
|
|
167
|
-
|
|
168
|
-
"""
|
|
169
|
-
if bot_id is None:
|
|
170
|
-
if bot_email is None:
|
|
171
|
-
raise exceptions.PlatformException(error='400',
|
|
172
|
-
message='must input one of bot_id or bot_email to delete')
|
|
173
|
-
bot = self.get(bot_email=bot_email)
|
|
174
|
-
bot_id = bot.id
|
|
175
|
-
success, response = self._client_api.gen_request(req_type='delete',
|
|
176
|
-
path='/projects/{}/bots/{}'.format(self.project.id,
|
|
177
|
-
bot_id))
|
|
178
|
-
if not success:
|
|
179
|
-
raise exceptions.PlatformException(response)
|
|
180
|
-
logger.info('Bot {} deleted successfully'.format(bot_id))
|
|
181
|
-
return True
|
|
182
|
-
|
|
183
|
-
def create(self,
|
|
184
|
-
name: str,
|
|
185
|
-
return_credentials: bool = False):
|
|
186
|
-
"""
|
|
187
|
-
Create a new Bot.
|
|
188
|
-
|
|
189
|
-
**Prerequisites**: You must be in the role of an *owner* or *developer*. You must have a service.
|
|
190
|
-
|
|
191
|
-
:param str name: bot name
|
|
192
|
-
:param str return_credentials: True will return the password when created
|
|
193
|
-
:return: Bot object
|
|
194
|
-
:rtype: dtlpy.entities.bot.Bot
|
|
195
|
-
|
|
196
|
-
**Example**:
|
|
197
|
-
|
|
198
|
-
.. code-block:: python
|
|
199
|
-
|
|
200
|
-
service.bots.delete(name='bot', return_credentials=False)
|
|
201
|
-
"""
|
|
202
|
-
success, response = self._client_api.gen_request(req_type='post',
|
|
203
|
-
path='/projects/{}/bots'.format(self.project.id),
|
|
204
|
-
json_req={'name': name,
|
|
205
|
-
'returnCredentials': return_credentials})
|
|
206
|
-
if success:
|
|
207
|
-
bot = entities.Bot.from_json(_json=response.json(),
|
|
208
|
-
project=self.project,
|
|
209
|
-
bots=self, client_api=self._client_api)
|
|
210
|
-
else:
|
|
211
|
-
raise exceptions.PlatformException(response)
|
|
212
|
-
assert isinstance(bot, entities.Bot)
|
|
213
|
-
return bot
|
|
1
|
+
import logging
|
|
2
|
+
from .. import entities, miscellaneous, exceptions
|
|
3
|
+
from ..services.api_client import ApiClient
|
|
4
|
+
|
|
5
|
+
logger = logging.getLogger(name='dtlpy')
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Bots:
|
|
9
|
+
"""
|
|
10
|
+
Bots Repository
|
|
11
|
+
|
|
12
|
+
The Bots class allows the user to manage bots and their properties.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def __init__(self, client_api: ApiClient, project: entities.Project):
|
|
16
|
+
self._client_api = client_api
|
|
17
|
+
self._project = project
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def project(self) -> entities.Project:
|
|
21
|
+
if self._project is None:
|
|
22
|
+
raise exceptions.PlatformException(
|
|
23
|
+
error='2001',
|
|
24
|
+
message='Missing "project". need to set a Project entity or use project.bots repository')
|
|
25
|
+
assert isinstance(self._project, entities.Project)
|
|
26
|
+
return self._project
|
|
27
|
+
|
|
28
|
+
@project.setter
|
|
29
|
+
def project(self, project: entities.Project):
|
|
30
|
+
if not isinstance(project, entities.Project):
|
|
31
|
+
raise ValueError('Must input a valid Project entity')
|
|
32
|
+
self._project = project
|
|
33
|
+
|
|
34
|
+
###########
|
|
35
|
+
# methods #
|
|
36
|
+
###########
|
|
37
|
+
def list(self) -> miscellaneous.List[entities.Bot]:
|
|
38
|
+
"""
|
|
39
|
+
Get a project or package bots list.
|
|
40
|
+
|
|
41
|
+
**Prerequisites**: You must be in the role of an *owner* or *developer*. You must have a service.
|
|
42
|
+
|
|
43
|
+
:return: List of Bots objects
|
|
44
|
+
:rtype: list
|
|
45
|
+
|
|
46
|
+
**Example**:
|
|
47
|
+
|
|
48
|
+
.. code-block:: python
|
|
49
|
+
|
|
50
|
+
bots_list = service.bots.list()
|
|
51
|
+
|
|
52
|
+
"""
|
|
53
|
+
success, response = self._client_api.gen_request(req_type='get',
|
|
54
|
+
path='/projects/{}/bots'.format(self.project.id))
|
|
55
|
+
|
|
56
|
+
if success:
|
|
57
|
+
bots_json = response.json()
|
|
58
|
+
pool = self._client_api.thread_pools(pool_name='entity.create')
|
|
59
|
+
jobs = [None for _ in range(len(bots_json))]
|
|
60
|
+
# return triggers list
|
|
61
|
+
for i_bot, bot in enumerate(bots_json):
|
|
62
|
+
jobs[i_bot] = pool.submit(entities.Bot._protected_from_json,
|
|
63
|
+
**{'project': self.project,
|
|
64
|
+
'bots': self,
|
|
65
|
+
'client_api': self._client_api,
|
|
66
|
+
'_json': bot})
|
|
67
|
+
|
|
68
|
+
# get all results
|
|
69
|
+
results = [j.result() for j in jobs]
|
|
70
|
+
# log errors
|
|
71
|
+
_ = [logger.warning(r[1]) for r in results if r[0] is False]
|
|
72
|
+
# return good jobs
|
|
73
|
+
bots = miscellaneous.List([r[1] for r in results if r[0] is True])
|
|
74
|
+
else:
|
|
75
|
+
logger.error('Platform error getting bots')
|
|
76
|
+
raise exceptions.PlatformException(response)
|
|
77
|
+
return bots
|
|
78
|
+
|
|
79
|
+
def get(self,
|
|
80
|
+
bot_email: str = None,
|
|
81
|
+
bot_id: str = None,
|
|
82
|
+
bot_name: str = None):
|
|
83
|
+
"""
|
|
84
|
+
Get a Bot object.
|
|
85
|
+
|
|
86
|
+
**Prerequisites**: You must be in the role of an *owner* or *developer*. You must have a service.
|
|
87
|
+
|
|
88
|
+
:param str bot_email: get bot by email
|
|
89
|
+
:param str bot_id: get bot by id
|
|
90
|
+
:param str bot_name: get bot by name
|
|
91
|
+
:return: Bot object
|
|
92
|
+
:rtype: dtlpy.entities.bot.Bot
|
|
93
|
+
|
|
94
|
+
**Example**:
|
|
95
|
+
|
|
96
|
+
.. code-block:: python
|
|
97
|
+
|
|
98
|
+
service.bots.get(bot_id='bot_id')
|
|
99
|
+
|
|
100
|
+
"""
|
|
101
|
+
if bot_id is None:
|
|
102
|
+
if bot_name is not None:
|
|
103
|
+
bots = self.list()
|
|
104
|
+
bot = [bot for bot in bots if bot.name == bot_name]
|
|
105
|
+
|
|
106
|
+
elif bot_email is not None:
|
|
107
|
+
bots = self.list()
|
|
108
|
+
bot = [bot for bot in bots if bot.email == bot_email]
|
|
109
|
+
else:
|
|
110
|
+
raise exceptions.PlatformException('400', 'Must choose by "bot_id" or "bot_name"')
|
|
111
|
+
if not bot:
|
|
112
|
+
# list is empty
|
|
113
|
+
raise exceptions.PlatformException('404', 'Bot not found. Name: {}'.format(bot_email))
|
|
114
|
+
# project = None
|
|
115
|
+
elif len(bot) > 1:
|
|
116
|
+
# more than one matching project
|
|
117
|
+
raise exceptions.PlatformException('404', 'More than one bot with same name. Please "get" by id')
|
|
118
|
+
else:
|
|
119
|
+
bot_id = bot[0].id
|
|
120
|
+
|
|
121
|
+
success, response = self._client_api.gen_request(req_type='get',
|
|
122
|
+
path='/projects/{}/bots/{}'.format(self.project.id,
|
|
123
|
+
bot_id))
|
|
124
|
+
if success:
|
|
125
|
+
bot = entities.Bot.from_json(_json=response.json(),
|
|
126
|
+
project=self.project,
|
|
127
|
+
bots=self, client_api=self._client_api)
|
|
128
|
+
# verify input bot name and bot email are same as the given id
|
|
129
|
+
if bot_name is not None and bot.name != bot_name:
|
|
130
|
+
logger.warning(
|
|
131
|
+
"Mismatch found in bots.get: bot_name is different then bot.name: "
|
|
132
|
+
"{!r} != {!r}".format(
|
|
133
|
+
bot_name,
|
|
134
|
+
bot.name))
|
|
135
|
+
if bot_email is not None and bot.email != bot_email:
|
|
136
|
+
logger.warning(
|
|
137
|
+
"Mismatch found in bots.get: bot_email is different then bot.email: "
|
|
138
|
+
"{!r} != {!r}".format(
|
|
139
|
+
bot_email,
|
|
140
|
+
bot.email))
|
|
141
|
+
else:
|
|
142
|
+
raise exceptions.PlatformException(response)
|
|
143
|
+
|
|
144
|
+
assert isinstance(bot, entities.Bot)
|
|
145
|
+
return bot
|
|
146
|
+
|
|
147
|
+
def delete(self,
|
|
148
|
+
bot_id: str = None,
|
|
149
|
+
bot_email: str = None):
|
|
150
|
+
"""
|
|
151
|
+
Delete a Bot.
|
|
152
|
+
|
|
153
|
+
**Prerequisites**: You must be in the role of an *owner* or *developer*. You must have a service.
|
|
154
|
+
|
|
155
|
+
You must provide at least ONE of the following params: bot_id, bot_email
|
|
156
|
+
|
|
157
|
+
:param str bot_id: bot id to delete
|
|
158
|
+
:param str bot_email: bot email to delete
|
|
159
|
+
:return: True if successful
|
|
160
|
+
:rtype: bool
|
|
161
|
+
|
|
162
|
+
**Example**:
|
|
163
|
+
|
|
164
|
+
.. code-block:: python
|
|
165
|
+
|
|
166
|
+
service.bots.delete(bot_id='bot_id')
|
|
167
|
+
|
|
168
|
+
"""
|
|
169
|
+
if bot_id is None:
|
|
170
|
+
if bot_email is None:
|
|
171
|
+
raise exceptions.PlatformException(error='400',
|
|
172
|
+
message='must input one of bot_id or bot_email to delete')
|
|
173
|
+
bot = self.get(bot_email=bot_email)
|
|
174
|
+
bot_id = bot.id
|
|
175
|
+
success, response = self._client_api.gen_request(req_type='delete',
|
|
176
|
+
path='/projects/{}/bots/{}'.format(self.project.id,
|
|
177
|
+
bot_id))
|
|
178
|
+
if not success:
|
|
179
|
+
raise exceptions.PlatformException(response)
|
|
180
|
+
logger.info('Bot {} deleted successfully'.format(bot_id))
|
|
181
|
+
return True
|
|
182
|
+
|
|
183
|
+
def create(self,
|
|
184
|
+
name: str,
|
|
185
|
+
return_credentials: bool = False):
|
|
186
|
+
"""
|
|
187
|
+
Create a new Bot.
|
|
188
|
+
|
|
189
|
+
**Prerequisites**: You must be in the role of an *owner* or *developer*. You must have a service.
|
|
190
|
+
|
|
191
|
+
:param str name: bot name
|
|
192
|
+
:param str return_credentials: True will return the password when created
|
|
193
|
+
:return: Bot object
|
|
194
|
+
:rtype: dtlpy.entities.bot.Bot
|
|
195
|
+
|
|
196
|
+
**Example**:
|
|
197
|
+
|
|
198
|
+
.. code-block:: python
|
|
199
|
+
|
|
200
|
+
service.bots.delete(name='bot', return_credentials=False)
|
|
201
|
+
"""
|
|
202
|
+
success, response = self._client_api.gen_request(req_type='post',
|
|
203
|
+
path='/projects/{}/bots'.format(self.project.id),
|
|
204
|
+
json_req={'name': name,
|
|
205
|
+
'returnCredentials': return_credentials})
|
|
206
|
+
if success:
|
|
207
|
+
bot = entities.Bot.from_json(_json=response.json(),
|
|
208
|
+
project=self.project,
|
|
209
|
+
bots=self, client_api=self._client_api)
|
|
210
|
+
else:
|
|
211
|
+
raise exceptions.PlatformException(response)
|
|
212
|
+
assert isinstance(bot, entities.Bot)
|
|
213
|
+
return bot
|