Source code for pystac.serialization.common_properties

from pystac import Collection
from pystac.utils import make_absolute_href
from pystac.stac_io import STAC_IO
from pystac.serialization.identify import STACVersionID


[docs]def merge_common_properties(item_dict, collection_cache=None, json_href=None): """Merges Collection properties into an Item. Args: item_dict (dict): JSON dict of the Item which properties should be merged into. collection_cache (CollectionCache): Optional CollectionCache that will be used to read and write cached collections. json_href: The HREF of the file that this JSON comes from. Used to resolve relative paths. Returns: bool: True if Collection properties have been merged, otherwise False. """ properties_merged = False collection = None collection_id = None collection_href = None stac_version = item_dict.get('stac_version') # The commons extension was removed in 1.0.0-beta.1, so if this is an earlier STAC # item we don't have to bother with merging. if stac_version is not None and STACVersionID(stac_version) > '0.9.0': return False # Check to see if this is a 0.9.0 item that # doesn't extend the commons extension, in which case # we don't have to merge. if stac_version is not None and stac_version == '0.9.0': stac_extensions = item_dict.get('stac_extensions') if type(stac_extensions) is list: if 'commons' not in stac_extensions: return False else: return False # Try the cache if we have a collection ID. if 'collection' in item_dict: collection_id = item_dict['collection'] if collection_cache is not None: collection = collection_cache.get_by_id(collection_id) # Next, try the collection link. if collection is None: links = item_dict['links'] # Account for 0.5 links, which were dicts if isinstance(links, dict): links = list(links.values()) collection_link = next((link for link in links if link['rel'] == 'collection'), None) if collection_link is not None: collection_href = collection_link['href'] if json_href is not None: collection_href = make_absolute_href(collection_href, json_href) if collection_cache is not None: collection = collection_cache.get_by_href(collection_href) if collection is None: collection = STAC_IO.read_json(collection_href) if collection is not None: collection_id = None collection_props = None if isinstance(collection, Collection): collection_id = collection.id collection_props = collection.properties elif type(collection) is dict: collection_id = collection['id'] if 'properties' in collection: collection_props = collection['properties'] else: raise ValueError('{} is expected to be a Collection or ' 'dict but is neither.'.format(collection)) if collection_props is not None: for k in collection_props: if k not in item_dict['properties']: properties_merged = True item_dict['properties'][k] = collection_props[k] if collection_cache is not None and not collection_cache.contains_id(collection_id): collection_cache.cache(collection, href=collection_href) return properties_merged