dtlpy 1.115.44__py3-none-any.whl → 1.116.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 +145 -145
- dtlpy/entities/filters.py +798 -798
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +959 -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 +963 -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 +1257 -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 +1504 -1504
- dtlpy/repositories/downloader.py +976 -923
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +482 -482
- dtlpy/repositories/executions.py +815 -815
- dtlpy/repositories/feature_sets.py +226 -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 +419 -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 +1785 -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.116.6.data}/scripts/dlp +1 -1
- dtlpy-1.116.6.data/scripts/dlp.bat +2 -0
- {dtlpy-1.115.44.data → dtlpy-1.116.6.data}/scripts/dlp.py +128 -128
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/METADATA +186 -186
- dtlpy-1.116.6.dist-info/RECORD +239 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/WHEEL +1 -1
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.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.116.6.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/top_level.txt +0 -0
dtlpy/repositories/webhooks.py
CHANGED
|
@@ -1,249 +1,249 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
from urllib.parse import urlencode
|
|
3
|
-
from .. import exceptions, entities, miscellaneous
|
|
4
|
-
from ..services.api_client import ApiClient
|
|
5
|
-
|
|
6
|
-
logger = logging.getLogger(name='dtlpy')
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class Webhooks:
|
|
10
|
-
"""
|
|
11
|
-
Webhooks repository
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
def __init__(self,
|
|
15
|
-
client_api: ApiClient,
|
|
16
|
-
project: entities.Project = None):
|
|
17
|
-
self._project = project
|
|
18
|
-
self._client_api = client_api
|
|
19
|
-
self._url = '/webhooks'
|
|
20
|
-
|
|
21
|
-
############
|
|
22
|
-
# entities #
|
|
23
|
-
############
|
|
24
|
-
@property
|
|
25
|
-
def project(self) -> entities.Project:
|
|
26
|
-
if self._project is None:
|
|
27
|
-
raise exceptions.PlatformException(
|
|
28
|
-
error='2001',
|
|
29
|
-
message='Missing "project". need to set a Project entity or use project.webhooks repository')
|
|
30
|
-
assert isinstance(self._project, entities.Project)
|
|
31
|
-
return self._project
|
|
32
|
-
|
|
33
|
-
@project.setter
|
|
34
|
-
def project(self, project: entities.Project):
|
|
35
|
-
if not isinstance(project, entities.Project):
|
|
36
|
-
raise ValueError('Must input a valid Project entity')
|
|
37
|
-
self._project = project
|
|
38
|
-
|
|
39
|
-
###########
|
|
40
|
-
# methods #
|
|
41
|
-
###########
|
|
42
|
-
def create(self,
|
|
43
|
-
name: str,
|
|
44
|
-
project_id: str = None,
|
|
45
|
-
http_method=None,
|
|
46
|
-
hook_url=None,
|
|
47
|
-
project: entities.Project = None) -> entities.Webhook:
|
|
48
|
-
"""
|
|
49
|
-
Create web hook entity
|
|
50
|
-
|
|
51
|
-
:param name:
|
|
52
|
-
:param project_id:
|
|
53
|
-
:param http_method:
|
|
54
|
-
:param hook_url:
|
|
55
|
-
:param project:
|
|
56
|
-
:return:
|
|
57
|
-
"""
|
|
58
|
-
if project is None:
|
|
59
|
-
project = self._project
|
|
60
|
-
|
|
61
|
-
if project_id is None and project is None:
|
|
62
|
-
raise exceptions.PlatformException('400', 'Must provide project or project id')
|
|
63
|
-
|
|
64
|
-
if project_id is None:
|
|
65
|
-
project_id = project.id
|
|
66
|
-
|
|
67
|
-
# payload
|
|
68
|
-
payload = {
|
|
69
|
-
'name': name,
|
|
70
|
-
'httpMethod': http_method,
|
|
71
|
-
'hookUrl': hook_url,
|
|
72
|
-
'project': project_id
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
# request
|
|
76
|
-
success, response = self._client_api.gen_request(req_type='post',
|
|
77
|
-
path=self._url,
|
|
78
|
-
json_req=payload)
|
|
79
|
-
|
|
80
|
-
# exception handling
|
|
81
|
-
if not success:
|
|
82
|
-
raise exceptions.PlatformException(response)
|
|
83
|
-
|
|
84
|
-
# return entity
|
|
85
|
-
return entities.Webhook.from_json(_json=response.json(),
|
|
86
|
-
client_api=self._client_api,
|
|
87
|
-
project=project)
|
|
88
|
-
|
|
89
|
-
def list(self, filters: entities.Filters = None) -> entities.PagedEntities:
|
|
90
|
-
"""
|
|
91
|
-
List web hooks
|
|
92
|
-
|
|
93
|
-
:param dtlpy.entities.filters.Filters filters: Filters entity or a dictionary containing filters parameters
|
|
94
|
-
:return: Paged entity
|
|
95
|
-
:rtype: dtlpy.entities.paged_entities.PagedEntities
|
|
96
|
-
"""
|
|
97
|
-
if filters is None:
|
|
98
|
-
filters = entities.Filters(resource=entities.FiltersResource.WEBHOOK)
|
|
99
|
-
if self._project is not None:
|
|
100
|
-
filters.add(field='projectId', values=self._project.id)
|
|
101
|
-
# assert type filters
|
|
102
|
-
elif not isinstance(filters, entities.Filters):
|
|
103
|
-
raise exceptions.PlatformException(error='400',
|
|
104
|
-
message='Unknown filters type: {!r}'.format(type(filters)))
|
|
105
|
-
|
|
106
|
-
if filters.resource != entities.FiltersResource.WEBHOOK:
|
|
107
|
-
raise exceptions.PlatformException(
|
|
108
|
-
error='400',
|
|
109
|
-
message='Filters resource must to be FiltersResource.WEBHOOK. Got: {!r}'.format(filters.resource))
|
|
110
|
-
|
|
111
|
-
paged = entities.PagedEntities(items_repository=self,
|
|
112
|
-
filters=filters,
|
|
113
|
-
page_offset=filters.page,
|
|
114
|
-
page_size=filters.page_size,
|
|
115
|
-
client_api=self._client_api)
|
|
116
|
-
paged.get_page()
|
|
117
|
-
return paged
|
|
118
|
-
|
|
119
|
-
def _build_entities_from_response(self, response_items) -> miscellaneous.List[entities.Webhook]:
|
|
120
|
-
# handle execution
|
|
121
|
-
pool = self._client_api.thread_pools(pool_name='entity.create')
|
|
122
|
-
jobs = [None for _ in range(len(response_items))]
|
|
123
|
-
# return execution list
|
|
124
|
-
for i_item, item in enumerate(response_items):
|
|
125
|
-
jobs[i_item] = pool.submit(entities.Webhook.from_json,
|
|
126
|
-
**{'client_api': self._client_api,
|
|
127
|
-
'_json': item,
|
|
128
|
-
'project': self._project})
|
|
129
|
-
|
|
130
|
-
# get all results
|
|
131
|
-
items = miscellaneous.List([j.result() for j in jobs])
|
|
132
|
-
return items
|
|
133
|
-
|
|
134
|
-
def _list(self, filters: entities.Filters):
|
|
135
|
-
"""
|
|
136
|
-
List web hooks
|
|
137
|
-
|
|
138
|
-
:return:
|
|
139
|
-
"""
|
|
140
|
-
|
|
141
|
-
query_params = {
|
|
142
|
-
'pageOffset': filters.page,
|
|
143
|
-
'pageSize': filters.page_size
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
url = self._url + '?{}'.format(
|
|
147
|
-
urlencode({key: val for key, val in query_params.items() if val is not None}, doseq=True))
|
|
148
|
-
|
|
149
|
-
# request
|
|
150
|
-
success, response = self._client_api.gen_request(req_type='get',
|
|
151
|
-
path=url)
|
|
152
|
-
|
|
153
|
-
if not success:
|
|
154
|
-
raise exceptions.PlatformException(response)
|
|
155
|
-
|
|
156
|
-
return response.json()
|
|
157
|
-
|
|
158
|
-
def get(self, webhook_id=None, webhook_name=None) -> entities.Webhook:
|
|
159
|
-
"""
|
|
160
|
-
Get Web hook
|
|
161
|
-
|
|
162
|
-
:param webhook_id:
|
|
163
|
-
:param webhook_name:
|
|
164
|
-
:return: Web hook execution object
|
|
165
|
-
"""
|
|
166
|
-
if webhook_id is None and webhook_name is None:
|
|
167
|
-
raise exceptions.PlatformException('400', 'Must provide webhook_id or webhook_name id')
|
|
168
|
-
elif webhook_id is None:
|
|
169
|
-
webhooks_pages = self.list(
|
|
170
|
-
filters=entities.Filters(field='name', values=webhook_name, resource=entities.FiltersResource.WEBHOOK))
|
|
171
|
-
if webhooks_pages.items_count == 0:
|
|
172
|
-
raise exceptions.PlatformException('404', 'Not found: web hook: {}'.format(webhook_name))
|
|
173
|
-
elif webhooks_pages.items_count > 1:
|
|
174
|
-
raise exceptions.PlatformException('404',
|
|
175
|
-
'More than one webhooks found: web hook: {}'.format(webhook_name))
|
|
176
|
-
else:
|
|
177
|
-
webhook = webhooks_pages.items[0]
|
|
178
|
-
else:
|
|
179
|
-
success, response = self._client_api.gen_request(
|
|
180
|
-
req_type="get",
|
|
181
|
-
path="{}/{}".format(self._url, webhook_id)
|
|
182
|
-
)
|
|
183
|
-
|
|
184
|
-
# exception handling
|
|
185
|
-
if not success:
|
|
186
|
-
raise exceptions.PlatformException(response)
|
|
187
|
-
|
|
188
|
-
# return entity
|
|
189
|
-
webhook = entities.Webhook.from_json(client_api=self._client_api,
|
|
190
|
-
_json=response.json(),
|
|
191
|
-
project=self._project)
|
|
192
|
-
# verify input webhook name is same as the given id
|
|
193
|
-
if webhook_name is not None and webhook.name != webhook_name:
|
|
194
|
-
logger.warning(
|
|
195
|
-
"Mismatch found in webhooks.get: webhook_name is different then webhook.name:"
|
|
196
|
-
" {!r} != {!r}".format(
|
|
197
|
-
webhook_name,
|
|
198
|
-
webhook.name))
|
|
199
|
-
|
|
200
|
-
return webhook
|
|
201
|
-
|
|
202
|
-
def delete(self, webhook_id=None, webhook_name=None):
|
|
203
|
-
"""
|
|
204
|
-
Delete Trigger object
|
|
205
|
-
|
|
206
|
-
:param webhook_id:
|
|
207
|
-
:param webhook_name:
|
|
208
|
-
:return: True
|
|
209
|
-
"""
|
|
210
|
-
if webhook_id is None:
|
|
211
|
-
if webhook_name is None:
|
|
212
|
-
raise exceptions.PlatformException('400', 'Must provide either webhook name or webhook id')
|
|
213
|
-
else:
|
|
214
|
-
webhook_id = self.get(webhook_name=webhook_name).id
|
|
215
|
-
|
|
216
|
-
# request
|
|
217
|
-
success, response = self._client_api.gen_request(
|
|
218
|
-
req_type="delete",
|
|
219
|
-
path="{}/{}".format(self._url, webhook_id)
|
|
220
|
-
)
|
|
221
|
-
# exception handling
|
|
222
|
-
if not success:
|
|
223
|
-
raise exceptions.PlatformException(response)
|
|
224
|
-
return True
|
|
225
|
-
|
|
226
|
-
def update(self, webhook: entities.Webhook) -> entities.Webhook:
|
|
227
|
-
"""
|
|
228
|
-
|
|
229
|
-
:param webhook: Webhook entity
|
|
230
|
-
:return: Webhook entity
|
|
231
|
-
"""
|
|
232
|
-
assert isinstance(webhook, entities.Webhook)
|
|
233
|
-
|
|
234
|
-
# payload
|
|
235
|
-
payload = webhook.to_json()
|
|
236
|
-
|
|
237
|
-
# request
|
|
238
|
-
success, response = self._client_api.gen_request(req_type='patch',
|
|
239
|
-
path='{}/{}'.format(self._url, webhook.id),
|
|
240
|
-
json_req=payload)
|
|
241
|
-
|
|
242
|
-
# exception handling
|
|
243
|
-
if not success:
|
|
244
|
-
raise exceptions.PlatformException(response)
|
|
245
|
-
|
|
246
|
-
# return entity
|
|
247
|
-
return entities.Webhook.from_json(_json=response.json(),
|
|
248
|
-
client_api=self._client_api,
|
|
249
|
-
project=self._project)
|
|
1
|
+
import logging
|
|
2
|
+
from urllib.parse import urlencode
|
|
3
|
+
from .. import exceptions, entities, miscellaneous
|
|
4
|
+
from ..services.api_client import ApiClient
|
|
5
|
+
|
|
6
|
+
logger = logging.getLogger(name='dtlpy')
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Webhooks:
|
|
10
|
+
"""
|
|
11
|
+
Webhooks repository
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def __init__(self,
|
|
15
|
+
client_api: ApiClient,
|
|
16
|
+
project: entities.Project = None):
|
|
17
|
+
self._project = project
|
|
18
|
+
self._client_api = client_api
|
|
19
|
+
self._url = '/webhooks'
|
|
20
|
+
|
|
21
|
+
############
|
|
22
|
+
# entities #
|
|
23
|
+
############
|
|
24
|
+
@property
|
|
25
|
+
def project(self) -> entities.Project:
|
|
26
|
+
if self._project is None:
|
|
27
|
+
raise exceptions.PlatformException(
|
|
28
|
+
error='2001',
|
|
29
|
+
message='Missing "project". need to set a Project entity or use project.webhooks repository')
|
|
30
|
+
assert isinstance(self._project, entities.Project)
|
|
31
|
+
return self._project
|
|
32
|
+
|
|
33
|
+
@project.setter
|
|
34
|
+
def project(self, project: entities.Project):
|
|
35
|
+
if not isinstance(project, entities.Project):
|
|
36
|
+
raise ValueError('Must input a valid Project entity')
|
|
37
|
+
self._project = project
|
|
38
|
+
|
|
39
|
+
###########
|
|
40
|
+
# methods #
|
|
41
|
+
###########
|
|
42
|
+
def create(self,
|
|
43
|
+
name: str,
|
|
44
|
+
project_id: str = None,
|
|
45
|
+
http_method=None,
|
|
46
|
+
hook_url=None,
|
|
47
|
+
project: entities.Project = None) -> entities.Webhook:
|
|
48
|
+
"""
|
|
49
|
+
Create web hook entity
|
|
50
|
+
|
|
51
|
+
:param name:
|
|
52
|
+
:param project_id:
|
|
53
|
+
:param http_method:
|
|
54
|
+
:param hook_url:
|
|
55
|
+
:param project:
|
|
56
|
+
:return:
|
|
57
|
+
"""
|
|
58
|
+
if project is None:
|
|
59
|
+
project = self._project
|
|
60
|
+
|
|
61
|
+
if project_id is None and project is None:
|
|
62
|
+
raise exceptions.PlatformException('400', 'Must provide project or project id')
|
|
63
|
+
|
|
64
|
+
if project_id is None:
|
|
65
|
+
project_id = project.id
|
|
66
|
+
|
|
67
|
+
# payload
|
|
68
|
+
payload = {
|
|
69
|
+
'name': name,
|
|
70
|
+
'httpMethod': http_method,
|
|
71
|
+
'hookUrl': hook_url,
|
|
72
|
+
'project': project_id
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
# request
|
|
76
|
+
success, response = self._client_api.gen_request(req_type='post',
|
|
77
|
+
path=self._url,
|
|
78
|
+
json_req=payload)
|
|
79
|
+
|
|
80
|
+
# exception handling
|
|
81
|
+
if not success:
|
|
82
|
+
raise exceptions.PlatformException(response)
|
|
83
|
+
|
|
84
|
+
# return entity
|
|
85
|
+
return entities.Webhook.from_json(_json=response.json(),
|
|
86
|
+
client_api=self._client_api,
|
|
87
|
+
project=project)
|
|
88
|
+
|
|
89
|
+
def list(self, filters: entities.Filters = None) -> entities.PagedEntities:
|
|
90
|
+
"""
|
|
91
|
+
List web hooks
|
|
92
|
+
|
|
93
|
+
:param dtlpy.entities.filters.Filters filters: Filters entity or a dictionary containing filters parameters
|
|
94
|
+
:return: Paged entity
|
|
95
|
+
:rtype: dtlpy.entities.paged_entities.PagedEntities
|
|
96
|
+
"""
|
|
97
|
+
if filters is None:
|
|
98
|
+
filters = entities.Filters(resource=entities.FiltersResource.WEBHOOK)
|
|
99
|
+
if self._project is not None:
|
|
100
|
+
filters.add(field='projectId', values=self._project.id)
|
|
101
|
+
# assert type filters
|
|
102
|
+
elif not isinstance(filters, entities.Filters):
|
|
103
|
+
raise exceptions.PlatformException(error='400',
|
|
104
|
+
message='Unknown filters type: {!r}'.format(type(filters)))
|
|
105
|
+
|
|
106
|
+
if filters.resource != entities.FiltersResource.WEBHOOK:
|
|
107
|
+
raise exceptions.PlatformException(
|
|
108
|
+
error='400',
|
|
109
|
+
message='Filters resource must to be FiltersResource.WEBHOOK. Got: {!r}'.format(filters.resource))
|
|
110
|
+
|
|
111
|
+
paged = entities.PagedEntities(items_repository=self,
|
|
112
|
+
filters=filters,
|
|
113
|
+
page_offset=filters.page,
|
|
114
|
+
page_size=filters.page_size,
|
|
115
|
+
client_api=self._client_api)
|
|
116
|
+
paged.get_page()
|
|
117
|
+
return paged
|
|
118
|
+
|
|
119
|
+
def _build_entities_from_response(self, response_items) -> miscellaneous.List[entities.Webhook]:
|
|
120
|
+
# handle execution
|
|
121
|
+
pool = self._client_api.thread_pools(pool_name='entity.create')
|
|
122
|
+
jobs = [None for _ in range(len(response_items))]
|
|
123
|
+
# return execution list
|
|
124
|
+
for i_item, item in enumerate(response_items):
|
|
125
|
+
jobs[i_item] = pool.submit(entities.Webhook.from_json,
|
|
126
|
+
**{'client_api': self._client_api,
|
|
127
|
+
'_json': item,
|
|
128
|
+
'project': self._project})
|
|
129
|
+
|
|
130
|
+
# get all results
|
|
131
|
+
items = miscellaneous.List([j.result() for j in jobs])
|
|
132
|
+
return items
|
|
133
|
+
|
|
134
|
+
def _list(self, filters: entities.Filters):
|
|
135
|
+
"""
|
|
136
|
+
List web hooks
|
|
137
|
+
|
|
138
|
+
:return:
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
query_params = {
|
|
142
|
+
'pageOffset': filters.page,
|
|
143
|
+
'pageSize': filters.page_size
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
url = self._url + '?{}'.format(
|
|
147
|
+
urlencode({key: val for key, val in query_params.items() if val is not None}, doseq=True))
|
|
148
|
+
|
|
149
|
+
# request
|
|
150
|
+
success, response = self._client_api.gen_request(req_type='get',
|
|
151
|
+
path=url)
|
|
152
|
+
|
|
153
|
+
if not success:
|
|
154
|
+
raise exceptions.PlatformException(response)
|
|
155
|
+
|
|
156
|
+
return response.json()
|
|
157
|
+
|
|
158
|
+
def get(self, webhook_id=None, webhook_name=None) -> entities.Webhook:
|
|
159
|
+
"""
|
|
160
|
+
Get Web hook
|
|
161
|
+
|
|
162
|
+
:param webhook_id:
|
|
163
|
+
:param webhook_name:
|
|
164
|
+
:return: Web hook execution object
|
|
165
|
+
"""
|
|
166
|
+
if webhook_id is None and webhook_name is None:
|
|
167
|
+
raise exceptions.PlatformException('400', 'Must provide webhook_id or webhook_name id')
|
|
168
|
+
elif webhook_id is None:
|
|
169
|
+
webhooks_pages = self.list(
|
|
170
|
+
filters=entities.Filters(field='name', values=webhook_name, resource=entities.FiltersResource.WEBHOOK))
|
|
171
|
+
if webhooks_pages.items_count == 0:
|
|
172
|
+
raise exceptions.PlatformException('404', 'Not found: web hook: {}'.format(webhook_name))
|
|
173
|
+
elif webhooks_pages.items_count > 1:
|
|
174
|
+
raise exceptions.PlatformException('404',
|
|
175
|
+
'More than one webhooks found: web hook: {}'.format(webhook_name))
|
|
176
|
+
else:
|
|
177
|
+
webhook = webhooks_pages.items[0]
|
|
178
|
+
else:
|
|
179
|
+
success, response = self._client_api.gen_request(
|
|
180
|
+
req_type="get",
|
|
181
|
+
path="{}/{}".format(self._url, webhook_id)
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
# exception handling
|
|
185
|
+
if not success:
|
|
186
|
+
raise exceptions.PlatformException(response)
|
|
187
|
+
|
|
188
|
+
# return entity
|
|
189
|
+
webhook = entities.Webhook.from_json(client_api=self._client_api,
|
|
190
|
+
_json=response.json(),
|
|
191
|
+
project=self._project)
|
|
192
|
+
# verify input webhook name is same as the given id
|
|
193
|
+
if webhook_name is not None and webhook.name != webhook_name:
|
|
194
|
+
logger.warning(
|
|
195
|
+
"Mismatch found in webhooks.get: webhook_name is different then webhook.name:"
|
|
196
|
+
" {!r} != {!r}".format(
|
|
197
|
+
webhook_name,
|
|
198
|
+
webhook.name))
|
|
199
|
+
|
|
200
|
+
return webhook
|
|
201
|
+
|
|
202
|
+
def delete(self, webhook_id=None, webhook_name=None):
|
|
203
|
+
"""
|
|
204
|
+
Delete Trigger object
|
|
205
|
+
|
|
206
|
+
:param webhook_id:
|
|
207
|
+
:param webhook_name:
|
|
208
|
+
:return: True
|
|
209
|
+
"""
|
|
210
|
+
if webhook_id is None:
|
|
211
|
+
if webhook_name is None:
|
|
212
|
+
raise exceptions.PlatformException('400', 'Must provide either webhook name or webhook id')
|
|
213
|
+
else:
|
|
214
|
+
webhook_id = self.get(webhook_name=webhook_name).id
|
|
215
|
+
|
|
216
|
+
# request
|
|
217
|
+
success, response = self._client_api.gen_request(
|
|
218
|
+
req_type="delete",
|
|
219
|
+
path="{}/{}".format(self._url, webhook_id)
|
|
220
|
+
)
|
|
221
|
+
# exception handling
|
|
222
|
+
if not success:
|
|
223
|
+
raise exceptions.PlatformException(response)
|
|
224
|
+
return True
|
|
225
|
+
|
|
226
|
+
def update(self, webhook: entities.Webhook) -> entities.Webhook:
|
|
227
|
+
"""
|
|
228
|
+
|
|
229
|
+
:param webhook: Webhook entity
|
|
230
|
+
:return: Webhook entity
|
|
231
|
+
"""
|
|
232
|
+
assert isinstance(webhook, entities.Webhook)
|
|
233
|
+
|
|
234
|
+
# payload
|
|
235
|
+
payload = webhook.to_json()
|
|
236
|
+
|
|
237
|
+
# request
|
|
238
|
+
success, response = self._client_api.gen_request(req_type='patch',
|
|
239
|
+
path='{}/{}'.format(self._url, webhook.id),
|
|
240
|
+
json_req=payload)
|
|
241
|
+
|
|
242
|
+
# exception handling
|
|
243
|
+
if not success:
|
|
244
|
+
raise exceptions.PlatformException(response)
|
|
245
|
+
|
|
246
|
+
# return entity
|
|
247
|
+
return entities.Webhook.from_json(_json=response.json(),
|
|
248
|
+
client_api=self._client_api,
|
|
249
|
+
project=self._project)
|
dtlpy/services/__init__.py
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
#! /usr/bin/env python3
|
|
2
|
-
# This file is part of DTLPY.
|
|
3
|
-
#
|
|
4
|
-
# DTLPY is free software: you can redistribute it and/or modify
|
|
5
|
-
# it under the terms of the GNU General Public License as published by
|
|
6
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
7
|
-
# (at your option) any later version.
|
|
8
|
-
#
|
|
9
|
-
# DTLPY is distributed in the hope that it will be useful,
|
|
10
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
-
# GNU General Public License for more details.
|
|
13
|
-
#
|
|
14
|
-
# You should have received a copy of the GNU General Public License
|
|
15
|
-
# along with DTLPY. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
-
from .async_utils import AsyncResponse, AsyncThreadEventLoop
|
|
17
|
-
from .events import Events
|
|
18
|
-
from .cookie import CookieIO
|
|
19
|
-
from .create_logger import DataloopLogger, DtlpyFilter
|
|
20
|
-
from .reporter import Reporter
|
|
21
|
-
from . import service_defaults
|
|
22
|
-
|
|
1
|
+
#! /usr/bin/env python3
|
|
2
|
+
# This file is part of DTLPY.
|
|
3
|
+
#
|
|
4
|
+
# DTLPY is free software: you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# DTLPY is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
# GNU General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU General Public License
|
|
15
|
+
# along with DTLPY. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
from .async_utils import AsyncResponse, AsyncThreadEventLoop
|
|
17
|
+
from .events import Events
|
|
18
|
+
from .cookie import CookieIO
|
|
19
|
+
from .create_logger import DataloopLogger, DtlpyFilter
|
|
20
|
+
from .reporter import Reporter
|
|
21
|
+
from . import service_defaults
|
|
22
|
+
|