Source code for stactools.core.layout

import os

from pystac import Catalog
from pystac.layout import TemplateLayoutStrategy
from stactools.core import move_all_assets


[docs] def layout_catalog( catalog: Catalog, item_path_template: str, create_subcatalogs: bool = False, remove_existing_subcatalogs: bool = False, move_assets: bool = False, ) -> Catalog: """Modifies the layout of a STAC. Given a catalog and a layout template, modifies the layout of the STAC to either generate subcatalogs based on item properties, or create subdirectories to organize item properties. Both of these are based on the template string provided. See the ``LayoutTemplate`` PySTAC API docs for more information on template strings. Args: catalog (pystac.Catalog or pystac.Collection): The Catalog or Collection to change the layout of. item_path_template (str): A string that represents a path of item properties, e.g. ``"${year}/${month}"`` create_subcatalogs (bool): If True, create subcatalogs for each of the template directory levels using the item properties to determine which catalog it belongs to. remove_existing_subcatalogs (bool): If True, apply the subcatalogs to all items throughout the catalog and clear any child catalogs, using the newly generated subcatalogs or item paths. move_assets (bool): If True, the assets of the Items will be moved alongside of the Items. Otherwise the asset will remain in place, with the moved Item's asset HREFs reflecting the existing location. Returns: pystac.Catalog or pystac.Collection: The passed in Catalog or Collection. This operation mutates the catalog or collection. """ if remove_existing_subcatalogs: items = catalog.get_items(recursive=True) for item in items: parent = item.get_parent() assert parent is not None parent.remove_item(item.id) catalog.add_item(item) catalog.clear_children() if create_subcatalogs: catalog.generate_subcatalogs(template=item_path_template) catalog.normalize_hrefs(os.path.dirname(catalog.self_href)) else: strategy = TemplateLayoutStrategy(item_template=item_path_template) catalog.normalize_hrefs(os.path.dirname(catalog.self_href), strategy=strategy) if move_assets: move_all_assets(catalog, ignore_conflicts=True) return catalog