dtlpy 1.115.44__py3-none-any.whl → 1.117.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dtlpy/__init__.py +491 -491
- dtlpy/__version__.py +1 -1
- dtlpy/assets/__init__.py +26 -26
- dtlpy/assets/code_server/config.yaml +2 -2
- dtlpy/assets/code_server/installation.sh +24 -24
- dtlpy/assets/code_server/launch.json +13 -13
- dtlpy/assets/code_server/settings.json +2 -2
- dtlpy/assets/main.py +53 -53
- dtlpy/assets/main_partial.py +18 -18
- dtlpy/assets/mock.json +11 -11
- dtlpy/assets/model_adapter.py +83 -83
- dtlpy/assets/package.json +61 -61
- dtlpy/assets/package_catalog.json +29 -29
- dtlpy/assets/package_gitignore +307 -307
- dtlpy/assets/service_runners/__init__.py +33 -33
- dtlpy/assets/service_runners/converter.py +96 -96
- dtlpy/assets/service_runners/multi_method.py +49 -49
- dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
- dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
- dtlpy/assets/service_runners/multi_method_item.py +52 -52
- dtlpy/assets/service_runners/multi_method_json.py +52 -52
- dtlpy/assets/service_runners/single_method.py +37 -37
- dtlpy/assets/service_runners/single_method_annotation.py +43 -43
- dtlpy/assets/service_runners/single_method_dataset.py +43 -43
- dtlpy/assets/service_runners/single_method_item.py +41 -41
- dtlpy/assets/service_runners/single_method_json.py +42 -42
- dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
- dtlpy/assets/voc_annotation_template.xml +23 -23
- dtlpy/caches/base_cache.py +32 -32
- dtlpy/caches/cache.py +473 -473
- dtlpy/caches/dl_cache.py +201 -201
- dtlpy/caches/filesystem_cache.py +89 -89
- dtlpy/caches/redis_cache.py +84 -84
- dtlpy/dlp/__init__.py +20 -20
- dtlpy/dlp/cli_utilities.py +367 -367
- dtlpy/dlp/command_executor.py +764 -764
- dtlpy/dlp/dlp +1 -1
- dtlpy/dlp/dlp.bat +1 -1
- dtlpy/dlp/dlp.py +128 -128
- dtlpy/dlp/parser.py +651 -651
- dtlpy/entities/__init__.py +83 -83
- dtlpy/entities/analytic.py +347 -347
- dtlpy/entities/annotation.py +1879 -1879
- dtlpy/entities/annotation_collection.py +699 -699
- dtlpy/entities/annotation_definitions/__init__.py +20 -20
- dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
- dtlpy/entities/annotation_definitions/box.py +195 -195
- dtlpy/entities/annotation_definitions/classification.py +67 -67
- dtlpy/entities/annotation_definitions/comparison.py +72 -72
- dtlpy/entities/annotation_definitions/cube.py +204 -204
- dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
- dtlpy/entities/annotation_definitions/description.py +32 -32
- dtlpy/entities/annotation_definitions/ellipse.py +124 -124
- dtlpy/entities/annotation_definitions/free_text.py +62 -62
- dtlpy/entities/annotation_definitions/gis.py +69 -69
- dtlpy/entities/annotation_definitions/note.py +139 -139
- dtlpy/entities/annotation_definitions/point.py +117 -117
- dtlpy/entities/annotation_definitions/polygon.py +182 -182
- dtlpy/entities/annotation_definitions/polyline.py +111 -111
- dtlpy/entities/annotation_definitions/pose.py +92 -92
- dtlpy/entities/annotation_definitions/ref_image.py +86 -86
- dtlpy/entities/annotation_definitions/segmentation.py +240 -240
- dtlpy/entities/annotation_definitions/subtitle.py +34 -34
- dtlpy/entities/annotation_definitions/text.py +85 -85
- dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
- dtlpy/entities/app.py +220 -220
- dtlpy/entities/app_module.py +107 -107
- dtlpy/entities/artifact.py +174 -174
- dtlpy/entities/assignment.py +399 -399
- dtlpy/entities/base_entity.py +214 -214
- dtlpy/entities/bot.py +113 -113
- dtlpy/entities/codebase.py +292 -292
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +449 -449
- dtlpy/entities/dataset.py +1299 -1299
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +235 -235
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +152 -145
- dtlpy/entities/filters.py +798 -798
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +975 -959
- dtlpy/entities/label.py +123 -123
- dtlpy/entities/links.py +85 -85
- dtlpy/entities/message.py +175 -175
- dtlpy/entities/model.py +684 -684
- dtlpy/entities/node.py +1005 -1005
- dtlpy/entities/ontology.py +810 -803
- dtlpy/entities/organization.py +287 -287
- dtlpy/entities/package.py +657 -657
- dtlpy/entities/package_defaults.py +5 -5
- dtlpy/entities/package_function.py +185 -185
- dtlpy/entities/package_module.py +113 -113
- dtlpy/entities/package_slot.py +118 -118
- dtlpy/entities/paged_entities.py +299 -299
- dtlpy/entities/pipeline.py +624 -624
- dtlpy/entities/pipeline_execution.py +279 -279
- dtlpy/entities/project.py +394 -394
- dtlpy/entities/prompt_item.py +505 -505
- dtlpy/entities/recipe.py +301 -301
- dtlpy/entities/reflect_dict.py +102 -102
- dtlpy/entities/resource_execution.py +138 -138
- dtlpy/entities/service.py +974 -963
- dtlpy/entities/service_driver.py +117 -117
- dtlpy/entities/setting.py +294 -294
- dtlpy/entities/task.py +495 -495
- dtlpy/entities/time_series.py +143 -143
- dtlpy/entities/trigger.py +426 -426
- dtlpy/entities/user.py +118 -118
- dtlpy/entities/webhook.py +124 -124
- dtlpy/examples/__init__.py +19 -19
- dtlpy/examples/add_labels.py +135 -135
- dtlpy/examples/add_metadata_to_item.py +21 -21
- dtlpy/examples/annotate_items_using_model.py +65 -65
- dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
- dtlpy/examples/annotations_convert_to_voc.py +9 -9
- dtlpy/examples/annotations_convert_to_yolo.py +9 -9
- dtlpy/examples/convert_annotation_types.py +51 -51
- dtlpy/examples/converter.py +143 -143
- dtlpy/examples/copy_annotations.py +22 -22
- dtlpy/examples/copy_folder.py +31 -31
- dtlpy/examples/create_annotations.py +51 -51
- dtlpy/examples/create_video_annotations.py +83 -83
- dtlpy/examples/delete_annotations.py +26 -26
- dtlpy/examples/filters.py +113 -113
- dtlpy/examples/move_item.py +23 -23
- dtlpy/examples/play_video_annotation.py +13 -13
- dtlpy/examples/show_item_and_mask.py +53 -53
- dtlpy/examples/triggers.py +49 -49
- dtlpy/examples/upload_batch_of_items.py +20 -20
- dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
- dtlpy/examples/upload_items_with_modalities.py +43 -43
- dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
- dtlpy/examples/upload_yolo_format_annotations.py +70 -70
- dtlpy/exceptions.py +125 -125
- dtlpy/miscellaneous/__init__.py +20 -20
- dtlpy/miscellaneous/dict_differ.py +95 -95
- dtlpy/miscellaneous/git_utils.py +217 -217
- dtlpy/miscellaneous/json_utils.py +14 -14
- dtlpy/miscellaneous/list_print.py +105 -105
- dtlpy/miscellaneous/zipping.py +130 -130
- dtlpy/ml/__init__.py +20 -20
- dtlpy/ml/base_feature_extractor_adapter.py +27 -27
- dtlpy/ml/base_model_adapter.py +1287 -1230
- dtlpy/ml/metrics.py +461 -461
- dtlpy/ml/predictions_utils.py +274 -274
- dtlpy/ml/summary_writer.py +57 -57
- dtlpy/ml/train_utils.py +60 -60
- dtlpy/new_instance.py +252 -252
- dtlpy/repositories/__init__.py +56 -56
- dtlpy/repositories/analytics.py +85 -85
- dtlpy/repositories/annotations.py +916 -916
- dtlpy/repositories/apps.py +383 -383
- dtlpy/repositories/artifacts.py +452 -452
- dtlpy/repositories/assignments.py +599 -599
- dtlpy/repositories/bots.py +213 -213
- dtlpy/repositories/codebases.py +559 -559
- dtlpy/repositories/collections.py +332 -332
- dtlpy/repositories/commands.py +152 -152
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +439 -439
- dtlpy/repositories/datasets.py +1585 -1504
- dtlpy/repositories/downloader.py +1157 -923
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +482 -482
- dtlpy/repositories/executions.py +815 -815
- dtlpy/repositories/feature_sets.py +256 -226
- dtlpy/repositories/features.py +255 -255
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +912 -912
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +1000 -1000
- dtlpy/repositories/nodes.py +80 -80
- dtlpy/repositories/ontologies.py +511 -511
- dtlpy/repositories/organizations.py +525 -525
- dtlpy/repositories/packages.py +1941 -1941
- dtlpy/repositories/pipeline_executions.py +451 -451
- dtlpy/repositories/pipelines.py +640 -640
- dtlpy/repositories/projects.py +539 -539
- dtlpy/repositories/recipes.py +429 -399
- dtlpy/repositories/resource_executions.py +137 -137
- dtlpy/repositories/schema.py +120 -120
- dtlpy/repositories/service_drivers.py +213 -213
- dtlpy/repositories/services.py +1704 -1704
- dtlpy/repositories/settings.py +339 -339
- dtlpy/repositories/tasks.py +1477 -1477
- dtlpy/repositories/times_series.py +278 -278
- dtlpy/repositories/triggers.py +536 -536
- dtlpy/repositories/upload_element.py +257 -257
- dtlpy/repositories/uploader.py +661 -661
- dtlpy/repositories/webhooks.py +249 -249
- dtlpy/services/__init__.py +22 -22
- dtlpy/services/aihttp_retry.py +131 -131
- dtlpy/services/api_client.py +1786 -1785
- dtlpy/services/api_reference.py +40 -40
- dtlpy/services/async_utils.py +133 -133
- dtlpy/services/calls_counter.py +44 -44
- dtlpy/services/check_sdk.py +68 -68
- dtlpy/services/cookie.py +115 -115
- dtlpy/services/create_logger.py +156 -156
- dtlpy/services/events.py +84 -84
- dtlpy/services/logins.py +235 -235
- dtlpy/services/reporter.py +256 -256
- dtlpy/services/service_defaults.py +91 -91
- dtlpy/utilities/__init__.py +20 -20
- dtlpy/utilities/annotations/__init__.py +16 -16
- dtlpy/utilities/annotations/annotation_converters.py +269 -269
- dtlpy/utilities/base_package_runner.py +285 -264
- dtlpy/utilities/converter.py +1650 -1650
- dtlpy/utilities/dataset_generators/__init__.py +1 -1
- dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
- dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
- dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
- dtlpy/utilities/local_development/__init__.py +1 -1
- dtlpy/utilities/local_development/local_session.py +179 -179
- dtlpy/utilities/reports/__init__.py +2 -2
- dtlpy/utilities/reports/figures.py +343 -343
- dtlpy/utilities/reports/report.py +71 -71
- dtlpy/utilities/videos/__init__.py +17 -17
- dtlpy/utilities/videos/video_player.py +598 -598
- dtlpy/utilities/videos/videos.py +470 -470
- {dtlpy-1.115.44.data → dtlpy-1.117.6.data}/scripts/dlp +1 -1
- dtlpy-1.117.6.data/scripts/dlp.bat +2 -0
- {dtlpy-1.115.44.data → dtlpy-1.117.6.data}/scripts/dlp.py +128 -128
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/METADATA +186 -186
- dtlpy-1.117.6.dist-info/RECORD +239 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/WHEEL +1 -1
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/licenses/LICENSE +200 -200
- tests/features/environment.py +551 -551
- dtlpy/assets/__pycache__/__init__.cpython-310.pyc +0 -0
- dtlpy-1.115.44.data/scripts/dlp.bat +0 -2
- dtlpy-1.115.44.dist-info/RECORD +0 -240
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.117.6.dist-info}/top_level.txt +0 -0
dtlpy/entities/label.py
CHANGED
|
@@ -1,123 +1,123 @@
|
|
|
1
|
-
import attr
|
|
2
|
-
import logging
|
|
3
|
-
import random
|
|
4
|
-
|
|
5
|
-
from .. import PlatformException
|
|
6
|
-
|
|
7
|
-
logger = logging.getLogger(name='dtlpy')
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
@attr.s
|
|
11
|
-
class Label:
|
|
12
|
-
tag = attr.ib()
|
|
13
|
-
display_data = attr.ib()
|
|
14
|
-
color = attr.ib(default=None)
|
|
15
|
-
display_label = attr.ib(default=None)
|
|
16
|
-
attributes = attr.ib()
|
|
17
|
-
children = attr.ib()
|
|
18
|
-
|
|
19
|
-
@attributes.default
|
|
20
|
-
def set_attributes(self):
|
|
21
|
-
attributes = list()
|
|
22
|
-
return attributes
|
|
23
|
-
|
|
24
|
-
@children.default
|
|
25
|
-
def set_children(self):
|
|
26
|
-
children = list()
|
|
27
|
-
return children
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
@display_data.default
|
|
31
|
-
def set_display_data(self):
|
|
32
|
-
display_data = dict()
|
|
33
|
-
return display_data
|
|
34
|
-
|
|
35
|
-
@classmethod
|
|
36
|
-
def from_root(cls, root):
|
|
37
|
-
"""
|
|
38
|
-
Build a Label entity object from a json
|
|
39
|
-
|
|
40
|
-
:param dict root: _json representation of a label as it is in host
|
|
41
|
-
:return: Label object
|
|
42
|
-
"""
|
|
43
|
-
children = list()
|
|
44
|
-
if 'children' in root and root['children'] is not None:
|
|
45
|
-
children = [Label.from_root(child) for child in root['children']]
|
|
46
|
-
|
|
47
|
-
root = root.get("value", root)
|
|
48
|
-
if "tag" in root:
|
|
49
|
-
label_name = root["tag"]
|
|
50
|
-
elif "label_name" in root:
|
|
51
|
-
label_name = root["label_name"]
|
|
52
|
-
else:
|
|
53
|
-
raise PlatformException("400", "Invalid input - each label must have a tag")
|
|
54
|
-
|
|
55
|
-
display_label = root.get("displayLabel", None)
|
|
56
|
-
if display_label is None:
|
|
57
|
-
display_label = root.get("display_label", None)
|
|
58
|
-
|
|
59
|
-
display_data = root.get("displayData", dict())
|
|
60
|
-
return cls(
|
|
61
|
-
tag=label_name,
|
|
62
|
-
display_data=display_data,
|
|
63
|
-
color=root.get("color", None),
|
|
64
|
-
display_label=display_label,
|
|
65
|
-
attributes=root.get("attributes", None),
|
|
66
|
-
children=children
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
def to_root(self):
|
|
70
|
-
"""
|
|
71
|
-
Returns platform _json format of object
|
|
72
|
-
|
|
73
|
-
:return: platform json format of object
|
|
74
|
-
"""
|
|
75
|
-
value = attr.asdict(self, filter=attr.filters.exclude(attr.fields(Label).children,
|
|
76
|
-
attr.fields(Label).color,
|
|
77
|
-
attr.fields(Label).display_label,
|
|
78
|
-
attr.fields(Label).display_data))
|
|
79
|
-
value['displayLabel'] = self.display_label
|
|
80
|
-
value['displayData'] = self.display_data
|
|
81
|
-
if self.color:
|
|
82
|
-
value['color'] = self.hex
|
|
83
|
-
children = [child.to_root() for child in self.children]
|
|
84
|
-
_json = {
|
|
85
|
-
'value': value,
|
|
86
|
-
'children': children
|
|
87
|
-
}
|
|
88
|
-
return _json
|
|
89
|
-
|
|
90
|
-
@property
|
|
91
|
-
def rgb(self):
|
|
92
|
-
"""
|
|
93
|
-
Return label's color in RBG format
|
|
94
|
-
|
|
95
|
-
:return: label's color in RBG format
|
|
96
|
-
"""
|
|
97
|
-
if self.color is None:
|
|
98
|
-
color = None
|
|
99
|
-
elif isinstance(self.color, str) and self.color.startswith('rgb'):
|
|
100
|
-
color = tuple(eval(self.color.lstrip('rgb')))
|
|
101
|
-
elif isinstance(self.color, str) and self.color.startswith('#'):
|
|
102
|
-
color = tuple(int(self.color.lstrip('#')[i:i + 2], 16) for i in (0, 2, 4))
|
|
103
|
-
elif isinstance(self.color, tuple) or isinstance(self.color, list):
|
|
104
|
-
color = self.color
|
|
105
|
-
else:
|
|
106
|
-
logger.warning('Unknown color scheme: {}'.format(self.color))
|
|
107
|
-
color = (255, 0, 0)
|
|
108
|
-
return color
|
|
109
|
-
|
|
110
|
-
@property
|
|
111
|
-
def hex(self):
|
|
112
|
-
"""
|
|
113
|
-
Return label's color in HEX format
|
|
114
|
-
|
|
115
|
-
:return: label's color in HEX format
|
|
116
|
-
"""
|
|
117
|
-
if isinstance(self.color, tuple) or isinstance(self.color, list):
|
|
118
|
-
return '#%02x%02x%02x' % self.color
|
|
119
|
-
elif self.color.startswith('rgb'):
|
|
120
|
-
rgb = tuple(eval(self.color.lstrip('rgb')))
|
|
121
|
-
return '#%02x%02x%02x' % rgb
|
|
122
|
-
elif self.color.startswith('#'):
|
|
123
|
-
return self.color
|
|
1
|
+
import attr
|
|
2
|
+
import logging
|
|
3
|
+
import random
|
|
4
|
+
|
|
5
|
+
from .. import PlatformException
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(name='dtlpy')
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@attr.s
|
|
11
|
+
class Label:
|
|
12
|
+
tag = attr.ib()
|
|
13
|
+
display_data = attr.ib()
|
|
14
|
+
color = attr.ib(default=None)
|
|
15
|
+
display_label = attr.ib(default=None)
|
|
16
|
+
attributes = attr.ib()
|
|
17
|
+
children = attr.ib()
|
|
18
|
+
|
|
19
|
+
@attributes.default
|
|
20
|
+
def set_attributes(self):
|
|
21
|
+
attributes = list()
|
|
22
|
+
return attributes
|
|
23
|
+
|
|
24
|
+
@children.default
|
|
25
|
+
def set_children(self):
|
|
26
|
+
children = list()
|
|
27
|
+
return children
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@display_data.default
|
|
31
|
+
def set_display_data(self):
|
|
32
|
+
display_data = dict()
|
|
33
|
+
return display_data
|
|
34
|
+
|
|
35
|
+
@classmethod
|
|
36
|
+
def from_root(cls, root):
|
|
37
|
+
"""
|
|
38
|
+
Build a Label entity object from a json
|
|
39
|
+
|
|
40
|
+
:param dict root: _json representation of a label as it is in host
|
|
41
|
+
:return: Label object
|
|
42
|
+
"""
|
|
43
|
+
children = list()
|
|
44
|
+
if 'children' in root and root['children'] is not None:
|
|
45
|
+
children = [Label.from_root(child) for child in root['children']]
|
|
46
|
+
|
|
47
|
+
root = root.get("value", root)
|
|
48
|
+
if "tag" in root:
|
|
49
|
+
label_name = root["tag"]
|
|
50
|
+
elif "label_name" in root:
|
|
51
|
+
label_name = root["label_name"]
|
|
52
|
+
else:
|
|
53
|
+
raise PlatformException("400", "Invalid input - each label must have a tag")
|
|
54
|
+
|
|
55
|
+
display_label = root.get("displayLabel", None)
|
|
56
|
+
if display_label is None:
|
|
57
|
+
display_label = root.get("display_label", None)
|
|
58
|
+
|
|
59
|
+
display_data = root.get("displayData", dict())
|
|
60
|
+
return cls(
|
|
61
|
+
tag=label_name,
|
|
62
|
+
display_data=display_data,
|
|
63
|
+
color=root.get("color", None),
|
|
64
|
+
display_label=display_label,
|
|
65
|
+
attributes=root.get("attributes", None),
|
|
66
|
+
children=children
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def to_root(self):
|
|
70
|
+
"""
|
|
71
|
+
Returns platform _json format of object
|
|
72
|
+
|
|
73
|
+
:return: platform json format of object
|
|
74
|
+
"""
|
|
75
|
+
value = attr.asdict(self, filter=attr.filters.exclude(attr.fields(Label).children,
|
|
76
|
+
attr.fields(Label).color,
|
|
77
|
+
attr.fields(Label).display_label,
|
|
78
|
+
attr.fields(Label).display_data))
|
|
79
|
+
value['displayLabel'] = self.display_label
|
|
80
|
+
value['displayData'] = self.display_data
|
|
81
|
+
if self.color:
|
|
82
|
+
value['color'] = self.hex
|
|
83
|
+
children = [child.to_root() for child in self.children]
|
|
84
|
+
_json = {
|
|
85
|
+
'value': value,
|
|
86
|
+
'children': children
|
|
87
|
+
}
|
|
88
|
+
return _json
|
|
89
|
+
|
|
90
|
+
@property
|
|
91
|
+
def rgb(self):
|
|
92
|
+
"""
|
|
93
|
+
Return label's color in RBG format
|
|
94
|
+
|
|
95
|
+
:return: label's color in RBG format
|
|
96
|
+
"""
|
|
97
|
+
if self.color is None:
|
|
98
|
+
color = None
|
|
99
|
+
elif isinstance(self.color, str) and self.color.startswith('rgb'):
|
|
100
|
+
color = tuple(eval(self.color.lstrip('rgb')))
|
|
101
|
+
elif isinstance(self.color, str) and self.color.startswith('#'):
|
|
102
|
+
color = tuple(int(self.color.lstrip('#')[i:i + 2], 16) for i in (0, 2, 4))
|
|
103
|
+
elif isinstance(self.color, tuple) or isinstance(self.color, list):
|
|
104
|
+
color = self.color
|
|
105
|
+
else:
|
|
106
|
+
logger.warning('Unknown color scheme: {}'.format(self.color))
|
|
107
|
+
color = (255, 0, 0)
|
|
108
|
+
return color
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def hex(self):
|
|
112
|
+
"""
|
|
113
|
+
Return label's color in HEX format
|
|
114
|
+
|
|
115
|
+
:return: label's color in HEX format
|
|
116
|
+
"""
|
|
117
|
+
if isinstance(self.color, tuple) or isinstance(self.color, list):
|
|
118
|
+
return '#%02x%02x%02x' % self.color
|
|
119
|
+
elif self.color.startswith('rgb'):
|
|
120
|
+
rgb = tuple(eval(self.color.lstrip('rgb')))
|
|
121
|
+
return '#%02x%02x%02x' % rgb
|
|
122
|
+
elif self.color.startswith('#'):
|
|
123
|
+
return self.color
|
dtlpy/entities/links.py
CHANGED
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
from .. import entities
|
|
2
|
-
from .. import PlatformException
|
|
3
|
-
from enum import Enum
|
|
4
|
-
import os
|
|
5
|
-
import mimetypes
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class LinkTypeEnum(str, Enum):
|
|
9
|
-
"""
|
|
10
|
-
State enum
|
|
11
|
-
"""
|
|
12
|
-
ID = "id"
|
|
13
|
-
URL = "url"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class Link:
|
|
17
|
-
|
|
18
|
-
# noinspection PyShadowingBuiltins
|
|
19
|
-
def __init__(self, name, type: LinkTypeEnum, ref, mimetype=None, dataset_id=None):
|
|
20
|
-
self.type = type
|
|
21
|
-
self.ref = ref
|
|
22
|
-
self.name = name
|
|
23
|
-
self.dataset_id = dataset_id
|
|
24
|
-
self.mimetype = mimetype
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class UrlLink(Link):
|
|
28
|
-
|
|
29
|
-
def __init__(self, ref, mimetype=None, name=None):
|
|
30
|
-
if name is None:
|
|
31
|
-
name = os.path.split(ref)[-1].replace('/', "").replace("\\", '').replace('.', '')
|
|
32
|
-
name = name.split('?')[0]
|
|
33
|
-
# noinspection PyShadowingBuiltins
|
|
34
|
-
type = LinkTypeEnum.URL
|
|
35
|
-
if not mimetype:
|
|
36
|
-
mimetype = mimetypes.guess_type(ref.split('?')[0])[0] or 'image'
|
|
37
|
-
super().__init__(name=name, type=type, mimetype=mimetype, ref=ref)
|
|
38
|
-
|
|
39
|
-
@staticmethod
|
|
40
|
-
def from_list(url_list):
|
|
41
|
-
url_links = list()
|
|
42
|
-
for url in url_list:
|
|
43
|
-
url_links.append(UrlLink(ref=url))
|
|
44
|
-
return url_links
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class ItemLink(Link):
|
|
48
|
-
|
|
49
|
-
def __init__(self, ref=None, name=None, dataset_id=None, item=None):
|
|
50
|
-
if ref is None and item is None:
|
|
51
|
-
raise PlatformException('400', 'Must provide either ref or item_id')
|
|
52
|
-
|
|
53
|
-
if item is not None and not isinstance(item, entities.Item):
|
|
54
|
-
raise PlatformException('400', 'Param item must be of type Item')
|
|
55
|
-
|
|
56
|
-
if ref is None:
|
|
57
|
-
ref = item.id
|
|
58
|
-
|
|
59
|
-
if name is None:
|
|
60
|
-
if item is not None:
|
|
61
|
-
name = item.name
|
|
62
|
-
else:
|
|
63
|
-
name = ref
|
|
64
|
-
|
|
65
|
-
if dataset_id is None and item is not None and isinstance(item, entities.Item):
|
|
66
|
-
dataset_id = item.dataset_id
|
|
67
|
-
|
|
68
|
-
# noinspection PyShadowingBuiltins
|
|
69
|
-
type = LinkTypeEnum.ID
|
|
70
|
-
super().__init__(name=name, type=type, ref=ref, dataset_id=dataset_id)
|
|
71
|
-
|
|
72
|
-
@staticmethod
|
|
73
|
-
def from_list(items):
|
|
74
|
-
if not isinstance(items, list):
|
|
75
|
-
items = [items]
|
|
76
|
-
|
|
77
|
-
item_links = list()
|
|
78
|
-
for item in items:
|
|
79
|
-
if isinstance(item, str):
|
|
80
|
-
item_links.append(ItemLink(ref=item))
|
|
81
|
-
elif isinstance(item, entities.Item):
|
|
82
|
-
item_links.append(ItemLink(item=item))
|
|
83
|
-
else:
|
|
84
|
-
raise PlatformException('400', 'Unknown item type. items should be a list of item entities/item ids')
|
|
85
|
-
return item_links
|
|
1
|
+
from .. import entities
|
|
2
|
+
from .. import PlatformException
|
|
3
|
+
from enum import Enum
|
|
4
|
+
import os
|
|
5
|
+
import mimetypes
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class LinkTypeEnum(str, Enum):
|
|
9
|
+
"""
|
|
10
|
+
State enum
|
|
11
|
+
"""
|
|
12
|
+
ID = "id"
|
|
13
|
+
URL = "url"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Link:
|
|
17
|
+
|
|
18
|
+
# noinspection PyShadowingBuiltins
|
|
19
|
+
def __init__(self, name, type: LinkTypeEnum, ref, mimetype=None, dataset_id=None):
|
|
20
|
+
self.type = type
|
|
21
|
+
self.ref = ref
|
|
22
|
+
self.name = name
|
|
23
|
+
self.dataset_id = dataset_id
|
|
24
|
+
self.mimetype = mimetype
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class UrlLink(Link):
|
|
28
|
+
|
|
29
|
+
def __init__(self, ref, mimetype=None, name=None):
|
|
30
|
+
if name is None:
|
|
31
|
+
name = os.path.split(ref)[-1].replace('/', "").replace("\\", '').replace('.', '')
|
|
32
|
+
name = name.split('?')[0]
|
|
33
|
+
# noinspection PyShadowingBuiltins
|
|
34
|
+
type = LinkTypeEnum.URL
|
|
35
|
+
if not mimetype:
|
|
36
|
+
mimetype = mimetypes.guess_type(ref.split('?')[0])[0] or 'image'
|
|
37
|
+
super().__init__(name=name, type=type, mimetype=mimetype, ref=ref)
|
|
38
|
+
|
|
39
|
+
@staticmethod
|
|
40
|
+
def from_list(url_list):
|
|
41
|
+
url_links = list()
|
|
42
|
+
for url in url_list:
|
|
43
|
+
url_links.append(UrlLink(ref=url))
|
|
44
|
+
return url_links
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class ItemLink(Link):
|
|
48
|
+
|
|
49
|
+
def __init__(self, ref=None, name=None, dataset_id=None, item=None):
|
|
50
|
+
if ref is None and item is None:
|
|
51
|
+
raise PlatformException('400', 'Must provide either ref or item_id')
|
|
52
|
+
|
|
53
|
+
if item is not None and not isinstance(item, entities.Item):
|
|
54
|
+
raise PlatformException('400', 'Param item must be of type Item')
|
|
55
|
+
|
|
56
|
+
if ref is None:
|
|
57
|
+
ref = item.id
|
|
58
|
+
|
|
59
|
+
if name is None:
|
|
60
|
+
if item is not None:
|
|
61
|
+
name = item.name
|
|
62
|
+
else:
|
|
63
|
+
name = ref
|
|
64
|
+
|
|
65
|
+
if dataset_id is None and item is not None and isinstance(item, entities.Item):
|
|
66
|
+
dataset_id = item.dataset_id
|
|
67
|
+
|
|
68
|
+
# noinspection PyShadowingBuiltins
|
|
69
|
+
type = LinkTypeEnum.ID
|
|
70
|
+
super().__init__(name=name, type=type, ref=ref, dataset_id=dataset_id)
|
|
71
|
+
|
|
72
|
+
@staticmethod
|
|
73
|
+
def from_list(items):
|
|
74
|
+
if not isinstance(items, list):
|
|
75
|
+
items = [items]
|
|
76
|
+
|
|
77
|
+
item_links = list()
|
|
78
|
+
for item in items:
|
|
79
|
+
if isinstance(item, str):
|
|
80
|
+
item_links.append(ItemLink(ref=item))
|
|
81
|
+
elif isinstance(item, entities.Item):
|
|
82
|
+
item_links.append(ItemLink(item=item))
|
|
83
|
+
else:
|
|
84
|
+
raise PlatformException('400', 'Unknown item type. items should be a list of item entities/item ids')
|
|
85
|
+
return item_links
|