class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(60)) body = db.Column(db.Text) timestamp = db.Column(db.DateTime, default=datetime.utcnow) can_comment = db.Column(db.Boolean, default=True) category_id = db.Column(db.Integer, db.ForeignKey('category.id')) author_id = db.Column(db.Integer, db.ForeignKey('users.id')) category = db.relationship('Category', back_populates='posts') author = db.relationship('User', back_populates='posts') comments = db.relationship('Comment', back_populates='post', cascade='all')
class Role(db.Model): __tablename__ = 'roles' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) users = db.relationship('User', backref='role', lazy='dynamic') default = db.Column(db.Boolean, default=False, index=True) permissions = db.Column(db.Integer) def __repr__(self): return '<Role %r>' % self.name @staticmethod def insert_roles(): roles = { 'User': (Permission.COMMENT, True), 'Editor': (Permission.COMMENT | Permission.POST, False), 'Admin': (0xff, False) } for r in roles: role = Role.query.filter_by(name=r).first() if role is None: role = Role(name=r) role.permissions = roles[r][0] role.default = roles[r][1] db.session.add(role) db.session.commit()
class Comment(db.Model): id = db.Column(db.Integer, primary_key=True) author = db.Column(db.String(30)) body = db.Column(db.Text) from_author = db.Column(db.Boolean, default=False) from_admin = db.Column(db.Boolean, default=False) reviewed = db.Column(db.Boolean, default=False) timestamp = db.Column(db.DateTime, default=datetime.utcnow) replied_id = db.Column(db.Integer, db.ForeignKey('comment.id')) replied = db.relationship('Comment', back_populates='replies', remote_side=[id]) replies = db.relationship('Comment', back_populates='replied', cascade='all') post_id = db.Column(db.Integer, db.ForeignKey('posts.id')) post = db.relationship('Post', back_populates='comments')
class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, index=True) role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) email = db.Column(db.String(64), unique=True, index=True) password_hash = db.Column(db.String(128)) member_since = db.Column(db.DateTime(), default=datetime.utcnow()) last_seen = db.Column(db.DateTime(), default=datetime.utcnow()) confirmed = db.Column(db.Boolean, default=False) # board = db.relationship('Board',backref='author',lazy = 'dynamic') posts = db.relationship('Post', back_populates='author') def __init__(self, **kwargs): super(User, self).__init__(**kwargs) self.role = Role.query.filter_by(default=True).first() def can(self, permissions): return self.role is not None and (self.role.permissions & permissions) == permissions def ping(self): self.last_seen = datetime.utcnow() db.session.add(self) def is_administrator(self): return self.can(Permission.ADMIN) def gravatar(self, size=100, default='identicon', rating='g'): url = 'https://secure.gravatar.com/avatar' hash = hashlib.md5(self.email.encode('utf-8')).hexdigest() return '{url}/{hash}?s={size}&d={default}&r={rating}'.format( url=url, hash=hash, size=size, default=default, rating=rating) def generate_confirmation_token(self, expiration=3600): s = Serializer(current_app.config['SECRET_KEY'], expiration) return s.dumps({'confirm': self.id}).decode('utf-8') def confirm(self, token): s = Serializer(current_app.config['SECRET_KEY']) try: data = s.loads(token.encode('utf-8')) except: return False if data.get('confirm') != self.id: return False self.confirmed = True db.session.add(self) return True @property def password(self): raise AttributeError('password is not a readable attribute') @password.setter def password(self, password): self.password_hash = generate_password_hash(password) def verify_password(self, password): return check_password_hash(self.password_hash, password) def __repr__(self): return '<User %r>' % self.username @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id))
class Category(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(30), unique=True) posts = db.relationship('Post', back_populates='category')