Skip to content

Instantly share code, notes, and snippets.

@longfin
Created April 12, 2012 05:28
Show Gist options
  • Save longfin/2364767 to your computer and use it in GitHub Desktop.
Save longfin/2364767 to your computer and use it in GitHub Desktop.
Poly*MixIn
class _Comparator(Comparator):
def operate(self, op, other):
discriminator, id = list(self.__clause_element__())
return expr.and_(op(discriminator, other.__class__.__name__),
op(id, other.id))
def in_(self, others):
return expr.or_(*[self == o for o in others])
def __clause_element__(self):
cls = Comparator.__clause_element__(self)
return expr.ClauseList(getattr(cls, "{0}_discriminator" \
.format(self._prefix)),
getattr(cls, "{0}_id" \
.format(self._prefix)))
class _CreatorComparator(_Comparator):
_prefix = "creator"
class _ReceiverComparator(_Comparator):
_prefix = "receiver"
class PolyCreatorMixIn(object):
creator_discriminator = db.Column(db.String(50), nullable=False)
creator_id = db.Column(db.Integer, index=True, nullable=False)
@hybrid_property
def creator(self):
return getattr(self, "%s_creator" % self.creator_discriminator)
@creator.setter
def creator(self, creator):
self.creator_discriminator = creator.__tablename__
setattr(self, "%s_creator" % self.creator_discriminator, creator)
@creator.comparator
def comparator(cls):
return _CreatorComparator(cls)
class PolyReceiverMixIn(object):
receiver_discriminator = db.Column(db.String(50), nullable=False)
receiver_id = db.Column(db.Integer, index=True, nullable=False)
@hybrid_property
def receiver(self):
return getattr(self, "%s_receiver" % self.receiver_discriminator)
@receiver.setter
def receiver(self, receiver):
self.receiver_discriminator = receiver.__tablename__
setattr(self, "%s_receiver" % self.receiver_discriminator, receiver)
@receiver.comparator
def comparator(cls):
return _ReceiverComparator(cls)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment