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.
Files changed (238) hide show
  1. dtlpy/__init__.py +491 -491
  2. dtlpy/__version__.py +1 -1
  3. dtlpy/assets/__init__.py +26 -26
  4. dtlpy/assets/code_server/config.yaml +2 -2
  5. dtlpy/assets/code_server/installation.sh +24 -24
  6. dtlpy/assets/code_server/launch.json +13 -13
  7. dtlpy/assets/code_server/settings.json +2 -2
  8. dtlpy/assets/main.py +53 -53
  9. dtlpy/assets/main_partial.py +18 -18
  10. dtlpy/assets/mock.json +11 -11
  11. dtlpy/assets/model_adapter.py +83 -83
  12. dtlpy/assets/package.json +61 -61
  13. dtlpy/assets/package_catalog.json +29 -29
  14. dtlpy/assets/package_gitignore +307 -307
  15. dtlpy/assets/service_runners/__init__.py +33 -33
  16. dtlpy/assets/service_runners/converter.py +96 -96
  17. dtlpy/assets/service_runners/multi_method.py +49 -49
  18. dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
  19. dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
  20. dtlpy/assets/service_runners/multi_method_item.py +52 -52
  21. dtlpy/assets/service_runners/multi_method_json.py +52 -52
  22. dtlpy/assets/service_runners/single_method.py +37 -37
  23. dtlpy/assets/service_runners/single_method_annotation.py +43 -43
  24. dtlpy/assets/service_runners/single_method_dataset.py +43 -43
  25. dtlpy/assets/service_runners/single_method_item.py +41 -41
  26. dtlpy/assets/service_runners/single_method_json.py +42 -42
  27. dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
  28. dtlpy/assets/voc_annotation_template.xml +23 -23
  29. dtlpy/caches/base_cache.py +32 -32
  30. dtlpy/caches/cache.py +473 -473
  31. dtlpy/caches/dl_cache.py +201 -201
  32. dtlpy/caches/filesystem_cache.py +89 -89
  33. dtlpy/caches/redis_cache.py +84 -84
  34. dtlpy/dlp/__init__.py +20 -20
  35. dtlpy/dlp/cli_utilities.py +367 -367
  36. dtlpy/dlp/command_executor.py +764 -764
  37. dtlpy/dlp/dlp +1 -1
  38. dtlpy/dlp/dlp.bat +1 -1
  39. dtlpy/dlp/dlp.py +128 -128
  40. dtlpy/dlp/parser.py +651 -651
  41. dtlpy/entities/__init__.py +83 -83
  42. dtlpy/entities/analytic.py +347 -347
  43. dtlpy/entities/annotation.py +1879 -1879
  44. dtlpy/entities/annotation_collection.py +699 -699
  45. dtlpy/entities/annotation_definitions/__init__.py +20 -20
  46. dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
  47. dtlpy/entities/annotation_definitions/box.py +195 -195
  48. dtlpy/entities/annotation_definitions/classification.py +67 -67
  49. dtlpy/entities/annotation_definitions/comparison.py +72 -72
  50. dtlpy/entities/annotation_definitions/cube.py +204 -204
  51. dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
  52. dtlpy/entities/annotation_definitions/description.py +32 -32
  53. dtlpy/entities/annotation_definitions/ellipse.py +124 -124
  54. dtlpy/entities/annotation_definitions/free_text.py +62 -62
  55. dtlpy/entities/annotation_definitions/gis.py +69 -69
  56. dtlpy/entities/annotation_definitions/note.py +139 -139
  57. dtlpy/entities/annotation_definitions/point.py +117 -117
  58. dtlpy/entities/annotation_definitions/polygon.py +182 -182
  59. dtlpy/entities/annotation_definitions/polyline.py +111 -111
  60. dtlpy/entities/annotation_definitions/pose.py +92 -92
  61. dtlpy/entities/annotation_definitions/ref_image.py +86 -86
  62. dtlpy/entities/annotation_definitions/segmentation.py +240 -240
  63. dtlpy/entities/annotation_definitions/subtitle.py +34 -34
  64. dtlpy/entities/annotation_definitions/text.py +85 -85
  65. dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
  66. dtlpy/entities/app.py +220 -220
  67. dtlpy/entities/app_module.py +107 -107
  68. dtlpy/entities/artifact.py +174 -174
  69. dtlpy/entities/assignment.py +399 -399
  70. dtlpy/entities/base_entity.py +214 -214
  71. dtlpy/entities/bot.py +113 -113
  72. dtlpy/entities/codebase.py +292 -292
  73. dtlpy/entities/collection.py +38 -38
  74. dtlpy/entities/command.py +169 -169
  75. dtlpy/entities/compute.py +449 -449
  76. dtlpy/entities/dataset.py +1299 -1299
  77. dtlpy/entities/directory_tree.py +44 -44
  78. dtlpy/entities/dpk.py +470 -470
  79. dtlpy/entities/driver.py +235 -235
  80. dtlpy/entities/execution.py +397 -397
  81. dtlpy/entities/feature.py +124 -124
  82. dtlpy/entities/feature_set.py +145 -145
  83. dtlpy/entities/filters.py +798 -798
  84. dtlpy/entities/gis_item.py +107 -107
  85. dtlpy/entities/integration.py +184 -184
  86. dtlpy/entities/item.py +959 -959
  87. dtlpy/entities/label.py +123 -123
  88. dtlpy/entities/links.py +85 -85
  89. dtlpy/entities/message.py +175 -175
  90. dtlpy/entities/model.py +684 -684
  91. dtlpy/entities/node.py +1005 -1005
  92. dtlpy/entities/ontology.py +810 -803
  93. dtlpy/entities/organization.py +287 -287
  94. dtlpy/entities/package.py +657 -657
  95. dtlpy/entities/package_defaults.py +5 -5
  96. dtlpy/entities/package_function.py +185 -185
  97. dtlpy/entities/package_module.py +113 -113
  98. dtlpy/entities/package_slot.py +118 -118
  99. dtlpy/entities/paged_entities.py +299 -299
  100. dtlpy/entities/pipeline.py +624 -624
  101. dtlpy/entities/pipeline_execution.py +279 -279
  102. dtlpy/entities/project.py +394 -394
  103. dtlpy/entities/prompt_item.py +505 -505
  104. dtlpy/entities/recipe.py +301 -301
  105. dtlpy/entities/reflect_dict.py +102 -102
  106. dtlpy/entities/resource_execution.py +138 -138
  107. dtlpy/entities/service.py +963 -963
  108. dtlpy/entities/service_driver.py +117 -117
  109. dtlpy/entities/setting.py +294 -294
  110. dtlpy/entities/task.py +495 -495
  111. dtlpy/entities/time_series.py +143 -143
  112. dtlpy/entities/trigger.py +426 -426
  113. dtlpy/entities/user.py +118 -118
  114. dtlpy/entities/webhook.py +124 -124
  115. dtlpy/examples/__init__.py +19 -19
  116. dtlpy/examples/add_labels.py +135 -135
  117. dtlpy/examples/add_metadata_to_item.py +21 -21
  118. dtlpy/examples/annotate_items_using_model.py +65 -65
  119. dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
  120. dtlpy/examples/annotations_convert_to_voc.py +9 -9
  121. dtlpy/examples/annotations_convert_to_yolo.py +9 -9
  122. dtlpy/examples/convert_annotation_types.py +51 -51
  123. dtlpy/examples/converter.py +143 -143
  124. dtlpy/examples/copy_annotations.py +22 -22
  125. dtlpy/examples/copy_folder.py +31 -31
  126. dtlpy/examples/create_annotations.py +51 -51
  127. dtlpy/examples/create_video_annotations.py +83 -83
  128. dtlpy/examples/delete_annotations.py +26 -26
  129. dtlpy/examples/filters.py +113 -113
  130. dtlpy/examples/move_item.py +23 -23
  131. dtlpy/examples/play_video_annotation.py +13 -13
  132. dtlpy/examples/show_item_and_mask.py +53 -53
  133. dtlpy/examples/triggers.py +49 -49
  134. dtlpy/examples/upload_batch_of_items.py +20 -20
  135. dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
  136. dtlpy/examples/upload_items_with_modalities.py +43 -43
  137. dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
  138. dtlpy/examples/upload_yolo_format_annotations.py +70 -70
  139. dtlpy/exceptions.py +125 -125
  140. dtlpy/miscellaneous/__init__.py +20 -20
  141. dtlpy/miscellaneous/dict_differ.py +95 -95
  142. dtlpy/miscellaneous/git_utils.py +217 -217
  143. dtlpy/miscellaneous/json_utils.py +14 -14
  144. dtlpy/miscellaneous/list_print.py +105 -105
  145. dtlpy/miscellaneous/zipping.py +130 -130
  146. dtlpy/ml/__init__.py +20 -20
  147. dtlpy/ml/base_feature_extractor_adapter.py +27 -27
  148. dtlpy/ml/base_model_adapter.py +1257 -1230
  149. dtlpy/ml/metrics.py +461 -461
  150. dtlpy/ml/predictions_utils.py +274 -274
  151. dtlpy/ml/summary_writer.py +57 -57
  152. dtlpy/ml/train_utils.py +60 -60
  153. dtlpy/new_instance.py +252 -252
  154. dtlpy/repositories/__init__.py +56 -56
  155. dtlpy/repositories/analytics.py +85 -85
  156. dtlpy/repositories/annotations.py +916 -916
  157. dtlpy/repositories/apps.py +383 -383
  158. dtlpy/repositories/artifacts.py +452 -452
  159. dtlpy/repositories/assignments.py +599 -599
  160. dtlpy/repositories/bots.py +213 -213
  161. dtlpy/repositories/codebases.py +559 -559
  162. dtlpy/repositories/collections.py +332 -332
  163. dtlpy/repositories/commands.py +152 -152
  164. dtlpy/repositories/compositions.py +61 -61
  165. dtlpy/repositories/computes.py +439 -439
  166. dtlpy/repositories/datasets.py +1504 -1504
  167. dtlpy/repositories/downloader.py +976 -923
  168. dtlpy/repositories/dpks.py +433 -433
  169. dtlpy/repositories/drivers.py +482 -482
  170. dtlpy/repositories/executions.py +815 -815
  171. dtlpy/repositories/feature_sets.py +226 -226
  172. dtlpy/repositories/features.py +255 -255
  173. dtlpy/repositories/integrations.py +484 -484
  174. dtlpy/repositories/items.py +912 -912
  175. dtlpy/repositories/messages.py +94 -94
  176. dtlpy/repositories/models.py +1000 -1000
  177. dtlpy/repositories/nodes.py +80 -80
  178. dtlpy/repositories/ontologies.py +511 -511
  179. dtlpy/repositories/organizations.py +525 -525
  180. dtlpy/repositories/packages.py +1941 -1941
  181. dtlpy/repositories/pipeline_executions.py +451 -451
  182. dtlpy/repositories/pipelines.py +640 -640
  183. dtlpy/repositories/projects.py +539 -539
  184. dtlpy/repositories/recipes.py +419 -399
  185. dtlpy/repositories/resource_executions.py +137 -137
  186. dtlpy/repositories/schema.py +120 -120
  187. dtlpy/repositories/service_drivers.py +213 -213
  188. dtlpy/repositories/services.py +1704 -1704
  189. dtlpy/repositories/settings.py +339 -339
  190. dtlpy/repositories/tasks.py +1477 -1477
  191. dtlpy/repositories/times_series.py +278 -278
  192. dtlpy/repositories/triggers.py +536 -536
  193. dtlpy/repositories/upload_element.py +257 -257
  194. dtlpy/repositories/uploader.py +661 -661
  195. dtlpy/repositories/webhooks.py +249 -249
  196. dtlpy/services/__init__.py +22 -22
  197. dtlpy/services/aihttp_retry.py +131 -131
  198. dtlpy/services/api_client.py +1785 -1785
  199. dtlpy/services/api_reference.py +40 -40
  200. dtlpy/services/async_utils.py +133 -133
  201. dtlpy/services/calls_counter.py +44 -44
  202. dtlpy/services/check_sdk.py +68 -68
  203. dtlpy/services/cookie.py +115 -115
  204. dtlpy/services/create_logger.py +156 -156
  205. dtlpy/services/events.py +84 -84
  206. dtlpy/services/logins.py +235 -235
  207. dtlpy/services/reporter.py +256 -256
  208. dtlpy/services/service_defaults.py +91 -91
  209. dtlpy/utilities/__init__.py +20 -20
  210. dtlpy/utilities/annotations/__init__.py +16 -16
  211. dtlpy/utilities/annotations/annotation_converters.py +269 -269
  212. dtlpy/utilities/base_package_runner.py +285 -264
  213. dtlpy/utilities/converter.py +1650 -1650
  214. dtlpy/utilities/dataset_generators/__init__.py +1 -1
  215. dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
  216. dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
  217. dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
  218. dtlpy/utilities/local_development/__init__.py +1 -1
  219. dtlpy/utilities/local_development/local_session.py +179 -179
  220. dtlpy/utilities/reports/__init__.py +2 -2
  221. dtlpy/utilities/reports/figures.py +343 -343
  222. dtlpy/utilities/reports/report.py +71 -71
  223. dtlpy/utilities/videos/__init__.py +17 -17
  224. dtlpy/utilities/videos/video_player.py +598 -598
  225. dtlpy/utilities/videos/videos.py +470 -470
  226. {dtlpy-1.115.44.data → dtlpy-1.116.6.data}/scripts/dlp +1 -1
  227. dtlpy-1.116.6.data/scripts/dlp.bat +2 -0
  228. {dtlpy-1.115.44.data → dtlpy-1.116.6.data}/scripts/dlp.py +128 -128
  229. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/METADATA +186 -186
  230. dtlpy-1.116.6.dist-info/RECORD +239 -0
  231. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/WHEEL +1 -1
  232. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/licenses/LICENSE +200 -200
  233. tests/features/environment.py +551 -551
  234. dtlpy/assets/__pycache__/__init__.cpython-310.pyc +0 -0
  235. dtlpy-1.115.44.data/scripts/dlp.bat +0 -2
  236. dtlpy-1.115.44.dist-info/RECORD +0 -240
  237. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/entry_points.txt +0 -0
  238. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/top_level.txt +0 -0
