class Category(db.Model): id = db.Column(db.Integer, primary_key=True) category_name = db.Column(db.String(200)) slug_category = db.Column(db.String(200)) posts = db.relationship('Post', backref='category', lazy='dynamic') def __repr__(self): return '<Category %r>' % (self.category_name)
class Creater(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), index=True,unique=True) extras = db.Column(db.String(128)) recipes = db.relationship('Recipe', backref='writer', lazy='dynamic') def __repr__(self): return '<Creater {}>'.format(self.name)
class Post(db.Model): id = db.Column(db.Integer, primary_key=True) image = db.Column(db.String(200)) title = db.Column(db.String(350)) slug_title = db.Column(db.String(350)) anons = db.Column(db.String(600)) article = db.Column(db.Text) pub_date = db.Column(db.DateTime) category_id = db.Column(db.Integer, db.ForeignKey('category.id')) def __repr__(self): return '<Post %r>' % (self.title)
class Recipe(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(64), index=True) genre = db.Column(db.String(64), index=True) date = db.Column(db.Date) people = db.Column(db.Integer) cost = db.Column(db.Integer) recommend = db.Column(db.Integer) comment = db.Column(db.String(256)) creater_id = db.Column(db.Integer, db.ForeignKey('creater.id')) def __repr__(self): return '<Book {}>'.format(self.title)
class PasswordResetToken(db.Model): __tablename__ = 'password_reset_tokens' id = db.Column( db.Integer, primary_key = True ) token = db.Column( db.String(64), unique = True, index = True, server_default = str(uuid4) ) user_id = db.Column( db.Integer, db.ForeignKey('users.id'), nullable = False ) expire_at = db.Column(db.DateTime, default=datetime.now) create_at = db.Column(db.DateTime, default=datetime.now) update_at = db.Column(db.DateTime, default=datetime.now) def __init__(self, token, user_id, expire_at): self.token = token self.user_id = user_id self.expire_at = expire_at @classmethod def publish_token(cls, user): token = str(uuid4()) new_token = cls( token, user.id, datetime.now() + timedelta(days = 1) ) db.session.add(new_token) return token @classmethod def get_user_id_by_token(cls, token): now = datetime.now() record = cls.query.filter_by(token=str(token)).filter(cls.expire_at > now).first() if record: return record.user_id else: return None @classmethod def delete_token(cls, token): cls.query.filter_by(token=str(token)).delete()
class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column( db.Integer, primary_key = True ) username = db.Column( db.String(64), index = True ) email = db.Column( db.String(64), unique = True, index = True ) password = db.Column( db.String(128), default = generate_password_hash('JOUhou1u0kK089u0') ) picture_path = db.Column(db.Text) is_active = db.Column( db.Boolean, unique = False, default = False, ) create_at = db.Column( db.DateTime, default = datetime.now, ) update_at = db.Column( db.DateTime, default = datetime.now, ) def __init__(self, username, email): self.username = username self.email = email @classmethod def select_user_by_email(cls, email): return cls.query.filter_by(email=email).first() def validate_password(self, password): return check_password_hash(self.password, password) def create_new_user(self): db.session.add(self) @classmethod def select_user_by_id(cls, id): return cls.query.get(id) def save_new_password(self, new_password): self.password = generate_password_hash(new_password) self.is_active = True @classmethod def search_by_name(cls, username, page=1): user_connect1 = aliased(UserConnect)# from_user_id: sarching ID, to_user_id: use login user's ID to connect UserConnect user_connect2 = aliased(UserConnect)# to_user_id: sarching ID, from_user_id: use login user's ID to connect UserConnect return cls.query.filter( cls.username.like(f'%{username}%'), cls.id != int(current_user.get_id()), cls.is_active == True ).outerjoin( user_connect1, and_( user_connect1.from_user_id == cls.id, user_connect1.to_user_id == current_user.get_id() ) ).outerjoin( user_connect2, and_( user_connect2.from_user_id == current_user.get_id(), user_connect2.to_user_id == cls.id ) ).with_entities( cls.id, cls.username, cls.picture_path, user_connect1.status.label("joined_status_to_from"), user_connect2.status.label("joined_status_from_to"), ).order_by(cls.username).paginate( page, 50, False, ) @classmethod def select_friends(cls): return cls.query.join( UserConnect, or_( and_( UserConnect.to_user_id == cls.id, UserConnect.from_user_id == current_user.get_id(), UserConnect.status == 2 ), and_( UserConnect.from_user_id == cls.id, UserConnect.to_user_id == current_user.get_id(), UserConnect.status == 2 ) ) ).with_entities( cls.id, cls.username, cls.picture_path ).all() @classmethod def select_requested_friends(cls): return cls.query.join( UserConnect, and_( UserConnect.from_user_id == cls.id, UserConnect.to_user_id == current_user.get_id(), UserConnect.status == 1, ) ).with_entities( cls.id, cls.username, cls.picture_path ).all() @classmethod def select_requesting_friends(cls): return cls.query.join( UserConnect, and_( UserConnect.from_user_id == current_user.get_id(), UserConnect.to_user_id == cls.id, UserConnect.status == 1 ) ).with_entities( cls.id, cls.username, cls.picture_path, ).all() @classmethod def create_ones_memories(cls): meory = aliased(Memory) return cls.query.join( Memory, and_( Memory.user_id == cls.id ) ).all()