docs: def get_roles(self, principal, object=None, no_group_roles=False):
          """Get all the roles attached to given `principal`, on a given
          `object`.
  
          :param principal: a :class:`User` or :class:`Group`
  
          :param object: an :class:`Entity`
  
          :param no_group_roles: If `True`, return only direct roles, not roles
          acquired through group membership.
          """
          assert principal
          if hasattr(principal, "is_anonymous") and principal.is_anonymous:
              return [AnonymousRole]
  
          query = db.session.query(RoleAssignment.role)
          if isinstance(principal, Group):
              filter_principal = RoleAssignment.group == principal
          else:
              filter_principal = RoleAssignment.user == principal
              if not no_group_roles:
                  groups = [g.id for g in principal.groups]
                  if groups:
                      filter_principal |= RoleAssignment.group_id.in_(groups)
  
          query = query.filter(filter_principal)
  
          if object is not None:
              assert isinstance(object, Entity)
  
          query = query.filter(RoleAssignment.object == object)
          roles = {i[0] for i in query.all()}
  
          if object is not None:
              for attr, role in (("creator", Creator), ("owner", Owner)):
                  if getattr(object, attr) == principal:
                      roles.add(role)
          return list(roles)