def _apply_default_values(catalog, default_values):
    """Aplica valores default a los campos de un catálogo.

    Si el campo está vacío, aplica el default. Si tiene un valor, deja el valor
    que estaba. Sólo soporta defaults para las siguientes clases:
        catalog
        dataset
        distribution
        field

    Args:
        catalog (dict): Un catálogo.
        default_values (dict): Valores default para algunos de los campos del
            catálogo.
            {
                "dataset_issued": "2017-06-22",
                "distribution_issued": "2017-06-22"
            }
    """

    for field, default_value in iteritems(default_values):
        class_metadata = field.split("_")[0]
        field_json_path = field.split("_")[1:]

        # valores default de catálogo
        if class_metadata == "catalog":
            _set_default_value(catalog, field_json_path, default_value)

        # valores default de dataset
        elif class_metadata == "dataset":
            for dataset in catalog["dataset"]:
                _set_default_value(dataset, field_json_path, default_value)

        # valores default de distribución
        elif class_metadata == "distribution":
            for dataset in catalog["dataset"]:
                for distribution in dataset["distribution"]:
                    _set_default_value(
                        distribution, field_json_path, default_value)

        # valores default de field
        elif class_metadata == "field":
            for dataset in catalog["dataset"]:
                for distribution in dataset["distribution"]:

                    # campo "field" en una "distribution" no es obligatorio
                    if distribution.get("field"):
                        for field in distribution["field"]:
                            _set_default_value(
                                field, field_json_path, default_value)