class Comment(db.Model): id = db.Column(db.Integer, primary_key=True) post_id = db.Column(db.Integer, db.ForeignKey('post.id')) ## Only stored if the user unchecked the anonymous option user = db.Column(db.Integer, db.ForeignKey('user.id')) message = db.Column(db.Text) timestamp = db.Column(db.DateTime) upvotes = db.Column(db.Integer) downvotes = db.Column(db.Integer) parent_id = db.Column(db.Integer, db.ForeignKey('comment.id')) replies = db.relationship('Comment', backref=db.backref('parent', remote_side=[id]), lazy='dynamic') @hybrid_property def hn_score(self): s = self.upvotes - self.downvotes item_hour_age = (datetime.datetime.now() - self.timestamp).total_seconds() / 3600.0 return (s - 1) / (item_hour_age + 2)**1.8 @hn_score.expression def hn_score(cls): s = cls.upvotes - cls.downvotes item_hour_age = -1 * func.date_part( 'epoch', func.age(cls.timestamp, func.current_timestamp())) / 3600 return (s - 1) / func.power((item_hour_age + 2), 1.8)
class Post(db.Model): __tablename__ = 'post' id = db.Column(db.Integer, primary_key=True) message = db.Column(db.Text) timestamp = db.Column(db.DateTime) upvotes = db.Column(db.Integer) downvotes = db.Column(db.Integer) # Functional ways to calculate 'hotness' @hybrid_property def reddit_score(self): s = self.upvotes - self.downvotes order = func.log(10, func.greatest(func.abs(s), 1)) sign = func.sign(s) seconds = func.date_part('epoch', self.timestamp) - 1134028003 return func.round(func.cast(sign * order + seconds / 45000, Numeric), 7) @hybrid_property def hn_score(self): s = self.upvotes - self.downvotes item_hour_age = (datetime.datetime.now() - self.timestamp).total_seconds() / 3600.0 return (s - 1) / (item_hour_age + 2)**1.8 @hn_score.expression def hn_score(cls): s = cls.upvotes - cls.downvotes item_hour_age = -1 * func.date_part( 'epoch', func.age(cls.timestamp, func.current_timestamp())) / 3600 return (s - 1) / func.power((item_hour_age + 2), 1.8) @hybrid_property def top(self): return self.upvotes - self.downvotes
class RateLimit(db.Model): ip = db.Column(db.String(16), primary_key=True) last_request = db.Column(db.DateTime)
class Vote(db.Model): id = db.Column(db.Integer, primary_key=True) post_id = db.Column(db.Integer, db.ForeignKey('post.id')) user = db.Column(db.Integer, db.ForeignKey('user.id')) value = db.Column(db.Integer)
class CommentVote(db.Model): id = db.Column(db.Integer, primary_key=True) comment_id = db.Column(db.Integer, db.ForeignKey('comment.id')) user = db.Column(db.Integer, db.ForeignKey('user.id')) value = db.Column(db.Integer)
class User(db.Model): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(255)) name = db.Column(db.String(255)) last_post = db.Column(db.DateTime)
class FacebookPost(db.Model): id = db.Column(db.Integer, primary_key=True) post_id = db.Column(db.Integer, db.ForeignKey('post.id'))