1010from kili .adapters .kili_api_gateway .helpers .queries import QueryOptions
1111from kili .core .helpers import is_empty_list_with_warning
1212from 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
1414from kili .domain .project import ProjectId
1515from kili .entrypoints .base import BaseOperationEntrypointMixin
1616from kili .entrypoints .mutations .asset .helpers import (
@@ -412,16 +412,18 @@ def generate_variables(batch: Dict) -> Dict:
412412 def add_metadata (
413413 self ,
414414 json_metadata : List [Dict [str , Union [str , int , float ]]],
415- asset_ids : List [str ],
416415 project_id : str ,
416+ asset_ids : Optional [List [str ]] = None ,
417+ external_ids : Optional [List [str ]] = None ,
417418 ) -> List [Dict [Literal ["id" ], str ]]:
418419 """Add metadata to assets without overriding existing metadata.
419420
420421 Args:
421422 json_metadata: List of metadata dictionaries to add to each asset.
422423 Each dictionary contains key/value pairs to be added to the asset's metadata.
423- asset_ids: The asset IDs to modify.
424424 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).
425427
426428 Returns:
427429 A list of dictionaries with the asset ids.
@@ -432,21 +434,39 @@ def add_metadata(
432434 {"key1": "value1", "key2": "value2"},
433435 {"key3": "value3"}
434436 ],
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"]
437449 )
438450 """
439451 if is_empty_list_with_warning ("add_metadata" , "json_metadata" , json_metadata ):
440452 return []
441453
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+
442459 assets = self .kili_api_gateway .list_assets (
443460 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 ),
445464 ),
446465 ["id" , "jsonMetadata" ],
447466 QueryOptions (disable_tqdm = True ),
448467 )
449468
469+ resolved_asset_ids = []
450470 json_metadatas = []
451471 for i , asset in enumerate (assets ):
452472 current_metadata = asset .get ("jsonMetadata" , {}) if asset .get ("jsonMetadata" ) else {}
@@ -455,26 +475,29 @@ def add_metadata(
455475 current_metadata .update (new_metadata )
456476
457477 json_metadatas .append (current_metadata )
478+ resolved_asset_ids .append (asset ["id" ])
458479
459480 return self .update_properties_in_assets (
460- asset_ids = asset_ids ,
481+ asset_ids = cast ( List [ str ], resolved_asset_ids ) ,
461482 json_metadatas = json_metadatas ,
462483 )
463484
464485 @typechecked
465486 def set_metadata (
466487 self ,
467488 json_metadata : List [Dict [str , Union [str , int , float ]]],
468- asset_ids : List [str ],
469489 project_id : str ,
490+ asset_ids : Optional [List [str ]] = None ,
491+ external_ids : Optional [List [str ]] = None ,
470492 ) -> List [Dict [Literal ["id" ], str ]]:
471493 """Set metadata on assets, replacing any existing metadata.
472494
473495 Args:
474496 json_metadata: List of metadata dictionaries to set on each asset.
475497 Each dictionary contains key/value pairs to be set as the asset's metadata.
476- asset_ids: The asset IDs to modify.
477498 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).
478501
479502 Returns:
480503 A list of dictionaries with the asset ids.
@@ -485,21 +508,39 @@ def set_metadata(
485508 {"key1": "value1", "key2": "value2"},
486509 {"key3": "value3"}
487510 ],
488- asset_ids=["ckg22d81r0jrg0885unmuswj8", "ckg22d81s0jrh0885pdxfd03n"],
489511 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"]
490523 )
491524 """
492525 if is_empty_list_with_warning ("set_metadata" , "json_metadata" , json_metadata ):
493526 return []
494527
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+
495533 assets = self .kili_api_gateway .list_assets (
496534 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 ),
498538 ),
499539 ["id" , "jsonMetadata" ],
500540 QueryOptions (disable_tqdm = True ),
501541 )
502542
543+ resolved_asset_ids = []
503544 json_metadatas = []
504545 for i , asset in enumerate (assets ):
505546 current_metadata = asset .get ("jsonMetadata" , {}) if asset .get ("jsonMetadata" ) else {}
@@ -513,9 +554,10 @@ def set_metadata(
513554 preserved_metadata .update (new_metadata )
514555
515556 json_metadatas .append (preserved_metadata )
557+ resolved_asset_ids .append (asset ["id" ])
516558
517559 return self .update_properties_in_assets (
518- asset_ids = asset_ids ,
560+ asset_ids = cast ( List [ str ], resolved_asset_ids ) ,
519561 json_metadatas = json_metadatas ,
520562 )
521563
0 commit comments