class Message(db.Model): id = db.Column(db.Integer, primary_key=True) sender_id = db.Column(db.Integer, db.ForeignKey('user.id')) recipient_id = db.Column(db.Integer, db.ForeignKey('user.id')) body = db.Column(db.String(140)) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) def __repr__(self): return '<Message {}>'.format(self.body)
class Notification(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(128), index=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) timestamp = db.Column(db.Float, index=True, default=time) payload_json = db.Column(db.Text) def get_data(self): return json.loads(str(self.payload_json))
class Post(SearchableMixin, db.Model): __searchable__ = ['body'] # dunder field tells sqlalchemy not to add field to database id = db.Column(db.Integer, primary_key=True) body = db.Column(db.String(140)) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) # passing a function user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # uses relationship language = db.Column(db.String(5)) # five chars for language identification def __repr__(self): return f"<Post {self.body}, belongs to {self.user_id}>" @staticmethod def get_posts(filter_attr=None, filter_arg=None): posts = None if filter_attr is None: # get all posts posts = Post.query.all() elif filter_attr == 'user_id': # filter by username posts = Post.query.filter_by(user_id=filter_arg).all() elif filter_attr == 'timestamp': posts = Post.query.filter_by(timestamp=filter_arg).all() return posts
@classmethod def reindex(cls): for obj in cls.query: add_to_index(cls.__tablename__, obj) # db signal handling for text search db.event.listen(db.session, 'before_commit', SearchableMixin.before_commit) db.event.listen(db.session, 'after_commit', SearchableMixin.after_commit) # strong entity followers = db.Table( 'followers', db.Column('follower_id', db.Integer, db.ForeignKey('user.id')), db.Column('followed_id', db.Integer, db.ForeignKey('user.id')) ) class User(UserMixin, db.Model): # UserMixin makes model compatible with flask-login id = db.Column(db.Integer, primary_key=True) # flask login writes User.id to session username = db.Column(db.String(64), index=True, unique=True) email = db.Column(db.String(120), index=True, unique=True) password_hash = db.Column(db.String(128)) posts = db.relationship('Post', backref='author', lazy='dynamic') about_me = db.Column(db.String(140)) last_visited = db.Column(db.DateTime, default=datetime.utcnow()) followed = db.relationship( 'User', secondary=followers,