Created
April 12, 2012 05:28
-
-
Save longfin/2364767 to your computer and use it in GitHub Desktop.
Poly*MixIn
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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