supervisely 6.73.290__py3-none-any.whl → 6.73.292__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.
Potentially problematic release.
This version of supervisely might be problematic. Click here for more details.
- supervisely/__init__.py +1 -1
- supervisely/api/image_api.py +11 -4
- supervisely/api/module_api.py +2 -0
- supervisely/api/remote_storage_api.py +139 -61
- supervisely/app/fastapi/templating.py +1 -1
- supervisely/project/project.py +2 -1
- {supervisely-6.73.290.dist-info → supervisely-6.73.292.dist-info}/METADATA +1 -1
- {supervisely-6.73.290.dist-info → supervisely-6.73.292.dist-info}/RECORD +12 -12
- {supervisely-6.73.290.dist-info → supervisely-6.73.292.dist-info}/LICENSE +0 -0
- {supervisely-6.73.290.dist-info → supervisely-6.73.292.dist-info}/WHEEL +0 -0
- {supervisely-6.73.290.dist-info → supervisely-6.73.292.dist-info}/entry_points.txt +0 -0
- {supervisely-6.73.290.dist-info → supervisely-6.73.292.dist-info}/top_level.txt +0 -0
supervisely/__init__.py
CHANGED
|
@@ -311,4 +311,4 @@ except Exception as e:
|
|
|
311
311
|
# If new changes in Supervisely Python SDK require upgrade of the Supervisely instance
|
|
312
312
|
# set a new value for the environment variable MINIMUM_INSTANCE_VERSION_FOR_SDK, otherwise
|
|
313
313
|
# users can face compatibility issues, if the instance version is lower than the SDK version.
|
|
314
|
-
os.environ["MINIMUM_INSTANCE_VERSION_FOR_SDK"] = "6.12.
|
|
314
|
+
os.environ["MINIMUM_INSTANCE_VERSION_FOR_SDK"] = "6.12.28"
|
supervisely/api/image_api.py
CHANGED
|
@@ -1028,7 +1028,10 @@ class ImageApi(RemoveableBulkModuleApi):
|
|
|
1028
1028
|
return results
|
|
1029
1029
|
|
|
1030
1030
|
def check_existing_links(
|
|
1031
|
-
self,
|
|
1031
|
+
self,
|
|
1032
|
+
links: List[str],
|
|
1033
|
+
progress_cb: Optional[Union[tqdm, Callable]] = None,
|
|
1034
|
+
team_id: Optional[int] = None,
|
|
1032
1035
|
) -> List[str]:
|
|
1033
1036
|
"""
|
|
1034
1037
|
Checks existing links for Images.
|
|
@@ -1037,6 +1040,8 @@ class ImageApi(RemoveableBulkModuleApi):
|
|
|
1037
1040
|
:type links: List[str]
|
|
1038
1041
|
:param progress_cb: Function for tracking progress of checking.
|
|
1039
1042
|
:type progress_cb: tqdm or callable, optional
|
|
1043
|
+
:param team_id: Team ID in Supervisely (will be used to get remote storage settings).
|
|
1044
|
+
:type team_id: int
|
|
1040
1045
|
:return: List of existing links
|
|
1041
1046
|
:rtype: List[str]
|
|
1042
1047
|
"""
|
|
@@ -1044,9 +1049,9 @@ class ImageApi(RemoveableBulkModuleApi):
|
|
|
1044
1049
|
if len(links) == 0:
|
|
1045
1050
|
return []
|
|
1046
1051
|
|
|
1047
|
-
def _is_image_available(url, progress_cb=None):
|
|
1052
|
+
def _is_image_available(url, team_id, progress_cb=None):
|
|
1048
1053
|
if self._api.remote_storage.is_bucket_url(url):
|
|
1049
|
-
response = self._api.remote_storage.is_path_exist(url)
|
|
1054
|
+
response = self._api.remote_storage.is_path_exist(url, team_id)
|
|
1050
1055
|
result = url if response else None
|
|
1051
1056
|
else:
|
|
1052
1057
|
response = requests.head(url)
|
|
@@ -1055,7 +1060,9 @@ class ImageApi(RemoveableBulkModuleApi):
|
|
|
1055
1060
|
progress_cb(1)
|
|
1056
1061
|
return result
|
|
1057
1062
|
|
|
1058
|
-
_is_image_available_with_progress = partial(
|
|
1063
|
+
_is_image_available_with_progress = partial(
|
|
1064
|
+
_is_image_available, team_id=team_id, progress_cb=progress_cb
|
|
1065
|
+
)
|
|
1059
1066
|
|
|
1060
1067
|
with ThreadPoolExecutor(max_workers=20) as executor:
|
|
1061
1068
|
results = list(executor.map(_is_image_available_with_progress, links))
|
supervisely/api/module_api.py
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
|
-
|
|
2
|
+
import mimetypes
|
|
3
|
+
from typing import Callable, List, Optional, Union
|
|
3
4
|
|
|
5
|
+
from requests_toolbelt import MultipartEncoder
|
|
4
6
|
from tqdm import tqdm
|
|
5
7
|
|
|
6
|
-
from supervisely
|
|
8
|
+
from supervisely import logger
|
|
9
|
+
from supervisely.api.module_api import ApiField, ModuleApiBase
|
|
7
10
|
from supervisely.collection.str_enum import StrEnum
|
|
11
|
+
from supervisely.io import env
|
|
8
12
|
from supervisely.io.fs import ensure_base_path, get_file_name_with_ext
|
|
9
|
-
from supervisely import logger
|
|
10
|
-
from requests_toolbelt import MultipartEncoder
|
|
11
|
-
import mimetypes
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
class Provider(StrEnum):
|
|
@@ -53,30 +54,38 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
53
54
|
def get_file_info_by_path(
|
|
54
55
|
self,
|
|
55
56
|
path: str,
|
|
56
|
-
|
|
57
|
+
team_id: int = None,
|
|
58
|
+
) -> Optional[dict]:
|
|
57
59
|
"""
|
|
58
60
|
Get info about file for given remote path.
|
|
59
61
|
|
|
60
62
|
:param path: Remote path to file.
|
|
61
63
|
:type path: str
|
|
62
|
-
:
|
|
63
|
-
:
|
|
64
|
+
:param team_id: Team ID (to get cloud storages connected to the team)
|
|
65
|
+
:type team_id: int
|
|
66
|
+
:returns: file info in the given remote path
|
|
67
|
+
:rtype: Optional[dict]
|
|
64
68
|
|
|
65
69
|
"""
|
|
66
|
-
|
|
70
|
+
team_id = team_id or env.team_id(raise_not_found=False)
|
|
67
71
|
Provider.validate_path(path)
|
|
68
72
|
path = path.rstrip("/")
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
73
|
+
|
|
74
|
+
json_body = {
|
|
75
|
+
ApiField.PATH: path,
|
|
76
|
+
ApiField.RECURSIVE: False,
|
|
77
|
+
ApiField.FILES: True,
|
|
78
|
+
ApiField.FOLDERS: False,
|
|
79
|
+
ApiField.LIMIT: 1,
|
|
80
|
+
"startAfter": "",
|
|
81
|
+
}
|
|
82
|
+
if team_id is not None:
|
|
83
|
+
json_body[ApiField.GROUP_ID] = team_id
|
|
84
|
+
|
|
85
|
+
resp = self._api.get("remote-storage.list", json_body)
|
|
86
|
+
if resp is None:
|
|
87
|
+
return None
|
|
88
|
+
|
|
80
89
|
return resp.json()[0]
|
|
81
90
|
|
|
82
91
|
def list(
|
|
@@ -87,6 +96,7 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
87
96
|
folders: bool = True,
|
|
88
97
|
limit: int = 10000,
|
|
89
98
|
start_after: str = "",
|
|
99
|
+
team_id: int = None,
|
|
90
100
|
) -> list:
|
|
91
101
|
"""
|
|
92
102
|
List files and directories for given remote path.
|
|
@@ -103,28 +113,39 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
103
113
|
:type limit: int
|
|
104
114
|
:param start_after: Start listing path after given file name.
|
|
105
115
|
:type start_after: str
|
|
116
|
+
:param team_id: Team ID (to get cloud storages connected to the team)
|
|
117
|
+
:type team_id: int
|
|
106
118
|
:returns: List of files in the given remote path
|
|
107
|
-
:rtype:
|
|
119
|
+
:rtype: list
|
|
108
120
|
|
|
109
121
|
"""
|
|
122
|
+
team_id = team_id or env.team_id(raise_not_found=False)
|
|
110
123
|
|
|
111
124
|
Provider.validate_path(path)
|
|
112
125
|
path = path.rstrip("/") + "/"
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
126
|
+
|
|
127
|
+
json_body = {
|
|
128
|
+
ApiField.PATH: path,
|
|
129
|
+
ApiField.RECURSIVE: recursive,
|
|
130
|
+
ApiField.FILES: files,
|
|
131
|
+
ApiField.FOLDERS: folders,
|
|
132
|
+
ApiField.LIMIT: limit,
|
|
133
|
+
"startAfter": start_after,
|
|
134
|
+
}
|
|
135
|
+
if team_id is not None:
|
|
136
|
+
json_body[ApiField.GROUP_ID] = team_id
|
|
137
|
+
|
|
138
|
+
resp = self._api.get("remote-storage.list", json_body)
|
|
139
|
+
if resp is None:
|
|
140
|
+
return []
|
|
124
141
|
return resp.json()
|
|
125
142
|
|
|
126
143
|
def download_path(
|
|
127
|
-
self,
|
|
144
|
+
self,
|
|
145
|
+
remote_path: str,
|
|
146
|
+
save_path: str,
|
|
147
|
+
progress_cb: Optional[Union[tqdm, Callable]] = None,
|
|
148
|
+
team_id: int = None,
|
|
128
149
|
):
|
|
129
150
|
"""
|
|
130
151
|
Downloads item from given remote path to given local path.
|
|
@@ -135,6 +156,8 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
135
156
|
:type save_path: str
|
|
136
157
|
:param progress_cb: Progress function to download.
|
|
137
158
|
:type progress_cb: tqdm or callable, optional
|
|
159
|
+
:param team_id: Team ID (to get cloud storages connected to the team)
|
|
160
|
+
:type team_id: int
|
|
138
161
|
|
|
139
162
|
|
|
140
163
|
.. code-block:: python
|
|
@@ -145,13 +168,17 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
145
168
|
remote_path = api.remote_storage.get_remote_path(provider, bucket, path_in_bucket)
|
|
146
169
|
# or alternatively use this:
|
|
147
170
|
# remote_path = f"{provider}://{bucket}{path_in_bucket}"
|
|
148
|
-
api.remote_storage.
|
|
171
|
+
api.remote_storage.download_path(local_path="images/my-cats.jpg", remote_path=remote_path)
|
|
149
172
|
"""
|
|
173
|
+
team_id = team_id or env.team_id(raise_not_found=False)
|
|
150
174
|
Provider.validate_path(remote_path)
|
|
151
175
|
ensure_base_path(save_path)
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
176
|
+
|
|
177
|
+
json_body = {ApiField.LINK: remote_path}
|
|
178
|
+
if team_id is not None:
|
|
179
|
+
json_body[ApiField.GROUP_ID] = team_id
|
|
180
|
+
|
|
181
|
+
response = self._api.post("remote-storage.download", json_body, stream=True)
|
|
155
182
|
# if "Content-Length" in response.headers:
|
|
156
183
|
# length = int(response.headers['Content-Length'])
|
|
157
184
|
with open(save_path, "wb") as fd:
|
|
@@ -160,7 +187,7 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
160
187
|
if progress_cb is not None:
|
|
161
188
|
progress_cb(len(chunk))
|
|
162
189
|
|
|
163
|
-
def upload_path(self, local_path: str, remote_path: str):
|
|
190
|
+
def upload_path(self, local_path: str, remote_path: str, team_id: int = None):
|
|
164
191
|
"""
|
|
165
192
|
Uploads item from given local path to given remote path.
|
|
166
193
|
|
|
@@ -168,6 +195,8 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
168
195
|
:type local_path: str
|
|
169
196
|
:param remote_path: Remote destination path.
|
|
170
197
|
:type remote_path: str
|
|
198
|
+
:param team_id: Team ID (to get cloud storages connected to the team)
|
|
199
|
+
:type team_id: int
|
|
171
200
|
:Usage example:
|
|
172
201
|
|
|
173
202
|
.. code-block:: python
|
|
@@ -176,15 +205,17 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
176
205
|
bucket = "bucket-test-export"
|
|
177
206
|
path_in_bucket = "/demo/image.jpg"
|
|
178
207
|
remote_path = api.remote_storage.get_remote_path(provider, bucket, path_in_bucket)
|
|
208
|
+
team_id = 123
|
|
179
209
|
# or alternatively use this:
|
|
180
210
|
# remote_path = f"{provider}://{bucket}{path_in_bucket}"
|
|
181
|
-
api.remote_storage.upload_path(
|
|
211
|
+
api.remote_storage.upload_path("images/my-cats.jpg", remote_path, team_id)
|
|
182
212
|
"""
|
|
183
213
|
Provider.validate_path(remote_path)
|
|
184
|
-
return self._upload_paths_batch([local_path], [remote_path])
|
|
214
|
+
return self._upload_paths_batch([local_path], [remote_path], team_id)
|
|
185
215
|
|
|
186
|
-
def _upload_paths_batch(self, local_paths, remote_paths):
|
|
216
|
+
def _upload_paths_batch(self, local_paths, remote_paths, team_id: int = None):
|
|
187
217
|
"""_upload_paths_batch"""
|
|
218
|
+
team_id = team_id or env.team_id(raise_not_found=False)
|
|
188
219
|
|
|
189
220
|
if len(local_paths) != len(remote_paths):
|
|
190
221
|
raise ValueError("Inconsistency in paths, len(local_paths) != len(remote_paths)")
|
|
@@ -209,7 +240,10 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
209
240
|
)
|
|
210
241
|
)
|
|
211
242
|
encoder = MultipartEncoder(fields=content)
|
|
212
|
-
|
|
243
|
+
url = f"remote-storage.upload"
|
|
244
|
+
if team_id is not None:
|
|
245
|
+
url += f"?teamId={team_id}"
|
|
246
|
+
resp = self._api.post(url, encoder)
|
|
213
247
|
return resp.json()
|
|
214
248
|
|
|
215
249
|
def get_remote_path(self, provider: str, bucket: str, path_in_bucket: str) -> str:
|
|
@@ -236,10 +270,15 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
236
270
|
Provider.validate_path(res_path)
|
|
237
271
|
return res_path
|
|
238
272
|
|
|
239
|
-
def get_list_available_providers(
|
|
273
|
+
def get_list_available_providers(
|
|
274
|
+
self,
|
|
275
|
+
team_id: int = None,
|
|
276
|
+
) -> List[dict]:
|
|
240
277
|
"""
|
|
241
278
|
Get the list of available providers for the instance.
|
|
242
279
|
|
|
280
|
+
:param team_id: Team ID (to get cloud storages connected to the team)
|
|
281
|
+
:type team_id: int
|
|
243
282
|
:return: List of available providers
|
|
244
283
|
:rtype: List[dict]
|
|
245
284
|
:Usage example:
|
|
@@ -260,7 +299,8 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
260
299
|
# Pass values into the API constructor (optional, not recommended)
|
|
261
300
|
# api = sly.Api(server_address="https://app.supervise.ly", token="4r47N...xaTatb")
|
|
262
301
|
|
|
263
|
-
|
|
302
|
+
team_id = 123
|
|
303
|
+
available_providers = api.remote_storage.get_list_available_providers(team_id)
|
|
264
304
|
|
|
265
305
|
# Output example
|
|
266
306
|
|
|
@@ -281,13 +321,24 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
281
321
|
# ]
|
|
282
322
|
|
|
283
323
|
"""
|
|
284
|
-
|
|
324
|
+
team_id = team_id or env.team_id(raise_not_found=False)
|
|
325
|
+
|
|
326
|
+
json_body = {}
|
|
327
|
+
if team_id is not None:
|
|
328
|
+
json_body[ApiField.GROUP_ID] = team_id
|
|
329
|
+
|
|
330
|
+
resp = self._api.get("remote-storage.available_providers", json_body)
|
|
285
331
|
return resp.json()
|
|
286
332
|
|
|
287
|
-
def get_list_supported_providers(
|
|
333
|
+
def get_list_supported_providers(
|
|
334
|
+
self,
|
|
335
|
+
team_id: int = None,
|
|
336
|
+
) -> List[dict]:
|
|
288
337
|
"""
|
|
289
338
|
Get the list of supported providers for the instance.
|
|
290
339
|
|
|
340
|
+
:param team_id: Team ID (to get cloud storages connected to the team)
|
|
341
|
+
:type team_id: int
|
|
291
342
|
:return: List of supported providers
|
|
292
343
|
:rtype: List[dict]
|
|
293
344
|
:Usage example:
|
|
@@ -308,7 +359,8 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
308
359
|
# Pass values into the API constructor (optional, not recommended)
|
|
309
360
|
# api = sly.Api(server_address="https://app.supervise.ly", token="4r47N...xaTatb")
|
|
310
361
|
|
|
311
|
-
|
|
362
|
+
team_id = 123
|
|
363
|
+
supported_providers = api.remote_storage.get_list_supported_providers(team_id)
|
|
312
364
|
|
|
313
365
|
# Output example
|
|
314
366
|
|
|
@@ -325,15 +377,27 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
325
377
|
# ]
|
|
326
378
|
|
|
327
379
|
"""
|
|
328
|
-
|
|
380
|
+
team_id = team_id or env.team_id(raise_not_found=False)
|
|
381
|
+
|
|
382
|
+
json_body = {}
|
|
383
|
+
if team_id is not None:
|
|
384
|
+
json_body[ApiField.GROUP_ID] = team_id
|
|
385
|
+
|
|
386
|
+
resp = self._api.get("remote-storage.supported_providers", json_body)
|
|
329
387
|
return resp.json()
|
|
330
388
|
|
|
331
|
-
def is_path_exist(
|
|
389
|
+
def is_path_exist(
|
|
390
|
+
self,
|
|
391
|
+
path: str,
|
|
392
|
+
team_id: int = None,
|
|
393
|
+
) -> bool:
|
|
332
394
|
"""
|
|
333
395
|
Check if the file path exists.
|
|
334
396
|
|
|
335
397
|
:param path: URL of the file in the bucket storage
|
|
336
398
|
:type path: str
|
|
399
|
+
:param team_id: Team ID (to get cloud storages connected to the team)
|
|
400
|
+
:type team_id: int
|
|
337
401
|
:return: True if the file exists, False otherwise
|
|
338
402
|
:rtype: bool
|
|
339
403
|
:Usage example:
|
|
@@ -358,13 +422,17 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
358
422
|
is_exist = api.remote_storage.is_path_exist(path)
|
|
359
423
|
|
|
360
424
|
"""
|
|
361
|
-
|
|
425
|
+
team_id = team_id or env.team_id(raise_not_found=False)
|
|
362
426
|
Provider.validate_path(path)
|
|
363
427
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
428
|
+
json_body = {ApiField.PATH: path}
|
|
429
|
+
if team_id is not None:
|
|
430
|
+
json_body[ApiField.GROUP_ID] = team_id
|
|
431
|
+
|
|
432
|
+
resp = self._api.get("remote-storage.exists", json_body)
|
|
433
|
+
if resp is None:
|
|
434
|
+
return False
|
|
435
|
+
|
|
368
436
|
resp = resp.json()
|
|
369
437
|
|
|
370
438
|
if resp.get("exists"):
|
|
@@ -372,12 +440,18 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
372
440
|
else:
|
|
373
441
|
return False
|
|
374
442
|
|
|
375
|
-
def get_path_stats(
|
|
443
|
+
def get_path_stats(
|
|
444
|
+
self,
|
|
445
|
+
path: str,
|
|
446
|
+
team_id: int = None,
|
|
447
|
+
) -> Optional[dict]:
|
|
376
448
|
"""
|
|
377
449
|
Get information about file size and the date of its last modification in bucket storage.
|
|
378
450
|
|
|
379
451
|
:param path: URL of the file in the bucket storage
|
|
380
452
|
:type path: str
|
|
453
|
+
:param team_id: Team ID (to get cloud storages connected to the team)
|
|
454
|
+
:type team_id: int
|
|
381
455
|
:return: File 'size' in bytes and 'lastModified' date if file exists, otherwise None
|
|
382
456
|
:rtype: Optional[dict]
|
|
383
457
|
:Usage example:
|
|
@@ -399,7 +473,8 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
399
473
|
# api = sly.Api(server_address="https://app.supervise.ly", token="4r47N...xaTatb")
|
|
400
474
|
|
|
401
475
|
path = "s3://bucket/lemons/ds1/img/IMG_444.jpeg"
|
|
402
|
-
|
|
476
|
+
team_id = 123
|
|
477
|
+
stats = api.remote_storage.get_path_stats(path, team_id)
|
|
403
478
|
|
|
404
479
|
# Output example
|
|
405
480
|
|
|
@@ -409,11 +484,14 @@ class RemoteStorageApi(ModuleApiBase):
|
|
|
409
484
|
# }
|
|
410
485
|
|
|
411
486
|
"""
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
487
|
+
team_id = team_id or env.team_id(raise_not_found=False)
|
|
488
|
+
|
|
489
|
+
json_body = {ApiField.PATH: path}
|
|
490
|
+
if team_id is not None:
|
|
491
|
+
json_body[ApiField.GROUP_ID] = team_id
|
|
492
|
+
|
|
493
|
+
if self.is_path_exist(path, team_id):
|
|
494
|
+
resp = self._api.get("remote-storage.stat", json_body)
|
|
417
495
|
return resp.json()
|
|
418
496
|
else:
|
|
419
497
|
path_folers = path.split("/")[3:]
|
|
@@ -11,7 +11,7 @@ from supervisely.app.singleton import Singleton
|
|
|
11
11
|
from supervisely.app.widgets_context import JinjaWidgets
|
|
12
12
|
|
|
13
13
|
# https://github.com/supervisely/js-bundle
|
|
14
|
-
js_bundle_version = "2.1.
|
|
14
|
+
js_bundle_version = "2.1.98"
|
|
15
15
|
|
|
16
16
|
# https://github.com/supervisely-ecosystem/supervisely-app-frontend-js
|
|
17
17
|
js_frontend_version = "v0.0.54"
|
supervisely/project/project.py
CHANGED
|
@@ -3352,8 +3352,9 @@ class Project:
|
|
|
3352
3352
|
existing_hashes = api.image.check_existing_hashes(
|
|
3353
3353
|
list(set([inf.hash for inf in image_infos if inf.hash and not inf.link]))
|
|
3354
3354
|
)
|
|
3355
|
+
workspace_info = api.workspace.get_info_by_id(workspace_id)
|
|
3355
3356
|
existing_links = api.image.check_existing_links(
|
|
3356
|
-
list(set([inf.link for inf in image_infos if inf.link]))
|
|
3357
|
+
list(set([inf.link for inf in image_infos if inf.link])), team_id=workspace_info.team_id
|
|
3357
3358
|
)
|
|
3358
3359
|
image_infos = sorted(image_infos, key=lambda info: info.link is not None)
|
|
3359
3360
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
supervisely/README.md,sha256=XM-DiMC6To3I9RjQZ0c61905EFRR_jnCUx2q3uNR-X8,3331
|
|
2
|
-
supervisely/__init__.py,sha256=
|
|
2
|
+
supervisely/__init__.py,sha256=NCOkCKvZ1qqcgIRuEcd-uFkzC0g4MaUdlulPSHqUbu0,10833
|
|
3
3
|
supervisely/_utils.py,sha256=DX_2n8zWTG2AzW8bCvU9z9joLzcwzVjLmvslVF39pE8,16022
|
|
4
4
|
supervisely/function_wrapper.py,sha256=R5YajTQ0GnRp2vtjwfC9hINkzQc0JiyGsu8TER373xY,1912
|
|
5
5
|
supervisely/sly_logger.py,sha256=LG1wTyyctyEKuCuKM2IKf_SMPH7BzkTsFdO-0tnorzg,6225
|
|
@@ -28,17 +28,17 @@ supervisely/api/dataset_api.py,sha256=GH7prDRJKyJlTv_7_Y-RkTwJN7ED4EkXNqqmi3iIdI
|
|
|
28
28
|
supervisely/api/file_api.py,sha256=v2FsD3oljwNPqcDgEJRe8Bu5k0PYKzVhqmRb5QFaHAQ,83422
|
|
29
29
|
supervisely/api/github_api.py,sha256=NIexNjEer9H5rf5sw2LEZd7C1WR-tK4t6IZzsgeAAwQ,623
|
|
30
30
|
supervisely/api/image_annotation_tool_api.py,sha256=YcUo78jRDBJYvIjrd-Y6FJAasLta54nnxhyaGyanovA,5237
|
|
31
|
-
supervisely/api/image_api.py,sha256=
|
|
31
|
+
supervisely/api/image_api.py,sha256=oi8luorbCaqMzd88_sjKeQQsX4eYOGJ8DVEbmSM44bw,192139
|
|
32
32
|
supervisely/api/import_storage_api.py,sha256=BDCgmR0Hv6OoiRHLCVPKt3iDxSVlQp1WrnKhAK_Zl84,460
|
|
33
33
|
supervisely/api/issues_api.py,sha256=BqDJXmNoTzwc3xe6_-mA7FDFC5QQ-ahGbXk_HmpkSeQ,17925
|
|
34
34
|
supervisely/api/labeling_job_api.py,sha256=odnzZjp29yM16Gq-FYkv-OA4WFMNJCLFo4qSikW2A7c,56280
|
|
35
|
-
supervisely/api/module_api.py,sha256=
|
|
35
|
+
supervisely/api/module_api.py,sha256=x5C1KvTulm5yZ-s9Sa47T4u--QRG6ditj1GhcqocTeA,44381
|
|
36
36
|
supervisely/api/neural_network_api.py,sha256=ktPVRO4Jeulougio8F0mioJJHwRJcX250Djp1wBoQ9c,7620
|
|
37
37
|
supervisely/api/object_class_api.py,sha256=-rQcKwhBw3iL9KNH9c1ROgoimgWM1ls6Wi_tb1R-MzY,7683
|
|
38
38
|
supervisely/api/plugin_api.py,sha256=TlfrosdRuYG4NUxk92QiQoVaOdztFspPpygyVa3M3zk,5283
|
|
39
39
|
supervisely/api/project_api.py,sha256=ZTRx7LXsPLjMuGq_PhugPgN-OsGMtTRxputH9EA9iZ0,78774
|
|
40
40
|
supervisely/api/project_class_api.py,sha256=5cyjdGPPb2tpttu5WmYoOxUNiDxqiojschkhZumF0KM,1426
|
|
41
|
-
supervisely/api/remote_storage_api.py,sha256=
|
|
41
|
+
supervisely/api/remote_storage_api.py,sha256=qTuPhPsstgEjRm1g-ZInddik8BNC_38YvBBPvgmim6U,17790
|
|
42
42
|
supervisely/api/report_api.py,sha256=Om7CGulUbQ4BuJ16eDtz7luLe0JQNqab-LoLpUXu7YE,7123
|
|
43
43
|
supervisely/api/role_api.py,sha256=aBL4mxtn08LDPXQuS153-lQFN6N2kcwiz8MbescZ8Gk,3044
|
|
44
44
|
supervisely/api/storage_api.py,sha256=FPGYf3Rn3LBoe38RBNdoiURs306oshzvKOEOQ56XAbs,13030
|
|
@@ -94,7 +94,7 @@ supervisely/app/fastapi/no_html_main.html,sha256=NhQP7noyORBx72lFh1CQKgBRupkWjiq
|
|
|
94
94
|
supervisely/app/fastapi/offline.py,sha256=CwMMkJ1frD6wiZS-SEoNDtQ1UJcJe1Ob6ohE3r4CQL8,7414
|
|
95
95
|
supervisely/app/fastapi/request.py,sha256=NU7rKmxJ1pfkDZ7_yHckRcRAueJRQIqCor11UO2OHr8,766
|
|
96
96
|
supervisely/app/fastapi/subapp.py,sha256=MlB2dcHEtF0RPk-hxk67Gb1wBeGHsgCEIqAaBHzLEoY,43653
|
|
97
|
-
supervisely/app/fastapi/templating.py,sha256=
|
|
97
|
+
supervisely/app/fastapi/templating.py,sha256=hTD8ZRwcHXux49zEcQV_1Cvgs_wypdJaDUMAogoayzI,2929
|
|
98
98
|
supervisely/app/fastapi/utils.py,sha256=GZuTWLcVRGVx8TL3jVEYUOZIT2FawbwIe2kAOBLw9ho,398
|
|
99
99
|
supervisely/app/fastapi/websocket.py,sha256=TlRSPOAhRItTv1HGvdukK1ZvhRjMUxRa-lJlsRR9rJw,1308
|
|
100
100
|
supervisely/app/v1/__init__.py,sha256=OdU0PYv6hLwahYoyaLFO8m3cbJSchvPbqxuG1N3T734,848
|
|
@@ -1009,7 +1009,7 @@ supervisely/project/data_version.py,sha256=nknaWJSUCwoDyNG9_d1KA-GjzidhV9zd9Cn8c
|
|
|
1009
1009
|
supervisely/project/download.py,sha256=zb8sb4XZ6Qi3CP7fmtLRUAYzaxs_W0WnOfe2x3ZVRMs,24639
|
|
1010
1010
|
supervisely/project/pointcloud_episode_project.py,sha256=yiWdNBQiI6f1O9sr1pg8JHW6O-w3XUB1rikJNn3Oung,41866
|
|
1011
1011
|
supervisely/project/pointcloud_project.py,sha256=Kx1Vaes-krwG3BiRRtHRLQxb9G5m5bTHPN9IzRqmNWo,49399
|
|
1012
|
-
supervisely/project/project.py,sha256=
|
|
1012
|
+
supervisely/project/project.py,sha256=pDKRPZZCwW79wlfDi4JK9rOZisO2vWRfiOD_j7AId5k,202403
|
|
1013
1013
|
supervisely/project/project_meta.py,sha256=26s8IiHC5Pg8B1AQi6_CrsWteioJP2in00cRNe8QlW0,51423
|
|
1014
1014
|
supervisely/project/project_settings.py,sha256=NLThzU_DCynOK6hkHhVdFyezwprn9UqlnrLDe_3qhkY,9347
|
|
1015
1015
|
supervisely/project/project_type.py,sha256=_3RqW2CnDBKFOvSIrQT1RJQaiHirs34_jiQS8CkwCpo,530
|
|
@@ -1071,9 +1071,9 @@ supervisely/worker_proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
|
|
|
1071
1071
|
supervisely/worker_proto/worker_api_pb2.py,sha256=VQfi5JRBHs2pFCK1snec3JECgGnua3Xjqw_-b3aFxuM,59142
|
|
1072
1072
|
supervisely/worker_proto/worker_api_pb2_grpc.py,sha256=3BwQXOaP9qpdi0Dt9EKG--Lm8KGN0C5AgmUfRv77_Jk,28940
|
|
1073
1073
|
supervisely_lib/__init__.py,sha256=7-3QnN8Zf0wj8NCr2oJmqoQWMKKPKTECvjH9pd2S5vY,159
|
|
1074
|
-
supervisely-6.73.
|
|
1075
|
-
supervisely-6.73.
|
|
1076
|
-
supervisely-6.73.
|
|
1077
|
-
supervisely-6.73.
|
|
1078
|
-
supervisely-6.73.
|
|
1079
|
-
supervisely-6.73.
|
|
1074
|
+
supervisely-6.73.292.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
1075
|
+
supervisely-6.73.292.dist-info/METADATA,sha256=ZKWuHNkAWaRrj9VSUnHGAP1J0stiYcNzyl4VaKzkxI8,33573
|
|
1076
|
+
supervisely-6.73.292.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
|
1077
|
+
supervisely-6.73.292.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
|
|
1078
|
+
supervisely-6.73.292.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
|
|
1079
|
+
supervisely-6.73.292.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|