class_docstr: Trigger Task execution if an event happens in the system.
  
  Examples:
  
  - New model is published/tagged,
  - New Dataset is created,
  - General Task failed,
  - Task metric below/above threshold, alert every X minutes
class_docstr_tok: ["Trigger","Task","execution","if","an","event","happens","in","the","system",".","Examples",":","-","New","model","is","published\/tagged",",","-","New","Dataset","is","created",",","-","General","Task","failed",",","-","Task","metric","below\/above","threshold",",","alert","every","X","minutes"]
code: def _update_execution_plots(self):
      # type: () -> None
      if not self._task:
          return
  
      task_link_template = (
          self._task.get_output_log_web_page()
          .replace("/{}/".format(self._task.project), "/{project}/")
          .replace("/{}/".format(self._task.id), "/{task}/")
      )
  
      # plot the already executed Tasks
      executed_table = [
          ["trigger", "name", "task id", "started", "finished"]
      ]
      for executed_job in sorted(
          self._executed_triggers, key=lambda x: x.started, reverse=True
      ):
          if not executed_job.finished:
              if executed_job.task_id:
                  t = Task.get_task(task_id=executed_job.task_id)
                  if t.status not in ("in_progress", "queued"):
                      executed_job.finished = (
                          t.data.completed or datetime.utcnow()
                      )
              elif executed_job.thread_id:
                  # noinspection PyBroadException
                  try:
                      a_thread = [
                          t
                          for t in enumerate_threads()
                          if t.ident == executed_job.thread_id
                      ]
                      if not a_thread or not a_thread[0].is_alive():
                          executed_job.finished = datetime.utcnow()
                  except Exception:
                      pass
  
          executed_table += [
              [
                  executed_job.trigger,
                  executed_job.name,
                  '<a href="{}">{}</a>'.format(
                      task_link_template.format(
                          project="*", task=executed_job.task_id
                      ),
                      executed_job.task_id,
                  )
                  if executed_job.task_id
                  else "function",
                  str(executed_job.started).split(".", 1)[0],
                  str(executed_job.finished).split(".", 1)[0],
              ]
          ]
  
      # plot the schedule definition
      self._task.get_logger().report_table(
          title="Triggers Executed",
          series=" ",
          iteration=0,
          table_plot=executed_table,
      )
      self.__report_trigger_table(
          triggers=self._model_triggers, title="Model Triggers"
      )
      self.__report_trigger_table(
          triggers=self._dataset_triggers, title="Dataset Triggers"
      )
      self.__report_trigger_table(
          triggers=self._task_triggers, title="Task Triggers"
      )
  
imports: import json
  import logging
  from datetime import datetime
  from threading import enumerate
  from typing import List, Optional, Dict, Union, Callable
  from attr import attrs, attrib
  from .job import ClearmlJob
  from .scheduler import BaseScheduleJob, BaseScheduler, ExecutedJob
  from ..task import Task
  from ..backend_api.session.client import APIClient
  from ..backend_interface.util import datetime_to_isoformat, datetime_from_isoformat
label_desc: Use image node_id 15 for calling the TriggerScheduler obj's underlying member method code with example usage: obj._update_execution_plots() without return types