Source code for stactools.core.add

"""Add items to catalogs."""

import os

from pystac import Catalog, Collection, Item
from pystac.layout import BestPracticesLayoutStrategy
from stactools.core.copy import move_assets as do_move_assets


[docs] def add_item( source_item: Item, target_catalog: Catalog, move_assets: bool = False ) -> None: """Adds an item to a catalog. Args: source_item (pystac.Item): The Item that will be added. This item is not mutated in this operation. target_catalog (pystac.Catalog): The destination catalog. This catalog will be mutated in this operation. move_assets (bool): If true, move the asset files alongside the target item. """ target_item_ids = [item.id for item in target_catalog.get_items(recursive=True)] if source_item.id in target_item_ids: raise ValueError( f"An item with ID {source_item.id} already exists in the target catalog" ) self_href = target_catalog.get_self_href() if self_href: parent_dir = os.path.dirname(self_href) layout_strategy = BestPracticesLayoutStrategy() item_copy = source_item.clone() item_copy.set_self_href(layout_strategy.get_item_href(item_copy, parent_dir)) target_catalog.add_item(item_copy) if isinstance(target_catalog, Collection): item_copy.set_collection(target_catalog) target_catalog.update_extent_from_items() else: item_copy.set_collection(None) if move_assets: do_move_assets(item_copy, copy=False) else: raise ValueError( f"Cannot add Item {source_item.id} because {target_catalog} does " "not have a self href." )