code: def listing_searchable_text(instance):
      
      # get all snapshots
      snapshots = get_snapshots(instance)
      # extract all snapshot values, because we are not interested in the
      # fieldnames (keys)
      values = map(lambda s: s.values(), snapshots)
      # prepare a set of unified catalog data
      catalog_data = set()
      # values to skip
      skip_values = ["None", "true", "True", "false", "False"]
      # internal uid -> title cache
      uid_title_cache = {}
  
      # helper function to recursively unpack the snapshot values
      def append(value):
          if isinstance(value, (list, tuple)):
              map(append, value)
          elif isinstance(value, (dict)):
              map(append, value.items())
          elif isinstance(value, basestring):
              # convert unicode to UTF8
              if isinstance(value, unicode):
                  value = api.safe_unicode(value).encode("utf8")
              # skip single short values
              if len(value) < 2:
                  return
              # flush non meaningful values
              if value in skip_values:
                  return
              # flush ISO dates
              if re.match(DATE_RX, value):
                  return
              # fetch the title
              if re.match(UID_RX, value):
                  if value in uid_title_cache:
                      value = uid_title_cache[value]
                  else:
                      title_or_id = get_title_or_id_from_uid(value)
                      uid_title_cache[value] = title_or_id
                      value = title_or_id
              catalog_data.add(value)
  
      # extract all meaningful values
      for value in itertools.chain(values):
          append(value)
  
      return " ".join(catalog_data)
docs: Fulltext search for the audit metadata