@@ -1,339 +1,339 @@
1
- import logging
2
- from typing import Union
3
-
4
- from .. import exceptions, entities, ApiClient
5
-
6
- logger = logging.getLogger(name='dtlpy')
7
- BASE_URL = '/settings'
8
-
9
-
10
- class Settings:
11
- def __init__(
12
- self,
13
- client_api: ApiClient,
14
- project: entities.Project = None,
15
- dataset: entities.Dataset = None,
16
- org: entities.Organization = None,
17
- task: entities.Task = None,
18
- resource=None,
19
- resource_type=None
20
- ):
21
- self._client_api = client_api
22
- self._org = org
23
- self._project = project
24
- self._dataset = dataset
25
- self._task = task
26
- self._resource = resource
27
- self._resource_type = resource_type
28
-
29
- ###########
30
- # methods #
31
- ###########
32
-
33
- @staticmethod
34
- def get_constructor(res: dict):
35
- constructor = entities.Setting.from_json
36
- return constructor
37
-
38
- def _build_entities_from_response(self, response_items):
39
- settings = list()
40
- for _, setting in enumerate(response_items):
41
- settings.append(
42
- self.get_constructor(setting)(
43
- client_api=self._client_api,
44
- _json=setting,
45
- project=self._project
46
- )
47
- )
48
-
49
- return settings
50
-
51
- def _build_settings(self,
52
- setting_name: str = None,
53
- setting_value: entities.SettingsTypes = None,
54
- setting_value_type: entities.SettingsValueTypes = None,
55
- setting_default_value=None
56
- ):
57
- if self._resource is None:
58
- raise exceptions.PlatformException('400', 'Must have resource')
59
- setting = entities.Setting(
60
- name=setting_name,
61
- value=setting_value,
62
- value_type=setting_value_type,
63
- section_name=entities.SettingsSectionNames.SDK,
64
- default_value=setting_default_value,
65
- scope=entities.SettingScope(type=self._resource_type,
66
- id=self._resource.id,
67
- role=entities.Role.ALL,
68
- prevent_override=False,
69
- visible=True),
70
- )
71
- return setting
72
-
73
- def create(self,
74
- setting: entities.Setting = None,
75
- setting_name: str = None,
76
- setting_value=None,
77
- setting_value_type: entities.SettingsValueTypes = None,
78
- setting_default_value=None,
79
- ) -> entities.Setting:
80
- """
81
- Create a new setting
82
-
83
- :param Setting setting: setting entity
84
- :param str setting_name: the setting name
85
- :param setting_value: the setting value
86
- :param SettingsValueTypes setting_value_type: the setting type dl.SettingsValueTypes
87
- :param setting_default_value: the setting default value
88
- :return: setting entity
89
- """
90
- if sum([1 for param in [setting_name, setting_value, setting_value_type] if param is None]) > 0 \
91
- and setting is None:
92
- raise exceptions.PlatformException('400', 'Must provide setting object or'
93
- 'setting_name, setting_value and setting_value_type')
94
-
95
- if setting is None:
96
- setting = self._build_settings(setting_name=setting_name,
97
- setting_value=setting_value,
98
- setting_value_type=setting_value_type,
99
- setting_default_value=setting_default_value)
100
-
101
- success, response = self._client_api.gen_request(
102
- req_type='post',
103
- path='{}'.format(
104
- BASE_URL
105
- ),
106
- json_req=setting.to_json()
107
- )
108
-
109
- if success:
110
- _json = response.json()
111
- constructor = self.get_constructor(_json)
112
- else:
113
- raise exceptions.PlatformException(response)
114
-
115
- return constructor(
116
- _json=_json,
117
- client_api=self._client_api,
118
- project=self._project,
119
- org=self._org
120
- )
121
-
122
- def update(self,
123
- setting: entities.BaseSetting = None,
124
- setting_id: str = None,
125
- setting_name: str = None,
126
- setting_value=None,
127
- setting_default_value=None,
128
- ) -> entities.Setting:
129
- """
130
- Update a setting
131
-
132
- :param Setting setting: setting entity
133
- :param str setting_id: the setting id
134
- :param str setting_name: the setting name
135
- :param setting_value: the setting value
136
- :param setting_default_value: the setting default value
137
- :return: setting entity
138
- """
139
- if sum([1 for param in [setting_name, setting_value] if param is None]) > 0 \
140
- and setting is None:
141
- raise exceptions.PlatformException('400', 'Must provide setting object or'
142
- 'setting_name, setting_value and setting_value_type')
143
-
144
- if setting is None:
145
- setting = self.get(setting_id=setting_id)
146
- setting.name = setting_name
147
- setting.value = setting_value
148
- if setting_default_value is not None:
149
- setting.default_value = setting_default_value
150
-
151
- patch = setting.to_json()
152
- patch.pop('id')
153
- patch.pop('name')
154
- success, response = self._client_api.gen_request(
155
- req_type='patch',
156
- path='{}/{}'.format(
157
- BASE_URL,
158
- setting.id
159
- ),
160
- json_req=patch
161
- )
162
-
163
- if success:
164
- _json = response.json()
165
- constructor = self.get_constructor(_json)
166
- else:
167
- raise exceptions.PlatformException(response)
168
-
169
- return constructor(
170
- _json=_json,
171
- client_api=self._client_api,
172
- project=self._project,
173
- org=self._org
174
- )
175
-
176
- def delete(self, setting_id: str) -> bool:
177
- """
178
- Delete a setting
179
-
180
- :param str setting_id: the setting id
181
- :return: True if success exceptions if not
182
- """
183
- success, response = self._client_api.gen_request(
184
- req_type='delete',
185
- path='{}/{}'.format(
186
- BASE_URL,
187
- setting_id
188
- )
189
- )
190
-
191
- if success:
192
- return True
193
- else:
194
- raise exceptions.PlatformException(response)
195
-
196
- def get(self, setting_name: str = None, setting_id: str = None) -> entities.Setting:
197
- """
198
- Get a setting by id
199
-
200
- :param str setting_name: the setting name
201
- :param str setting_id: the setting id
202
- :return: setting entity
203
- """
204
- if setting_id is not None:
205
- success, response = self._client_api.gen_request(
206
- req_type='get',
207
- path='{}/{}'.format(
208
- BASE_URL,
209
- setting_id
210
- )
211
- )
212
-
213
- if success:
214
- _json = response.json()
215
- constructor = self.get_constructor(_json)
216
- setting = constructor(
217
- _json=_json,
218
- client_api=self._client_api,
219
- project=self._project,
220
- org=self._org
221
- )
222
- else:
223
- raise exceptions.PlatformException(response)
224
- elif setting_name is not None:
225
- if not isinstance(setting_name, str):
226
- raise exceptions.PlatformException(
227
- error='400',
228
- message='setting_name must be strings')
229
- settings = self.list(
230
- filters=entities.Filters(field='name', values=setting_name, resource=entities.FiltersResource.SETTINGS))
231
- if len(settings.items) > 1:
232
- raise exceptions.PlatformException(
233
- error='404',
234
- message='More than one setting with same name. Please "get" by id')
235
- elif len(settings.items) == 0:
236
- raise exceptions.PlatformException('404', 'setting not found')
237
- else:
238
- setting = settings.items[0]
239
- else:
240
- raise exceptions.PlatformException(
241
- error='400',
242
- message='Must provide at least ONE of the following params: setting_id, setting_name.')
243
- return setting
244
-
245
- def _list(self, filters: entities.Filters):
246
- success, response = self._client_api.gen_request(
247
- req_type='post',
248
- path='{}/query'.format(BASE_URL),
249
- json_req=filters.prepare()
250
- )
251
- if not success:
252
- raise exceptions.PlatformException(response)
253
- return response.json()
254
-
255
- def list(self, filters: entities.Filters = None) -> entities.PagedEntities:
256
- """
257
- List settings
258
-
259
- :param dtlpy.entities.filters.Filters filters: Filters entity or a dictionary containing filters parameters
260
- :return: Paged entity
261
- :rtype: dtlpy.entities.paged_entities.PagedEntities
262
- """
263
- if filters is None:
264
- filters = entities.Filters(resource=entities.FiltersResource.SETTINGS)
265
- filters.sort_by(entities.FiltersOrderByDirection.ASCENDING)
266
-
267
- if filters.resource != entities.FiltersResource.SETTINGS:
268
- raise exceptions.PlatformException(
269
- error='400',
270
- message='Filters resource must to be FiltersResource.SETTINGS . Got: {!r}'.format(filters.resource))
271
-
272
- if self._project is not None:
273
- filters.add(field='scope.id', values=self._project.id)
274
-
275
- paged = entities.PagedEntities(
276
- items_repository=self,
277
- filters=filters,
278
- page_offset=filters.page,
279
- page_size=filters.page_size,
280
- project_id=self._project.id if self._project is not None else None,
281
- client_api=self._client_api
282
- )
283
-
284
- paged.get_page()
285
-
286
- return paged
287
-
288
- def resolve(
289
- self,
290
- user_email: str,
291
- org_id: str = None,
292
- project_id: str = None,
293
- dataset_id: str = None,
294
- task_id: str = None,
295
- ):
296
- """
297
- return all the settings that relevant to the provider params
298
-
299
- :param str user_email: user email
300
- :param str org_id: org id
301
- :param str project_id: project id
302
- :param str dataset_id: dataset id
303
- :param str task_id: task id
304
- """
305
- payload = {
306
- 'userId': user_email
307
- }
308
-
309
- if self._project:
310
- payload['projectId'] = self._project.id
311
- elif project_id:
312
- payload['projectId'] = project_id
313
-
314
- if self._org:
315
- payload['orgId'] = self._org.id
316
- elif org_id:
317
- payload['orgId'] = org_id
318
-
319
- if self._dataset:
320
- payload['datasetId'] = self._dataset.id
321
- elif dataset_id:
322
- payload['datasetId'] = dataset_id
323
-
324
- if self._task:
325
- payload['taskId'] = self._task.id
326
- elif task_id:
327
- payload['taskId'] = task_id
328
-
329
- success, response = self._client_api.gen_request(
330
- req_type='post',
331
- path='{}/resolve'.format(BASE_URL),
332
- json_req=payload
333
- )
334
-
335
- if success:
336
- _json = response.json()
337
- return self._build_entities_from_response(response_items=_json)
338
- else:
339
- raise exceptions.PlatformException(response)
1
+ import logging
2
+ from typing import Union
3
+
4
+ from .. import exceptions, entities, ApiClient
5
+
6
+ logger = logging.getLogger(name='dtlpy')
7
+ BASE_URL = '/settings'
8
+
9
+
10
+ class Settings:
11
+ def __init__(
12
+ self,
13
+ client_api: ApiClient,
14
+ project: entities.Project = None,
15
+ dataset: entities.Dataset = None,
16
+ org: entities.Organization = None,
17
+ task: entities.Task = None,
18
+ resource=None,
19
+ resource_type=None
20
+ ):
21
+ self._client_api = client_api
22
+ self._org = org
23
+ self._project = project
24
+ self._dataset = dataset
25
+ self._task = task
26
+ self._resource = resource
27
+ self._resource_type = resource_type
28
+
29
+ ###########
30
+ # methods #
31
+ ###########
32
+
33
+ @staticmethod
34
+ def get_constructor(res: dict):
35
+ constructor = entities.Setting.from_json
36
+ return constructor
37
+
38
+ def _build_entities_from_response(self, response_items):
39
+ settings = list()
40
+ for _, setting in enumerate(response_items):
41
+ settings.append(
42
+ self.get_constructor(setting)(
43
+ client_api=self._client_api,
44
+ _json=setting,
45
+ project=self._project
46
+ )
47
+ )
48
+
49
+ return settings
50
+
51
+ def _build_settings(self,
52
+ setting_name: str = None,
53
+ setting_value: entities.SettingsTypes = None,
54
+ setting_value_type: entities.SettingsValueTypes = None,
55
+ setting_default_value=None
56
+ ):
57
+ if self._resource is None:
58
+ raise exceptions.PlatformException('400', 'Must have resource')
59
+ setting = entities.Setting(
60
+ name=setting_name,
61
+ value=setting_value,
62
+ value_type=setting_value_type,
63
+ section_name=entities.SettingsSectionNames.SDK,
64
+ default_value=setting_default_value,
65
+ scope=entities.SettingScope(type=self._resource_type,
66
+ id=self._resource.id,
67
+ role=entities.Role.ALL,
68
+ prevent_override=False,
69
+ visible=True),
70
+ )
71
+ return setting
72
+
73
+ def create(self,
74
+ setting: entities.Setting = None,
75
+ setting_name: str = None,
76
+ setting_value=None,
77
+ setting_value_type: entities.SettingsValueTypes = None,
78
+ setting_default_value=None,
79
+ ) -> entities.Setting:
80
+ """
81
+ Create a new setting
82
+
83
+ :param Setting setting: setting entity
84
+ :param str setting_name: the setting name
85
+ :param setting_value: the setting value
86
+ :param SettingsValueTypes setting_value_type: the setting type dl.SettingsValueTypes
87
+ :param setting_default_value: the setting default value
88
+ :return: setting entity
89
+ """
90
+ if sum([1 for param in [setting_name, setting_value, setting_value_type] if param is None]) > 0 \
91
+ and setting is None:
92
+ raise exceptions.PlatformException('400', 'Must provide setting object or'
93
+ 'setting_name, setting_value and setting_value_type')
94
+
95
+ if setting is None:
96
+ setting = self._build_settings(setting_name=setting_name,
97
+ setting_value=setting_value,
98
+ setting_value_type=setting_value_type,
99
+ setting_default_value=setting_default_value)
100
+
101
+ success, response = self._client_api.gen_request(
102
+ req_type='post',
103
+ path='{}'.format(
104
+ BASE_URL
105
+ ),
106
+ json_req=setting.to_json()
107
+ )
108
+
109
+ if success:
110
+ _json = response.json()
111
+ constructor = self.get_constructor(_json)
112
+ else:
113
+ raise exceptions.PlatformException(response)
114
+
115
+ return constructor(
116
+ _json=_json,
117
+ client_api=self._client_api,
118
+ project=self._project,
119
+ org=self._org
120
+ )
121
+
122
+ def update(self,
123
+ setting: entities.BaseSetting = None,
124
+ setting_id: str = None,
125
+ setting_name: str = None,
126
+ setting_value=None,
127
+ setting_default_value=None,
128
+ ) -> entities.Setting:
129
+ """
130
+ Update a setting
131
+
132
+ :param Setting setting: setting entity
133
+ :param str setting_id: the setting id
134
+ :param str setting_name: the setting name
135
+ :param setting_value: the setting value
136
+ :param setting_default_value: the setting default value
137
+ :return: setting entity
138
+ """
139
+ if sum([1 for param in [setting_name, setting_value] if param is None]) > 0 \
140
+ and setting is None:
141
+ raise exceptions.PlatformException('400', 'Must provide setting object or'
142
+ 'setting_name, setting_value and setting_value_type')
143
+
144
+ if setting is None:
145
+ setting = self.get(setting_id=setting_id)
146
+ setting.name = setting_name
147
+ setting.value = setting_value
148
+ if setting_default_value is not None:
149
+ setting.default_value = setting_default_value
150
+
151
+ patch = setting.to_json()
152
+ patch.pop('id')
153
+ patch.pop('name')
154
+ success, response = self._client_api.gen_request(
155
+ req_type='patch',
156
+ path='{}/{}'.format(
157
+ BASE_URL,
158
+ setting.id
159
+ ),
160
+ json_req=patch
161
+ )
162
+
163
+ if success:
164
+ _json = response.json()
165
+ constructor = self.get_constructor(_json)
166
+ else:
167
+ raise exceptions.PlatformException(response)
168
+
169
+ return constructor(
170
+ _json=_json,
171
+ client_api=self._client_api,
172
+ project=self._project,
173
+ org=self._org
174
+ )
175
+
176
+ def delete(self, setting_id: str) -> bool:
177
+ """
178
+ Delete a setting
179
+
180
+ :param str setting_id: the setting id
181
+ :return: True if success exceptions if not
182
+ """
183
+ success, response = self._client_api.gen_request(
184
+ req_type='delete',
185
+ path='{}/{}'.format(
186
+ BASE_URL,
187
+ setting_id
188
+ )
189
+ )
190
+
191
+ if success:
192
+ return True
193
+ else:
194
+ raise exceptions.PlatformException(response)
195
+
196
+ def get(self, setting_name: str = None, setting_id: str = None) -> entities.Setting:
197
+ """
198
+ Get a setting by id
199
+
200
+ :param str setting_name: the setting name
201
+ :param str setting_id: the setting id
202
+ :return: setting entity
203
+ """
204
+ if setting_id is not None:
205
+ success, response = self._client_api.gen_request(
206
+ req_type='get',
207
+ path='{}/{}'.format(
208
+ BASE_URL,
209
+ setting_id
210
+ )
211
+ )
212
+
213
+ if success:
214
+ _json = response.json()
215
+ constructor = self.get_constructor(_json)
216
+ setting = constructor(
217
+ _json=_json,
218
+ client_api=self._client_api,
219
+ project=self._project,
220
+ org=self._org
221
+ )
222
+ else:
223
+ raise exceptions.PlatformException(response)
224
+ elif setting_name is not None:
225
+ if not isinstance(setting_name, str):
226
+ raise exceptions.PlatformException(
227
+ error='400',
228
+ message='setting_name must be strings')
229
+ settings = self.list(
230
+ filters=entities.Filters(field='name', values=setting_name, resource=entities.FiltersResource.SETTINGS))
231
+ if len(settings.items) > 1:
232
+ raise exceptions.PlatformException(
233
+ error='404',
234
+ message='More than one setting with same name. Please "get" by id')
235
+ elif len(settings.items) == 0:
236
+ raise exceptions.PlatformException('404', 'setting not found')
237
+ else:
238
+ setting = settings.items[0]
239
+ else:
240
+ raise exceptions.PlatformException(
241
+ error='400',
242
+ message='Must provide at least ONE of the following params: setting_id, setting_name.')
243
+ return setting
244
+
245
+ def _list(self, filters: entities.Filters):
246
+ success, response = self._client_api.gen_request(
247
+ req_type='post',
248
+ path='{}/query'.format(BASE_URL),
249
+ json_req=filters.prepare()
250
+ )
251
+ if not success:
252
+ raise exceptions.PlatformException(response)
253
+ return response.json()
254
+
255
+ def list(self, filters: entities.Filters = None) -> entities.PagedEntities:
256
+ """
257
+ List settings
258
+
259
+ :param dtlpy.entities.filters.Filters filters: Filters entity or a dictionary containing filters parameters
260
+ :return: Paged entity
261
+ :rtype: dtlpy.entities.paged_entities.PagedEntities
262
+ """
263
+ if filters is None:
264
+ filters = entities.Filters(resource=entities.FiltersResource.SETTINGS)
265
+ filters.sort_by(entities.FiltersOrderByDirection.ASCENDING)
266
+
267
+ if filters.resource != entities.FiltersResource.SETTINGS:
268
+ raise exceptions.PlatformException(
269
+ error='400',
270
+ message='Filters resource must to be FiltersResource.SETTINGS . Got: {!r}'.format(filters.resource))
271
+
272
+ if self._project is not None:
273
+ filters.add(field='scope.id', values=self._project.id)
274
+
275
+ paged = entities.PagedEntities(
276
+ items_repository=self,
277
+ filters=filters,
278
+ page_offset=filters.page,
279
+ page_size=filters.page_size,
280
+ project_id=self._project.id if self._project is not None else None,
281
+ client_api=self._client_api
282
+ )
283
+
284
+ paged.get_page()
285
+
286
+ return paged
287
+
288
+ def resolve(
289
+ self,
290
+ user_email: str,
291
+ org_id: str = None,
292
+ project_id: str = None,
293
+ dataset_id: str = None,
294
+ task_id: str = None,
295
+ ):
296
+ """
297
+ return all the settings that relevant to the provider params
298
+
299
+ :param str user_email: user email
300
+ :param str org_id: org id
301
+ :param str project_id: project id
302
+ :param str dataset_id: dataset id
303
+ :param str task_id: task id
304
+ """
305
+ payload = {
306
+ 'userId': user_email
307
+ }
308
+
309
+ if self._project:
310
+ payload['projectId'] = self._project.id
311
+ elif project_id:
312
+ payload['projectId'] = project_id
313
+
314
+ if self._org:
315
+ payload['orgId'] = self._org.id
316
+ elif org_id:
317
+ payload['orgId'] = org_id
318
+
319
+ if self._dataset:
320
+ payload['datasetId'] = self._dataset.id
321
+ elif dataset_id:
322
+ payload['datasetId'] = dataset_id
323
+
324
+ if self._task:
325
+ payload['taskId'] = self._task.id
326
+ elif task_id:
327
+ payload['taskId'] = task_id
328
+
329
+ success, response = self._client_api.gen_request(
330
+ req_type='post',
331
+ path='{}/resolve'.format(BASE_URL),
332
+ json_req=payload
333
+ )
334
+
335
+ if success:
336
+ _json = response.json()
337
+ return self._build_entities_from_response(response_items=_json)
338
+ else:
339
+ raise exceptions.PlatformException(response)