class BlockInterval(SurrogatePK, Model): """ Model for all blockchain block intervals. """ __tablename__ = 'block_interval' # TODO: add unique blockchain_id + timestamp restraint id = Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True) blockchain_id = Column(db.Integer, db.ForeignKey('blockchain.id'), unique=False, nullable=False) time_start = Column(db.Integer, nullable=False) time_stop = Column(db.Integer, nullable=False) block_start = Column(db.Integer, nullable=False, default=0) block_stop = Column(db.Integer, nullable=False, default=0) blockchain = relationship('Blockchain', back_populates='block_intervals', lazy='joined') metrics = relationship('Metric', back_populates='block_interval', lazy='joined') def __repr__(self): return '<BlockInterval({id})>'.format(id=self.id)
class ReviewLike(SurrogatePK, Model): """ Model for review likes (helpful/not helpful). """ __tablename__ = 'review_like' __table_args__ = (db.UniqueConstraint('user_id', 'review_id', 'helpful'), ) # Columns id = Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True) dapp_id = Column(db.Integer, db.ForeignKey('dapp.id'), unique=False, nullable=False) user_id = Column(db.Integer, db.ForeignKey('dappest_user.id'), unique=False, nullable=False) review_id = Column(db.Integer, db.ForeignKey('review.id'), unique=False, nullable=False) helpful = Column(db.SmallInteger, unique=False, nullable=False) created_at = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow) user = relationship('User', back_populates='review_likes', lazy='select') def __repr__(self): return '<ReviewLike()>'
class Ranking(SurrogatePK, Model): """ Model for all dapp rankings. """ __tablename__ = 'ranking' id = Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True) dapp_id = Column(db.Integer, db.ForeignKey('dapp.id'), unique=False, nullable=False) block_interval_id = Column(db.Integer, db.ForeignKey('block_interval.id'), unique=False, nullable=False) ranking_name_id = Column(db.SmallInteger, db.ForeignKey('ranking_name.id'), unique=False, nullable=False) rank = Column(db.SmallInteger, unique=False, nullable=False) ranking_name = relationship('RankingName', back_populates='ranking', lazy='joined') def __repr__(self): return '<Ranking({id})>'.format(id=self.id)
class Metric(SurrogatePK, Model): """ Model for all dapp metrics. """ __tablename__ = 'metric' id = Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True) dapp_id = Column(db.Integer, db.ForeignKey('dapp.id'), unique=False, nullable=False) block_interval_id = Column(db.Integer, db.ForeignKey('block_interval.id'), unique=False, nullable=False) data = Column(JSONB, unique=False, nullable=False) block_interval = relationship('BlockInterval', back_populates='metrics', lazy='select') def __repr__(self): return '<Metric({name})>'.format(name=self.name)
class Review(SurrogatePK, Model): """ Model for all dapp reviews. """ __tablename__ = 'review' # Columns id = Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True) dapp_id = Column(db.Integer, db.ForeignKey('dapp.id'), nullable=False) user_id = Column(db.Integer, db.ForeignKey('dappest_user.id'), nullable=False) rating = Column(db.SmallInteger, unique=False, nullable=False) title = Column(db.String(50), unique=False, nullable=False) review = Column(db.Text, unique=False, nullable=False) feature = Column(JSONB, unique=False, nullable=False, default={}) uploaded_at = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow) data = Column(JSONB, unique=False, nullable=False, default={}) verified = Column(db.Boolean, unique=False, nullable=False, default=False) dapp = relationship('Dapp', back_populates='reviews', lazy='select') user = relationship('User', back_populates='reviews', lazy='joined') helpful_votes = relationship( 'ReviewLike', primaryjoin='and_(Review.id==ReviewLike.review_id, ' 'ReviewLike.helpful==1)') # not_helpful_votes = relationship('ReviewLike', # primaryjoin='and_(Review.id==ReviewLike.review_id, ' # 'ReviewLike.helpful==0)') def __repr__(self): return '<Review({id})>'.format(id=self.id)
class RankingName(SurrogatePK, Model): """ Model for all ranking names. """ __tablename__ = 'ranking_name' id = Column(db.SmallInteger, unique=True, nullable=False, primary_key=True, autoincrement=True) name = Column(db.String(32), unique=True, nullable=False) ranking = relationship('Ranking', back_populates='ranking_name', lazy='noload') def __repr__(self): return '<RankingName({name})>'.format(name=self.name)
class Blockchain(SurrogatePK, Model): """ Model for blockchains. """ __tablename__ = 'blockchain' # Columns id = Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True) name = Column(db.String(32), unique=True, nullable=False) symbol = Column(db.String(16), unique=True, nullable=False) # Relationships to other tables dapps = relationship('Dapp', back_populates='blockchain', lazy='noload') users = relationship('User', back_populates='blockchain', lazy='noload') block_intervals = relationship('BlockInterval', back_populates='blockchain', lazy='noload') def __repr__(self): return '<Blockchain({id})>'.format(id=self.symbol)
class Category(SurrogatePK, Model): """ Model for categories. """ __tablename__ = 'category' id = Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True) name = Column(db.String(32), unique=True, nullable=False) dapps = relationship('Dapp', back_populates='category', lazy='noload') def __repr__(self): return '<Category({name})>'.format(name=self.name)
class Dapp(SurrogatePK, Model): """ Model for all dapps. """ __tablename__ = 'dapp' # Columns id = Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True) name = Column(db.String(80), unique=True, nullable=False) url = Column(db.String(80), unique=True, nullable=False) address = Column(ARRAY(db.String), unique=True, nullable=False) author = Column(ARRAY(db.String), unique=False, nullable=False) email = Column(db.String(80), unique=False, nullable=False) logo_path = Column(db.String(100), unique=True, nullable=False) screenshot = Column(ARRAY(db.String), unique=True, nullable=False) tagline = Column(db.String(80), unique=False, nullable=False) description = Column(db.String(500), unique=False, nullable=False) whitepaper = Column(db.String(160), unique=False, nullable=True, default=None) social_media = Column(JSONB, unique=False, nullable=False, default={}) category_id = Column(db.Integer, db.ForeignKey('category.id'), nullable=False) blockchain_id = Column(db.Integer, db.ForeignKey('blockchain.id'), nullable=False) user_id = Column(db.Integer, db.ForeignKey('dappest_user.id'), nullable=False) s3_id = Column(UUID, unique=True, nullable=False) uploaded_at = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow) launch_date = Column(db.DateTime, nullable=False) # Relationships to other tables blockchain = relationship('Blockchain', back_populates='dapps', lazy='select') category = relationship('Category', back_populates='dapps', lazy='select') reviews = relationship('Review', back_populates='dapp', lazy='subquery') user = relationship('User', back_populates='dapps', lazy='select') @hybrid_property def logo_url(self): return join(current_app.config['S3_BUCKET_PATH'], self.logo_path) @hybrid_property def screenshot_url(self): return [ join(current_app.config['S3_BUCKET_PATH'], x) for x in self.screenshot ] def __repr__(self): return '<Dapp({name})>'.format(name=self.name)
class User(SurrogatePK, Model): """ Model for all users. """ __tablename__ = 'dappest_user' # Columns id = Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True) address = Column(db.String(64), unique=True, nullable=False) username = Column(db.String(64), unique=True, nullable=False, default=default_username) email = Column(db.String(64), unique=False, nullable=True, default=None) profile_picture = Column(db.String(100), unique=False, nullable=True, default=None) blockchain_id = Column(db.Integer, db.ForeignKey('blockchain.id'), nullable=False) s3_id = Column(UUID, unique=True, nullable=False, default=str(uuid4())) created_at = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow) nonce = Column(db.String(9), nullable=False, unique=False, default=generate_nonce) # Relationships to other tables blockchain = relationship('Blockchain', back_populates='users', lazy='noload') reviews = relationship('Review', back_populates='user', lazy='noload') review_likes = relationship('ReviewLike', back_populates='user', lazy='noload') dapps = relationship('Dapp', back_populates='user', lazy='noload') def __repr__(self): return '<User({username!r})>'.format(username=self.username) @staticmethod def get_user_from_jwt_token(user_from_token): """ Validate ideneity from jwt token. :param user_from_token: :return: """ user_id = user_from_token.get('id') user_address = user_from_token.get('address') if user_id and user_address: user = User.get_by_id(user_id) if user and user.id == user_id and user.address == user_address: return user return None