10
10
from kili .adapters .kili_api_gateway .helpers .queries import QueryOptions
11
11
from kili .core .helpers import is_empty_list_with_warning
12
12
from kili .core .utils .pagination import mutate_from_paginated_call
13
- from kili .domain .asset import AssetFilters , AssetId
13
+ from kili .domain .asset import AssetExternalId , AssetFilters , AssetId
14
14
from kili .domain .project import ProjectId
15
15
from kili .entrypoints .base import BaseOperationEntrypointMixin
16
16
from kili .entrypoints .mutations .asset .helpers import (
@@ -412,16 +412,18 @@ def generate_variables(batch: Dict) -> Dict:
412
412
def add_metadata (
413
413
self ,
414
414
json_metadata : List [Dict [str , Union [str , int , float ]]],
415
- asset_ids : List [str ],
416
415
project_id : str ,
416
+ asset_ids : Optional [List [str ]] = None ,
417
+ external_ids : Optional [List [str ]] = None ,
417
418
) -> List [Dict [Literal ["id" ], str ]]:
418
419
"""Add metadata to assets without overriding existing metadata.
419
420
420
421
Args:
421
422
json_metadata: List of metadata dictionaries to add to each asset.
422
423
Each dictionary contains key/value pairs to be added to the asset's metadata.
423
- asset_ids: The asset IDs to modify.
424
424
project_id: The project ID.
425
+ asset_ids: The asset IDs to modify.
426
+ external_ids: The external asset IDs to modify (if `asset_ids` is not already provided).
425
427
426
428
Returns:
427
429
A list of dictionaries with the asset ids.
@@ -432,21 +434,39 @@ def add_metadata(
432
434
{"key1": "value1", "key2": "value2"},
433
435
{"key3": "value3"}
434
436
],
435
- asset_ids=["ckg22d81r0jrg0885unmuswj8", "ckg22d81s0jrh0885pdxfd03n"],
436
- project_id="cm92to3cx012u7l0w6kij9qvx"
437
+ project_id="cm92to3cx012u7l0w6kij9qvx",
438
+ asset_ids=["ckg22d81r0jrg0885unmuswj8", "ckg22d81s0jrh0885pdxfd03n"]
439
+ )
440
+
441
+ # Or using external IDs
442
+ >>> kili.add_metadata(
443
+ json_metadata=[
444
+ {"key1": "value1", "key2": "value2"},
445
+ {"key3": "value3"}
446
+ ],
447
+ project_id="cm92to3cx012u7l0w6kij9qvx",
448
+ external_ids=["asset1", "asset2"]
437
449
)
438
450
"""
439
451
if is_empty_list_with_warning ("add_metadata" , "json_metadata" , json_metadata ):
440
452
return []
441
453
454
+ if (asset_ids is not None and external_ids is not None ) or (
455
+ asset_ids is None and external_ids is None
456
+ ):
457
+ raise MissingArgumentError ("Please provide either `asset_ids` or `external_ids`." )
458
+
442
459
assets = self .kili_api_gateway .list_assets (
443
460
AssetFilters (
444
- project_id = ProjectId (project_id ), asset_id_in = cast (List [AssetId ], asset_ids )
461
+ project_id = ProjectId (project_id ),
462
+ asset_id_in = cast (List [AssetId ], asset_ids ),
463
+ external_id_in = cast (List [AssetExternalId ], external_ids ),
445
464
),
446
465
["id" , "jsonMetadata" ],
447
466
QueryOptions (disable_tqdm = True ),
448
467
)
449
468
469
+ resolved_asset_ids = []
450
470
json_metadatas = []
451
471
for i , asset in enumerate (assets ):
452
472
current_metadata = asset .get ("jsonMetadata" , {}) if asset .get ("jsonMetadata" ) else {}
@@ -455,26 +475,29 @@ def add_metadata(
455
475
current_metadata .update (new_metadata )
456
476
457
477
json_metadatas .append (current_metadata )
478
+ resolved_asset_ids .append (asset ["id" ])
458
479
459
480
return self .update_properties_in_assets (
460
- asset_ids = asset_ids ,
481
+ asset_ids = cast ( List [ str ], resolved_asset_ids ) ,
461
482
json_metadatas = json_metadatas ,
462
483
)
463
484
464
485
@typechecked
465
486
def set_metadata (
466
487
self ,
467
488
json_metadata : List [Dict [str , Union [str , int , float ]]],
468
- asset_ids : List [str ],
469
489
project_id : str ,
490
+ asset_ids : Optional [List [str ]] = None ,
491
+ external_ids : Optional [List [str ]] = None ,
470
492
) -> List [Dict [Literal ["id" ], str ]]:
471
493
"""Set metadata on assets, replacing any existing metadata.
472
494
473
495
Args:
474
496
json_metadata: List of metadata dictionaries to set on each asset.
475
497
Each dictionary contains key/value pairs to be set as the asset's metadata.
476
- asset_ids: The asset IDs to modify.
477
498
project_id: The project ID.
499
+ asset_ids: The asset IDs to modify (if `external_ids` is not already provided).
500
+ external_ids: The external asset IDs to modify (if `asset_ids` is not already provided).
478
501
479
502
Returns:
480
503
A list of dictionaries with the asset ids.
@@ -485,21 +508,39 @@ def set_metadata(
485
508
{"key1": "value1", "key2": "value2"},
486
509
{"key3": "value3"}
487
510
],
488
- asset_ids=["ckg22d81r0jrg0885unmuswj8", "ckg22d81s0jrh0885pdxfd03n"],
489
511
project_id="cm92to3cx012u7l0w6kij9qvx"
512
+ asset_ids=["ckg22d81r0jrg0885unmuswj8", "ckg22d81s0jrh0885pdxfd03n"]
513
+ )
514
+
515
+ # Or using external IDs
516
+ >>> kili.set_metadata(
517
+ json_metadata=[
518
+ {"key1": "value1", "key2": "value2"},
519
+ {"key3": "value3"}
520
+ ],
521
+ project_id="cm92to3cx012u7l0w6kij9qvx",
522
+ external_ids=["asset1", "asset2"]
490
523
)
491
524
"""
492
525
if is_empty_list_with_warning ("set_metadata" , "json_metadata" , json_metadata ):
493
526
return []
494
527
528
+ if (asset_ids is not None and external_ids is not None ) or (
529
+ asset_ids is None and external_ids is None
530
+ ):
531
+ raise MissingArgumentError ("Please provide either `asset_ids` or `external_ids`." )
532
+
495
533
assets = self .kili_api_gateway .list_assets (
496
534
AssetFilters (
497
- project_id = ProjectId (project_id ), asset_id_in = cast (List [AssetId ], asset_ids )
535
+ project_id = ProjectId (project_id ),
536
+ asset_id_in = cast (List [AssetId ], asset_ids ),
537
+ external_id_in = cast (List [AssetExternalId ], external_ids ),
498
538
),
499
539
["id" , "jsonMetadata" ],
500
540
QueryOptions (disable_tqdm = True ),
501
541
)
502
542
543
+ resolved_asset_ids = []
503
544
json_metadatas = []
504
545
for i , asset in enumerate (assets ):
505
546
current_metadata = asset .get ("jsonMetadata" , {}) if asset .get ("jsonMetadata" ) else {}
@@ -513,9 +554,10 @@ def set_metadata(
513
554
preserved_metadata .update (new_metadata )
514
555
515
556
json_metadatas .append (preserved_metadata )
557
+ resolved_asset_ids .append (asset ["id" ])
516
558
517
559
return self .update_properties_in_assets (
518
- asset_ids = asset_ids ,
560
+ asset_ids = cast ( List [ str ], resolved_asset_ids ) ,
519
561
json_metadatas = json_metadatas ,
520
562
)
521
563
0 commit comments