from app import db, login_manager from datetime import datetime from flask_login import (LoginManager, UserMixin, login_required, login_user, current_user, logout_user) from werkzeug.security import generate_password_hash, check_password_hash class Category(db.Model): __tablename__ = 'categories' id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.String(255), nullable=False) slug = db.Column(db.String(255), nullable=False) created_on = db.Column(db.DateTime(), default=datetime.utcnow) posts = db.relationship('Post', backref='category') def __repr__(self): return "<{}:{}>".format(id, self.name) class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer(), primary_key=True) title = db.Column(db.String(255), nullable=False) slug = db.Column(db.String(255), nullable=False) content = db.Column(db.Text(), nullable=False) created_on = db.Column(db.DateTime(), default=datetime.utcnow) updated_on = db.Column(db.DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow) category_id = db.Column(db.Integer(), db.ForeignKey('categories.id')) def __repr__(self): return "<{}:{}>".format(self.id, self.title[:10]) post_tags = db.Table('post_tags', db.Column('post_id', db.Integer, db.ForeignKey('posts.id')), db.Column('tag_id', db.Integer, db.ForeignKey('tags.id')) ) class Tag(db.Model): __tablename__ = 'tags' id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.String(255), nullable=False) slug = db.Column(db.String(255), nullable=False) created_on = db.Column(db.DateTime(), default=datetime.utcnow) posts = db.relationship('Post', secondary=post_tags, backref='tags') def __repr__(self): return "<{}:{}>".format(id, self.name) class Feedback(db.Model): __tablename__ = 'feedbacks' id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.String(1000), nullable=False) email = db.Column(db.String(100), nullable=False) message = db.Column(db.Text(), nullable=False) created_on = db.Column(db.DateTime(), default=datetime.utcnow) def __repr__(self): return "<{}:{}>".format(self.id, self.name) class User(db.Model, UserMixin): __tablename__ = 'users' id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.String(100)) username = db.Column(db.String(50), nullable=False, unique=True) email = db.Column(db.String(100), nullable=False, unique=True) password_hash = db.Column(db.String(100), nullable=False) created_on = db.Column(db.DateTime(), default=datetime.utcnow) updated_on = db.Column(db.DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow) def __repr__(self): return "<{}:{}>".format(self.id, self.username) def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password) @login_manager.user_loader def load_user(user_id): return db.session.query(User).get(user_id)