class_docstr: BaseNotifier class for sending notifications.
class_docstr_tok: ["BaseNotifier","class","for","sending","notifications","."]
docstr: Send a notification.
  
  :param context: The airflow context
docstr_tok: ["Send","a","notification",".",":","param","context",":","The","airflow","context"]
code: def __call__(self, *args) -> None:
      """
      Send a notification.
  
      :param context: The airflow context
      """
      # Currently, there are two ways a callback is invoked
      # 1. callback(context) - for on_*_callbacks
      # 2. callback(dag, task_list, blocking_task_list, slas, blocking_tis) - for sla_miss_callback
      # we have to distinguish between the two calls so that we can prepare the correct context,
      if len(args) == 1:
          context = args[0]
      else:
          context = {
              "dag": args[0],
              "task_list": args[1],
              "blocking_task_list": args[2],
              "slas": args[3],
              "blocking_tis": args[4],
          }
      self._update_context(context)
      self.render_template_fields(context)
      try:
          self.notify(context)
      except Exception as e:
          self.log.exception("Failed to send notification: %s", e)
  
file_path: airflow/airflow/notifications/basenotifier.py
imports: from __future__ import annotations
  from abc import abstractmethod
  from typing import TYPE_CHECKING, Sequence
  from airflow.template.templater import Templater
  from airflow.utils.context import context_merge
label_desc: Use image node_id 6 for calling the BaseNotifier obj's underlying member method code with example usage: obj.__call__() without return types