def has_been_published(self):
        """
        Return True if the item is either published itself, or has an
        associated published copy.

        This is in contrast to ``is_published`` which only returns True if
        the specific object is a published copy, and will return False for
        a draft object that has an associated published copy.
        """
        if self.is_published:
            return True
        elif self.is_draft:
            return self.publishing_linked_id is not None
        raise ValueError(  # pragma: no cover
            "Publishable object %r is neither draft nor published" % self)