text: # Licensed to the Apache Software Foundation (ASF) under one
  # or more contributor license agreements.  See the NOTICE file
  # distributed with this work for additional information
  # regarding copyright ownership.  The ASF licenses this file
  # to you under the Apache License, Version 2.0 (the
  # "License"); you may not use this file except in compliance
  # with the License.  You may obtain a copy of the License at
  #
  #   http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing,
  # software distributed under the License is distributed on an
  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  # KIND, either express or implied.  See the License for the
  # specific language governing permissions and limitations
  # under the License.
  # isort:skip_file
  
  import json
  import logging
  from typing import Iterator, Tuple
  
  import yaml
  from werkzeug.utils import secure_filename
  
  from superset.charts.commands.exceptions import ChartNotFoundError
  from superset.charts.dao import ChartDAO
  from superset.datasets.commands.export import ExportDatasetsCommand
  from superset.commands.export import ExportModelsCommand
  from superset.models.slice import Slice
  from superset.utils.dict_import_export import EXPORT_VERSION
  
  logger = logging.getLogger(__name__)
  
  
  # keys present in the standard export that are not needed
  REMOVE_KEYS = ["datasource_type", "datasource_name", "query_context"]
  
  
  class ExportChartsCommand(ExportModelsCommand):
  
      dao = ChartDAO
      not_found = ChartNotFoundError
  
      @staticmethod
      def _export(model: Slice) -> Iterator[Tuple[str, str]]:
          chart_slug = secure_filename(model.slice_name)
          file_name = f"charts/{chart_slug}_{model.id}.yaml"
  
          payload = model.export_to_dict(
              recursive=False,
              include_parent_ref=False,
              include_defaults=True,
              export_uuids=True,
          )
          # TODO (betodealmeida): move this logic to export_to_dict once this
          #  becomes the default export endpoint
          payload = {
              key: value for key, value in payload.items() if key not in REMOVE_KEYS
          }
  
          if payload.get("params"):
              try:
                  payload["params"] = json.loads(payload["params"])
              except json.decoder.JSONDecodeError:
                  logger.info("Unable to decode `params` field: %s", payload["params"])
  
          payload["version"] = EXPORT_VERSION
          if model.table:
              payload["dataset_uuid"] = str(model.table.uuid)
  
          file_content = yaml.safe_dump(payload, sort_keys=False)
          yield file_name, file_content
  
          if model.table:
              yield from ExportDatasetsCommand([model.table.id]).run()
  