def migrate_dashboard()

in superset/migrations/shared/native_filters.py [0:0]


def migrate_dashboard(dashboard: Dashboard) -> None:  # noqa: C901
    """
    Convert the dashboard to use native filters.

    :param dashboard: The dashboard to convert
    """

    # Mapping between the CHART- and MARKDOWN- IDs.
    mapping = {}

    try:
        json_metadata = json.loads(dashboard.json_metadata or "{}")
        position_json = json.loads(dashboard.position_json or "{}")

        filter_boxes_by_id = {
            slc.id: slc for slc in dashboard.slices if slc.viz_type == "filter_box"
        }

        # Convert the legacy filter configurations to native filters.
        native_filter_configuration = json_metadata.setdefault(
            "native_filter_configuration",
            [],
        )

        native_filter_configuration.extend(
            convert_filter_scopes_to_native_filters(
                json_metadata,
                position_json,
                filter_boxes=list(filter_boxes_by_id.values()),
            ),
        )

        # Remove the legacy filter configuration.
        for key in ["default_filters", "filter_scopes"]:
            json_metadata.pop(key, None)

        # Replace the filter-box charts with markdown elements.
        for key, value in list(position_json.items()):  # Immutable iteration
            if (
                isinstance(value, dict)
                and value["type"] == "CHART"
                and (meta := value.get("meta"))
                and meta["chartId"] in filter_boxes_by_id
            ):
                slc = filter_boxes_by_id[meta["chartId"]]
                mapping[key] = key.replace("CHART-", "MARKDOWN-")

                value["id"] = mapping[key]
                value["type"] = "MARKDOWN"

                meta["code"] = dedent(
                    f"""
                        &#9888; The <a href="/superset/slice/{slc.id}/">{slc.slice_name}
                        </a> filter-box chart has been migrated to a native filter.
                        """
                )

                position_json[mapping[key]] = value
                del position_json[key]

        # Replace the relevant CHART- references.
        for value in position_json.values():
            if isinstance(value, dict):
                for relation in ["children", "parents"]:
                    if relation in value:
                        for idx, key in enumerate(value[relation]):
                            if key in mapping:
                                value[relation][idx] = mapping[key]

        # Remove the filter-box charts from the dashboard/slice mapping.
        dashboard.slices = [
            slc for slc in dashboard.slices if slc.viz_type != "filter_box"
        ]

        dashboard.json_metadata = json.dumps(json_metadata)
        dashboard.position_json = json.dumps(position_json)
    except Exception:  # pylint: disable=broad-except
        print(f"Unable to upgrade {str(dashboard)}")