def _get_available_placements(D, tt):
    """
    Called from: _prompt_placement()

    Get a list of possible places that we can put the new model data into.
    If no model exists yet, we'll use something like chron0model0. If other models exist,
    we'll go for the n+1 entry.
    ex: chron0model0 already exists, so we'll look to chron0model1 next.

    :param dict D: Metadata
    :param str tt: Table Type
    :return list _options: Possible placements
    """
    _options = []

    try:
        for _pc in ["paleoData", "chronData"]:
            if _pc in D:
                # for each entry in pc
                for section_name, section_data in D[_pc].items():
                    # looking for open spots for measurement tables
                    if tt == "measurement":
                        if "measurementTable" in section_data:
                            _options.append(_get_available_placements_1(section_data["measurementTable"], section_name, "measurement"))


                    # looking for open spots for model tables
                    else:
                        # Is there a model? Need model data to keep going
                        if "model" in section_data:
                            #  this is for adding a whole model (all 4 tables, ens/dist/sum/method)
                            if tt == "model":
                                _options.append(_get_available_placements_1(section_data["model"], section_name, "model"))
                            else:

                                # for adding individual model tables
                                for _k, _v in section_data["model"]:
                                    # keys here are stored as "<type>Table", so add "Table" to each table type
                                    _tt_table = "{}Table".format(tt)
                                    # does this table exist?
                                    if _tt_table in _v:
                                        # Get the first available position for this section
                                        _options.append(
                                            _get_available_placements_1(_v[_tt_table], _k, tt))
                                    else:
                                        # Doesn't currently exist. Make the first option index 0.
                                        _options.append("{}{}0".format(_k, tt))

                        # no models present, so we automatically default placement options to the 0 index.
                        else:
                            if tt == "model":
                                # adding a whole model, so no need to be specific
                                _options.append("{}model0".format(section_name))
                            else:
                                # adding a specific table, so the position is more specific also
                                _options.append("{}model0{}0".format(section_name, tt))


    except Exception as e:
        sys.exit("Looking for open table positions: Unable to find placement options, {}".format(e))

    # remove empty names
    _options = [i for i in _options if i]
    # Is the whole list empty? that's not good.
    if not _options:
        sys.exit("Error: No available positions found to place new data. Something went wrong.")
    return _options
Called from: _prompt_placement()

    Get a list of possible places that we can put the new model data into.
    If no model exists yet, we'll use something like chron0model0. If other models exist,
    we'll go for the n+1 entry.
    ex: chron0model0 already exists, so we'll look to chron0model1 next.

    :param dict D: Metadata
    :param str tt: Table Type
    :return list _options: Possible placements