docs: def should_set_tablename(cls):
      """Determine whether ``__tablename__`` should be automatically generated
      for a model.
  
      * If no class in the MRO sets a name, one should be generated.
      * If a declared attr is found, it should be used instead.
      * If a name is found, it should be used if the class is a mixin, otherwise
        one should be generated.
      * Abstract models should not have one generated.
  
      Later, :meth:`._BoundDeclarativeMeta.__table_cls__` will determine if the
      model looks like single or joined-table inheritance. If no primary key is
      found, the name will be unset.
      """
      if (
          cls.__dict__.get('__abstract__', False)
          or not any(isinstance(b, DeclarativeMeta) for b in cls.__mro__[1:])
      ):
          return False
  
      for base in cls.__mro__:
          if '__tablename__' not in base.__dict__:
              continue
  
          if isinstance(base.__dict__['__tablename__'], declared_attr):
              return False
  
          return not (
              base is cls
              or base.__dict__.get('__abstract__', False)
              or not isinstance(base, DeclarativeMeta)
          )
  
      return True