class_docstr: Sends a slack notification for a report recipient
code: def send(self) -> None:
      files = self._get_inline_files()
      title = self._content.name
      channel = self._get_channel()
      body = self._get_body()
      file_type = "csv" if self._content.csv else "png"
      global_logs_context = getattr(g, "logs_context", {}) or {}
      try:
          token = app.config["SLACK_API_TOKEN"]
          if callable(token):
              token = token()
          client = WebClient(
              token=token, proxy=app.config["SLACK_PROXY"]
          )
          # files_upload returns SlackResponse as we run it in sync mode.
          if files:
              for file in files:
                  client.files_upload(
                      channels=channel,
                      file=file,
                      initial_comment=body,
                      title=title,
                      filetype=file_type,
                  )
          else:
              client.chat_postMessage(channel=channel, text=body)
          logger.info(
              "Report sent to slack",
              extra={
                  "execution_id": global_logs_context.get(
                      "execution_id"
                  ),
              },
          )
      except (
          BotUserAccessError,
          SlackRequestError,
          SlackClientConfigurationError,
      ) as ex:
          raise NotificationParamException(str(ex)) from ex
      except SlackObjectFormationError as ex:
          raise NotificationMalformedException(str(ex)) from ex
      except SlackTokenRotationError as ex:
          raise NotificationAuthorizationException(str(ex)) from ex
      except (SlackClientNotConnectedError, SlackApiError) as ex:
          raise NotificationUnprocessableException(str(ex)) from ex
      except SlackClientError as ex:
          # this is the base class for all slack client errors
          # keep it last so that it doesn't interfere with @backoff
          raise NotificationUnprocessableException(str(ex)) from ex
  
imports: import json
  import logging
  from collections.abc import Sequence
  from io import IOBase
  from typing import Union
  import backoff
  import pandas
  from flask import g
  from flask_babel import gettext
  from slack_sdk import WebClient
  from slack_sdk.errors import BotUserAccessError, SlackApiError, SlackClientConfigurationError, SlackClientError, SlackClientNotConnectedError, SlackObjectFormationError, SlackRequestError, SlackTokenRotationError
  from superset import app
  from superset.reports.models import ReportRecipientType
  from superset.reports.notifications.base import BaseNotification
  from superset.reports.notifications.exceptions import NotificationAuthorizationException, NotificationMalformedException, NotificationParamException, NotificationUnprocessableException
  from superset.utils.core import get_email_address_list
  from superset.utils.decorators import statsd_gauge
label_desc: Use image node_id 6 for calling the SlackNotification obj's underlying member method code with example usage: obj.send() without return types