class Activity(db.Model): __tablename__ = "activities" id = db.Column(db.Integer(), primary_key=True) created_at = db.Column(db.DateTime, default=datetime.datetime.now(), nullable=False) updated_at = db.Column(db.DateTime, onupdate=datetime.datetime.now(), nullable=True) start_time = db.Column(db.DateTime, nullable=False) end_time = db.Column(db.DateTime, nullable=False) address = db.Column(db.String(200), nullable=False) title = db.Column(db.String(100), nullable=False) count = db.Column(db.Integer(), default=20, nullable=False) content = db.Column(db.String(255), nullable=True) user_id = db.Column(db.Integer, db.ForeignKey("users.id")) user = db.relationship("User", backref=db.backref("c_activities", lazy='dynamic'), lazy='joined') group_id = db.Column(db.Integer, db.ForeignKey("groups.id")) group = db.relationship("Group", backref=db.backref("activities", lazy='dynamic'), lazy='joined') users = db.relationship("User", secondary=activity_users, backref=db.backref("activities", lazy='dynamic'), lazy='dynamic') likes = db.relationship("User", secondary=activity_like, backref=db.backref("likes", lazy='dynamic'), lazy='dynamic') def save(self): db.session.add(self) db.session.commit() return self def delete(self): db.session.delete(self) db.session.commit() def print_start_time(self): return self.start_time.strftime('%Y-%m-%d %H:%M') def print_end_time(self): return self.end_time.strftime('%Y-%m-%d %H:%M')
class Category(db.Model): __tablename__ = "categories" id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.String(50), nullable=False) def save(self): db.session.add(self) db.session.commit() return self def delete(self): db.session.delete(self) db.session.commit()
class Message(db.Model): __tablename__ = "messages" id = db.Column(db.Integer(), primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey("users.id")) user = db.relationship("User", backref=db.backref("messages", lazy='dynamic'), lazy='joined') content = db.Column(db.String(50), nullable=False) def save(self): db.session.add(self) db.session.commit() return self def delete(self): db.session.delete(self) db.session.commit()
class Like(db.Model): __tablename__ = "like" id = db.Column(db.Integer(), primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey("users.id")) user = db.relationship("User", backref=db.backref("likes", lazy='dynamic'), lazy='joined') activity_id = db.Column(db.Integer, db.ForeignKey("activities.id")) activity = db.relationship("Activity", backref=db.backref("likes", lazy='dynamic'), lazy='joined') def save(self): db.session.add(self) db.session.commit() return self def delete(self): db.session.delete(self) db.session.commit()
class Group(db.Model): __tablename__ = "groups" id = db.Column(db.Integer(), primary_key=True) created_at = db.Column(db.DateTime, default=datetime.datetime.now(), nullable=False) updated_at = db.Column(db.DateTime, onupdate=datetime.datetime.now(), nullable=True) active = db.Column(db.Boolean, default=False, nullable=False) name = db.Column(db.String(40), unique=True, nullable=False) description = db.Column(db.String(200), nullable=True) logo = db.Column(db.String(200), nullable=False) #banner = db.Column(db.String(200), nullable=False) set_logo = db.Column(db.Boolean, default=False, nullable=False) category_id = db.Column(db.Integer, db.ForeignKey("categories.id")) category = db.relationship("Category", backref=db.backref("groups", lazy='dynamic'), lazy='joined') creator_id = db.Column(db.Integer(), db.ForeignKey('users.id')) creator = db.relationship("User", backref=db.backref('owned_group', uselist=False, lazy='joined'), lazy='joined') members = db.relationship( "User", secondary=groups_members, primaryjoin=id == groups_members.c.group_id, secondaryjoin= "and_(groups_members.c.user_id == User.id, groups_members.c.verify==True)", backref=db.backref("groups", lazy='dynamic'), lazy='dynamic') unverify_members = db.relationship( "User", secondary=groups_members, primaryjoin=id == groups_members.c.group_id, secondaryjoin= "and_(groups_members.c.user_id == User.id, groups_members.c.verify==False)", lazy='dynamic') """ 设置随机小组图标 """ def set_logo_auto(self): files = [ x for x in os.listdir(DefaultConfig.LOCAL_GROUPLOGO_DIR) if os.path.isfile( os.path.join(DefaultConfig.LOCAL_GROUPLOGO_DIR, x)) ] self.logo = random.choice(files) """ 创建小组 """ def save(self): db.session.add(self) db.session.commit() return self """加入成员""" def join(self, user_id): u = update(groups_members).where( groups_members.c.group_id == self.id).where( groups_members.c.user_id == user_id).values(verify=True) engine = create_engine(DefaultConfig.SQLALCHEMY_DATABASE_URI) connection = engine.connect() connection.execute(u) connection.close() """删除成员""" def delete(self, user_id): groups_members.delete(groups_members.c.group_id == self.id, groups_members.c.user_id == user_id) """ 序列化 """ @property def serialize(self): return {'id': self.id, 'private': self.private, 'name': self.name}
from zoo.extensions import db import datetime groups_members = db.Table( 'groups_members', db.Column('user_id', db.Integer(), db.ForeignKey('users.id')), db.Column('group_id', db.Integer(), db.ForeignKey('groups.id')), db.Column('verify', db.Boolean, default=False, nullable=False)) user_followers = db.Table( 'followers', db.Column('follower_id', db.Integer(), db.ForeignKey('users.id')), db.Column('followed_id', db.Integer(), db.ForeignKey('users.id'))) activity_users = db.Table( 'activity_users', db.Column('activity_id', db.Integer(), db.ForeignKey('activities.id')), db.Column('user_id', db.Integer(), db.ForeignKey('users.id'))) activity_like = db.Table( 'likes', db.Column('activity_id', db.Integer(), db.ForeignKey('activities.id')), db.Column('user_id', db.Integer(), db.ForeignKey('users.id')))
class User(db.Model, UserMixin): __tablename__ = "users" id = db.Column(db.Integer(), primary_key=True) created_at = db.Column(db.DateTime, default=datetime.datetime.now(), nullable=False) updated_at = db.Column(db.DateTime, onupdate=datetime.datetime.now(), nullable=True) username = db.Column(db.String(32), unique=True, nullable=False) email = db.Column(db.String(200), unique=True, nullable=False) avatar = db.Column(db.String(200), nullable=False) set_avatar = db.Column(db.Boolean, default=False, nullable=False) #description = db.Column(db.String(255),nullable=True) _password = db.Column('password', db.String(160), nullable=False) role = db.Column(db.Integer(), default=3, nullable=False) new_followers = db.Column(db.Integer(), default=0, nullable=False) last_check_follower = db.Column(db.DateTime, default=datetime.datetime.now(), nullable=False) followed = db.relationship( 'User', secondary=user_followers, primaryjoin=(id == user_followers.c.follower_id), secondaryjoin=(id == user_followers.c.followed_id), backref=db.backref('followers', lazy='dynamic'), lazy='dynamic') rank = db.Column(db.Integer(), default=0) @hybrid_property def password(self): return self._password @password.setter def password(self, password): if not password: return self._password = generate_password_hash(password) def check_password(self, password): if self.password is None: return False return check_password_hash(self.password, password) """ 随机获得系统头像 """ def set_avatar_auto(self): files = [ x for x in os.listdir(DefaultConfig.LOCAL_AVATAR_DIR) if os.path.isfile(os.path.join(DefaultConfig.LOCAL_AVATAR_DIR, x)) ] self.avatar = random.choice(files) @classmethod def authenticate(cls, login, password, role): user = cls.query.filter( db.or_(User.username == login, User.email == login)).first() if user: authenticated = user.check_password(password) else: authenticated = False return user, authenticated """ 创建用户 """ def save(self): db.session.add(self) db.session.commit() return self """ 获得用户小组""" def get_groups(self): return self.groups.all() """ 关注用户 """ def follow(self, user): if not self.is_following(user): self.followed.append(user) user.new_followers += 1 user.save() return self """ 取消关注用户 """ def unfollow(self, user): if self.is_following(user): link = db.session.query(user_followers).filter( user_followers.c.followed_id == user.id, user_followers.c.follower_id == self.id).one() print(link.created_at) #判断是否为新增粉丝,如果是则用户新增粉丝数-1 if link.created_at > user.last_check_follower: user.new_followers -= 1 self.followed.remove(user) user.save() return self """ 是否关注用户 """ def is_following(self, user): return self.followed.filter( user_followers.c.followed_id == user.id).count() > 0 # """ 获取用户所有消息 """ # def get_messages(self): # messages = self.messages.all() # return messages # """ 获取未阅读消息分类片段(用于页头消息提醒显示) """ # def get_brief_messages(self): # messages = self.messages.filter(Message.readed == False).all() # return messages """ 检查粉丝 """ def check_follower(self): self.last_check_follower = datetime.datetime.now() self.new_followers = 0 self.save()