class Comment(db.Model): __tablename__ = 'comments' body = db.Column(db.Text, nullable=False) post_id = db.Column(db.Integer, db.ForeignKey('posts.id'), nullable=False, index=True) post = db.relationship('Post', backref=db.backref('comments', lazy=True)) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False, index=True) user = db.relationship('User', backref=db.backref('comments', lazy=True)) def __repr__(self): return '<Comment {body}>'.format(body=self.body[:20]) @property def author_name(self): return self.user.username @property def html_body(self): return Markup(linkify(escape(self.body)))
class Page(db.Model, CMSModel): __tablename__ = 'pages' title = db.Column(db.String, nullable=False) slug = db.Column(db.String, unique=True, nullable=False, index=True) body = db.Column(db.Text, nullable=False) def __init__(self, *args, **kwargs): if not kwargs.get('slug'): kwargs['slug'] = self.slugify(kwargs.get('title', '')) super(Page, self).__init__(*args, **kwargs) def __repr__(self): return '<Page {title}>'.format(title=self.title)
class Tag(db.Model): __tablename__ = 'tags' name = db.Column(db.String, nullable=False, index=True, unique=True) slug = db.Column(db.String, nullable=False, index=True, unique=True) posts = db.relationship('Post', secondary=posts_tags, back_populates='tags', lazy=True) def __init__(self, *args, **kwargs): if not kwargs.get('slug'): kwargs['slug'] = slugify(kwargs.get('name', '')) super(Tag, self).__init__(*args, **kwargs) def __repr__(self): return '<Tag {name}>'.format(name=self.name)
class Image(db.Model): __tablename__ = 'images' name = db.Column(db.String, nullable=False, index=True) image = db.Column(db.LargeBinary, nullable=False) mimetype = db.Column(db.String, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) user = db.relationship('User', backref=db.backref('images', lazy=True)) def __repr__(self): return '<Image {name}>'.format(name=self.name) @property def url(self): return '/images/{id}/{name}'.format( id=self.id, name=quote(self.name, safe=''))
class User(db.Model, UserMixin): __tablename__ = 'users' username = db.Column(db.String, unique=True, nullable=False, index=True) user_type = db.Column(db.String, nullable=False, default='commenter') password_hash = db.Column(db.String, nullable=False) USER_LEVELS = ['admin', 'user', 'commenter'] def __init__(self, *args, **kwargs): if 'password' in kwargs: kwargs['password_hash'] = bcrypt.generate_password_hash( kwargs['password']) del kwargs['password'] super(User, self).__init__(*args, **kwargs) def __repr__(self): return '<User {username}>'.format(username=self.username) def set_password(self, password): self.password_hash = bcrypt.generate_password_hash(password) def valid_password(self, password): return bcrypt.check_password_hash(self.password_hash, password) def authorized_for(self, user_type): for level in self.USER_LEVELS: if level == self.user_type: return True if level == user_type: return False @property def is_admin(self): return self.user_type == 'admin' @property def can_post(self): return self.authorized_for('user') def can_edit(self, user): return self.id == user.id or user.is_admin
class Post(db.Model, CMSModel): __tablename__ = 'posts' title = db.Column(db.String, nullable=False) slug = db.Column(db.String, unique=True, nullable=False, index=True) body = db.Column(db.Text, nullable=False) published_at = db.Column(db.DateTime, index=True) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False, index=True) user = db.relationship('User', backref=db.backref('posts', lazy=True)) tags = db.relationship('Tag', secondary=posts_tags, back_populates='posts', lazy=True) def __init__(self, *args, **kwargs): if not kwargs.get('slug'): kwargs['slug'] = self.slugify(kwargs.get('title')) super(Post, self).__init__(*args, **kwargs) def __repr__(self): return '<Post {title}>'.format(title=self.title) @property def author_name(self): return self.user.username @property def tag_names(self): return ', '.join([tag.name for tag in self.tags]) @hybrid_property def published(self): return self.published_at and self.published_at <= datetime.utcnow() def can_edit(self, user): if not user.is_authenticated: return False return user.is_admin or self.user_id == user.id
from sarabande import db posts_tags = db.Table( 'posts_tags', db.Model.metadata, db.Column('post_id', db.Integer, db.ForeignKey('posts.id'), nullable=False, index=True), db.Column('tag_id', db.Integer, db.ForeignKey('tags.id'), nullable=False, index=True))