code: def blocks(self):
      json_path = self._get_path("blocks")
      block_specs = nested_get(self, json_path)
      blocks = []
      for bspec in block_specs:
          cls = block_mapping.get(bspec["type"], UnknownBlock)
          if cls is UnknownBlock:
              termwarn(
                  inspect.cleandoc(
                      f"""
                          UNKNOWN BLOCK DETECTED
                              This can happen if we have added new blocks, but you are using an older version of the SDK.
                              If your report is loading normally, you can safely ignore this message (but we recommend not touching UnknownBlock)
                              If you think this is an error, please file a bug report including your SDK version ({wandb_ver}) and this spec ({bspec})
                          """
                  )
              )
          if cls is WeaveBlock:
              for cls in weave_blocks:
                  try:
                      cls.from_json(bspec)
                  except Exception:
                      pass
                  else:
                      break
          blocks.append(cls.from_json(bspec))
      return blocks[1:-1]
  
imports: import base64
  import inspect
  import json
  import re
  import urllib
  from copy import deepcopy
  from typing import List
  from ...None import __version__
  from ...None import termlog, termwarn
  from ...sdk.lib import ipython
  from ..public import Api
  from ..public import RetryingClient
  from ._blocks import P, PanelGrid, UnknownBlock, WeaveBlock, block_mapping, weave_blocks
  from .mutations import UPSERT_VIEW, VIEW_REPORT
  from .runset import Runset
  from .util import Attr, Base, Block, coalesce, generate_name, nested_get, nested_set
  from .validators import OneOf, TypeValidator
label_desc: Use image node_id 4 for calling the Report obj's underlying member method code with example usage: obj.blocks() and returns: blocks