class LeaveMessage(CRUDMixin, db.Model): id = sqla.Column(sqla.Integer, primary_key=True) create_time = db.Column(sqla.DateTime, default=datetime.utcnow) content = db.Column(sqla.String(length=1000)) user_id = db.Column(sqla.Integer, db.ForeignKey(USER_TABLE_USER_ID)) user = db.relationship('User', backref=db.backref('leave_messages'))
class Favor(CRUDMixin, db.Model): id = sqla.Column(sqla.Integer, primary_key=True) create_time = db.Column(sqla.DateTime, default=datetime.utcnow) user_id = db.Column(sqla.Integer, db.ForeignKey(USER_TABLE_USER_ID)) user = db.relationship('User', backref=db.backref('favors')) # 喜爱对象id obj_id = db.Column(sqla.Integer, db.ForeignKey('book.id')) # 喜爱对象类型 obj_type = db.Column( sqla.Enum('book', 'courseware', 'onlinecourse', name='like_obj_type')) __table_args__ = (UniqueConstraint('user_id', 'obj_id', 'obj_type', name='_user_favor_obj'), ) @property def favor_model(self): from youjiao.teach_material.models import Book, Courseware from youjiao.onlinecourse.models import OnlineCourse if self.obj_type == 'book': return Book if self.obj_type == 'courseware': return OnlineCourse if self.obj_type == 'onlinecourse': return OnlineCourse else: return None @property def real_obj(self): model = self.favor_model return model.query.get(self.obj_id)
class Activity(CRUDMixin, CreateUpdateTimeMixin, db.Model): id = db.Column(sqla.Integer, primary_key=True) # create_time = db.Column(sqla.DateTime, default=datetime.utcnow) # update_time = db.Column(sqla.DateTime, onupdate=datetime.utcnow) title = db.Column(db.String(255)) origin = db.Column(db.String(255), default='') html = db.Column(db.Text) # status = db.Column(sqla.Boolean, default=False) publish = db.Column(sqla.Boolean, default=False) category = db.Column(sqla.Enum('policy', 'news', 'events', 'research', 'activity', 'achievement', name='category'), default='policy') user_id = db.Column(db.Integer, db.ForeignKey(USER_TABLE_USER_ID)) user = db.relationship('User') @classmethod def weekly_popular_top10(cls): return cls.query.limit(10).all() @property def link(self): return url_for('activity_content.activity_view', id=self.id) @property def edit_link(self): redirect_url = url_for('activity_content.activity_view', id=self.id) return '/admin/activity/edit?url={}&id={}'.format( redirect_url, self.id)
class Comment(CRUDMixin, db.Model): id = sqla.Column(sqla.Integer, primary_key=True) create_time = db.Column(sqla.DateTime, default=datetime.utcnow) user_id = db.Column(sqla.Integer, db.ForeignKey(USER_TABLE_USER_ID)) user = db.relationship('User', backref=db.backref('comments')) # 评论对象id comment_obj_id = db.Column(sqla.Integer) # 评论对象类型 comment_obj_type = db.Column( sqla.Enum('book', 'courseware', name='comment_obj_type')) content = db.Column(sqla.String(140))
class Album(db.Model, CRUDMixin): id = sqla.Column(sqla.Integer, primary_key=True) create_time = sqla.Column(sqla.DateTime, default=datetime.utcnow) name = sqla.Column(sqla.String(200)) photos = db.relationship('Photo', backref='album') @property def cover(self): # import ipdb; ipdb.set_trace() if len(self.photos) != 0: return self.photos[0].thumbnail return '/static/image/icons/61Logo.png' def __repr__(self): return u'<Album: {}>'.format(self.name)
class UserProfile(db.Model, CRUDMixin): id = db.Column(sqla.Integer, primary_key=True) user_id = db.Column(sqla.Integer, db.ForeignKey(USER_TABLE_USER_ID)) user = db.relationship('User', backref=db.backref('profile', uselist=False)) # TODO: add column describe/description nickname = db.Column(sqla.String(16), unique=True) work_place_name = db.Column(sqla.String(255)) avatar_qiniu_key = db.Column(sqla.String(200), default='default_avatar.png') birthday = db.Column(sqla.Date) gender = db.Column(sqla.Enum('male', 'female', name='gender')) career = db.Column(sqla.String(16)) province = db.Column(sqla.String(16)) city = db.Column(sqla.String(16)) district = db.Column(sqla.String(16)) street = db.Column(sqla.String(16)) @property def location(self): return '{} {} {} {}'.format(self.province, self.city, self.district, self.street)
class User(db.Model, UserMixin, CRUDMixin): __tablename__ = USER_TABLE_NAME id = sqla.Column(sqla.Integer, primary_key=True) name = db.Column(sqla.String(50), unique=True) email = db.Column(sqla.String(50), unique=True) password = db.Column(sqla.String(200)) phone_number = db.Column(sqla.String(16), unique=True) active = db.Column(sqla.Boolean, default=True) # is_admin = db.Column(db.Boolean, default=False) # TODO: use a base model to add create_time and update_time create_time = db.Column(sqla.DateTime, default=datetime.utcnow) last_login = db.Column(sqla.DateTime) # TODO: add login log field, and add field update in login view roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='dynamic')) # profile = db.relationship('UserProfile', backref='user', uselist=False) # from youjiao.user_util.models import Comment, Favor # comments = db.relationship('Comment', backref='user') # favors = db.relationship('Favor', backref='user') def __repr__(self): return '<User {}>'.format(self.name) @classmethod def create_user(cls, name, email, password): password = encrypt_password(password) user = User() user.name = name user.email = email user.password = password user.save() return user @classmethod def verify(cls, email_or_name, password): user = cls.query.filter((User.email==email_or_name)|(User.name==email_or_name)).first() if not user: return None if not user.verify_and_update_password(password): return None return user def set_password(self, new_password): self.password = encrypt_password(new_password) self.save() def verify_password(self, password): return verify_password(password, self.password) def verify_and_update_password(self, password): """used in login user""" signed = get_hmac(password).decode('ascii') verified, new_password = password_context.verify_and_update(signed, self.password) if verified and new_password: self.password = new_password self.save() return verified @property def roles_name(self): return [role.name for role in self.roles] def favor(self, obj_type): from youjiao.user_util.models import Favor pass @property def book_visit_recent_key(self): return 'user_{}_book_visit_list'.format(self.id) @property def courseware_visit_recent_key(self): return 'user_{}_courseware_visit_list'.format(self.id) @property def onlinecourse_visit_recent_key(self): return 'user_{}_onlinecourse_visit_list'.format(self.id) @property def book_visit_recent(self): from youjiao.teach_material.models import Book book_id_list = redis_cli.lrange(self.book_visit_recent_key, 0, 8) return Book.query.filter(Book.id.in_(book_id_list)) @property def courseware_visit_recent(self): from youjiao.teach_material.models import Courseware courseware = redis_cli.lrange(self.courseware_visit_recent_key, 0, 8) return Courseware.query.filter(Courseware.id.in_(courseware)) @property def onlinecourse_visit_recent(self): from youjiao.onlinecourse.models import OnlineCourse onlinecourse_id_list = redis_cli.lrange(self.onlinecourse_visit_recent_key, 0, 8) return OnlineCourse.query.filter(OnlineCourse.id.in_(onlinecourse_id_list)) @property def can_view_vip_content(self): return vip_permission.can()
class VIP(db.Model, CRUDMixin): id = db.Column(sqla.Integer, primary_key=True) user_id = db.Column(sqla.Integer, db.ForeignKey(USER_TABLE_USER_ID)) user = db.relationship('User', backref=db.backref('vips')) begin = db.Column(sqla.Date) end = db.Column(sqla.Date)