def externalize(libobject: JSON, key_callback: Optional[Set[str]] = None) -> List[CachedObject]: """Converts an oparl object with embedded objects to multiple flat json objects""" externalized = [] # sorted copies, thereby avoiding modification while iterating for key in sorted(libobject.keys()): # Skip the geojson object if key == "geojson": continue entry = libobject[key] if isinstance(entry, dict): if "id" not in entry: logger.warning( f"Embedded object '{key}' in {libobject['id']} does not have an id, skipping: {entry}" ) del libobject[key] continue if isinstance(key_callback, set): key_callback.add(key) entry["mst:backref"] = libobject["id"] externalized += externalize(entry) libobject[key] = entry["id"] if isinstance(entry, list) and len(entry) > 0 and isinstance( entry[0], dict): if isinstance(key_callback, set): key_callback.add(key) for pos, entry in enumerate(entry): if "id" not in entry: logger.warning( f"Embedded object '{key}' in {libobject['id']} does not have an id, skipping: {entry}" ) del libobject[key] break entry["mst:backref"] = libobject["id"] entry[ "mst:backrefPosition"] = pos # We need this for agenda items externalized += externalize(entry) libobject[key][pos] = entry["id"] externalized.append( CachedObject( url=libobject["id"], data=libobject, oparl_type=libobject["type"].split("/")[-1], )) return externalized
def externalize(libobject: JSON, key_callback: Optional[Set[str]] = None) -> List[CachedObject]: """ Converts an oparl object with embedded objects to multiple flat json objeczs """ externalized = [] for key in libobject.keys(): # Skip the geojson object if key == "geojson": continue entry = libobject[key] if isinstance(entry, dict): if isinstance(key_callback, set): key_callback.add(key) entry["mst:backref"] = libobject["id"] externalized += externalize(entry) libobject[key] = entry["id"] if isinstance(entry, list) and len(entry) > 0 and isinstance( entry[0], dict): if isinstance(key_callback, set): key_callback.add(key) for pos, entry in enumerate(entry): entry["mst:backref"] = libobject["id"] entry[ "mst:backrefPosition"] = pos # We need this for agenda items externalized += externalize(entry) libobject[key][pos] = entry["id"] externalized.append( CachedObject( url=libobject["id"], data=libobject, oparl_type=libobject["type"].split("/")[-1], )) return externalized