class BlogPost(db.Model): __tablename__ = 'posts' id = Column(Integer, primary_key=True) headline = Column(String(255), nullable=False) body = Column(Text) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) user_id = Column(Integer, ForeignKey('users.id')) category_id = db.Column(db.Integer, db.ForeignKey('category.id')) category = db.relationship('Category', backref=db.backref('posts', lazy='dynamic')) # many to many BlogPost<->Keyword tags = db.relationship('Tag', secondary=reltags, lazy='subquery', backref=db.backref('pages', lazy='dynamic')) comments = relationship('Comments', backref='posts', lazy='dynamic') # def __init__(self,headline,body,author): # self.author = author # self.headline = headline # self.body = body def __repr__(self): return "BlogPost(%r, %r, %r)" % (self.headline, self.body, self.author)
class Post(db.Model): __tablename__ = 'post' query_class = PostQuery id = db.Column(db.Integer, primary_key=True) post_content = db.Column(db.Text) post_title = db.Column(db.String(100)) post_name = db.Column(db.String(200), unique=True) post_create_time = db.Column(db.DateTime, default=datetime.utcnow) view_num = db.Column(db.Integer, default=0) comment_count = db.Column(db.Integer, default=0) status = db.Column(db.Integer, default=1) author_id = db.Column(db.Integer, default=1) post_modified_time = db.Column(db.DateTime, default=datetime.utcnow) category_id = db.Column(db.Integer, db.ForeignKey('category.id')) categorys = db.relationship('Category', backref=db.backref( 'posts', lazy='dynamic'), lazy='select') tags = db.relationship('Tag', secondary=article_tags, backref=db.backref('posts', lazy='dynamic')) tags_name = db.Column(db.Text) def __init__(self, *args, **kwargs): super(Post, self).__init__(*args, **kwargs) def __repr__(self): return '<post %r>' % self.post_title @cached_property def comments(self): from apps.comment.models import Comment allcomments = Comment.query.filter(Comment.post_id == self.id).all() return allcomments
class Rating(db.Model): id = db.Column(db.Integer,primary_key=True) lecture = db.relationship('Lecture', backref=db.backref('rating_lecture', cascade='all, delete-orphan', lazy='dynamic')) lecture_id = db.Column(db.Integer, db.ForeignKey(Lecture.id)) user = db.relationship('User', backref=db.backref('rating_user', cascade='all, delete-orphan', lazy='dynamic')) user_id = db.Column(db.Integer, db.ForeignKey(User.id)) total = db.Column(db.Integer, default =0) difficulty = db.Column(db.Integer, default =0) study_time = db.Column(db.Integer, default =0) attendance = db.Column(db.Integer, default =0) grade = db.Column(db.Integer, default =0) achievement = db.Column(db.Integer, default =0) opinion = db.Column(db.Text()) joinDATE = db.Column(db.DateTime(),default = get_current_time) def ev2(self): ev2 = self.difficulty /5 * 100 return ev2 def ev3(self): ev3 = self.study_time /5 * 100 return ev3 def ev4(self): ev4 = self.attendance /5 * 100 return ev4 def ev5(self): ev5 = self.grade /5 * 100 return ev5 def ev6(self): ev6 = self.achievement /5 * 100 return ev6
class R_Univ(db.Model): __tablename__ = 'r_univ' id = db.Column(db.Integer, primary_key=True) K_Univ_id = db.Column(db.Integer, db.ForeignKey('k_univ.univ_id')) k_univ = db.relationship('K_Univ', backref=db.backref('r_univ', cascade='all, delete-orphan', lazy='dynamic')) I_Univ_id = db.Column(db.Integer, db.ForeignKey('i_univ.univ_id')) i_univ = db.relationship('I_Univ', backref=db.backref('r_univ', cascade='all, delete-orphan', lazy='dynamic'))
class Article(db.Model): __tablename__ = 'article' __searchable__ = ['content', 'title'] __analyzer__ = ChineseAnalyzer() id = db.Column(db.Integer, primary_key=True, autoincrement=True) author = db.Column(db.String(32)) title = db.Column(db.String(32)) content = db.Column(db.Text) tag = db.relationship('Tag', secondary='article_to_tag', backref=db.backref('articles'), lazy='dynamic') classify_id = db.Column(db.INTEGER, db.ForeignKey('classify.id')) classify = db.relationship('Classify', backref=db.backref('articles'))
class File(db.Model): __tablename__ = 'file' id = db.Column(db.Integer, primary_key=True, autoincrement=True) filename = db.Column(db.String(80), nullable=False) upload_time = db.Column(db.DateTime, default=datetime.datetime.now) size = db.Column(db.Float) category_id = db.Column(db.Integer, db.ForeignKey('category.id')) sid = db.Column(db.String(10), db.ForeignKey('student.sid')) owner = db.relationship('Student', uselist=False, backref=db.backref('file')) def __init__(self, sid, filename, upload_time, size, category_id): self.sid = sid self.filename = filename self.upload_time = upload_time self.size = size self.category_id = category_id def __str__(self): return 'File(sid=%s, filename=%s, upload_time=%s, size=%s, category_id=%s)'\ % (self.sid, self.filename, self.upload_time, self.size, self.category_id) def __repr__(self): return str(self)
class ChatInfo(BaseModel, db.Model): __tablename__ = "s_chat_info" id = db.Column(db.Integer, primary_key=True) from_user_id = db.Column(db.Integer, db.ForeignKey("s_user_info.id")) chat_info = db.Column(db.Text) chat_user = db.relationship("ChatUserRelation", backref=db.backref("s_chat_info"))
class GroupInfo(BaseModel, db.Model): __tablename__ = "s_group_info" id = db.Column(db.Integer, primary_key=True) group_name = db.Column(db.String(30)) avatar = db.Column(db.String(100), nullable=True) group_user = db.relationship("GroupUserRelation", backref=db.backref("s_group_info"))
class UserGroup(BaseModel, db.Model): __tablename__ = "s_user_group" id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey("s_user_info.id")) group_name = db.Column(db.String(30)) group_friend = db.relationship("GroupFriend", backref=db.backref("s_user_group"))
class Comment(db.Model): id = db.Column(db.Integer, primary_key=True) article_id = db.Column(db.Integer, db.ForeignKey('article.id')) artlcle = db.relationship('Article', backref=db.backref('comments', cascade='all, delete-orphan', lazy='dynamic')) # Bidirection relationship ''' class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) name = Column(String) addresses = relationship("Address", backref="user") class Address(Base): __tablename__ = 'address' id = Column(Integer, primary_key=True) email = Column(String) user_id = Column(Integer, ForeignKey('user.id')) ''' author = db.Column(db.String(255)) email = db.Column(db.String(255)) password = db.Column(db.String(255)) content = db.Column(db.Text()) date_created = db.Column(db.DateTime(), default=db.func.now()) likecount = db.Column(db.Integer, default=0, nullable=False) commentcheck = db.Column(db.Integer, default=0, nullable=False)
class Process(db.Model): id_P = db.Column(db.Integer, primary_key=True) content = db.Column(db.Text()) #key = A_id = db.Column(db.Integer, db.ForeignKey('article.id')) article = db.relationship('Article', backref=db.backref('comments', cascade='all, delete-orphan', lazy='dynamic'))
class UserInfo(BaseModel, db.Model): __tablename__ = "s_user_info" id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(30), unique=True) phone = db.Column(db.String(30), unique=True) password_hash = db.Column(db.String(30)) avatar = db.Column(db.String(100), nullable=True) sign = db.Column(db.String(30), nullable=True) user_group = db.relationship("UserGroup", backref=db.backref("s_user_info")) group_friend = db.relationship("GroupFriend", backref=db.backref("s_user_info")) group_user = db.relationship("GroupUserRelation", backref=db.backref("s_user_info")) chat_info = db.relationship("ChatInfo", backref=db.backref("s_user_info")) chat_user = db.relationship("ChatUserRelation", backref=db.backref("s_user_info")) image = db.relationship("Image", backref=db.backref("s_user_info")) file = db.relationship("File", backref=db.backref("s_user_info")) @property def password(self): """对应password属性的读取操作""" raise AttributeError("不支持读取操作") @password.setter def password(self, value): """对应password属性的设置操作, value用户设置的密码值""" self.password_hash = generate_password_hash(value) def check_password(self, value): """检查用户密码, value 是用户填写密码""" return check_password_hash(self.password_hash, value)
class Language(db.Model): __tablename__ = 'language' id = db.Column(db.Integer, primary_key=True) language = db.Column(db.String(255), nullable=False) level = db.Column(db.Integer, nullable=False) user_id = db.Column(db.ForeignKey('user.id')) user_language = db.relationship('User', backref=db.backref( 'user_language', cascase='all, delete-orphan', lazy='dynamic'))
class Comment(db.Model): id = db.Column(db.Integer, primary_key=True) article_id = db.Column(db.Integer, db.ForeignKey('article.id')) article = db.relationship('Article', backref=db.backref('comments', cascade='all, delete-orphan', lazy='dynamic')) author = db.Column(db.String(255)) mail = db.Column(db.String(255)) password = db.Column(db.String(255)) content = db.Column(db.Text()) date_created = db.Column(db.DateTime(), default=db.func.now())
class Article(db.Model): __tablename__ = "article" id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(300)) body = db.Column(db.Text) pubDate = db.Column(db.DateTime, default=datetime.now()) published = db.Column(db.Boolean, nullable=False, default=False) user_id = db.Column(db.Integer, db.ForeignKey("users.id")) category = db.relationship("Category", secondary=post, backref=db.backref("article", lazy="dynamic")) counter = db.relationship("Counters", backref="article", lazy=True)
class Job(db.Model): id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.String(255), db.ForeignKey(User.id)) user = db.relationship('User', backref=db.backref('jobs', cascade='all, delete-orphan')) write_date = db.Column(db.DateTime(), default=db.func.now()) # 분과 department=db.Column(db.String(255)) # 전공 major=db.Column(db.String(255),default=u"없음") # 닉네임 nic_name=db.Column(db.String(255),default=u"진로켓 유저") # 진로 job=db.Column(db.String(255),default=u"없음") # 학과 한 줄평 major_comment=db.Column(db.String(255),default=u"좋습니다.") # 학과 이야기 major_story=db.Column(db.Text(65535),default=u"학과 분위기와 진로등 모두 만족합니다.") # 학과 만족도 major_like=db.Column(db.String(255)) # 복수전공 유무(y/n) check_double_major=db.Column(db.String(255)) # 복수전공 과목 double_major=db.Column(db.String(255),default=u"없음") # 진로를 선택하게 된 이유 job_reason=db.Column(db.Text(65535),default=u"일반적으로 가는 진로라서 선택하였습니다.") # 진로와의 상관관계 점수(전공/자격증/복수전공/대외활동/독서) # 전공 공부 point_major=db.Column(db.String(255)) # 자격증 point_licence=db.Column(db.String(255)) # 복수전공 point_double_major=db.Column(db.String(255)) # 독서 point_reading=db.Column(db.String(255)) # 대외활동 point_extra=db.Column(db.String(255)) # 추가 사항(1~2) 우선 해당 내용 추가 안함. 오픈베타 시작 후 ajax이용해서 비동기식 point_ex_1=db.Column(db.String(255)) point_ex_2=db.Column(db.String(255)) def json_dump(self): return dict(job=self.job, count=0)
class Role(db.Model, RoleMixin): __tablename__ = f'{table_prefix}_roles' id = db.Column(db.Integer, db.Sequence(f'{table_prefix}_roles_id_seq', start=10000, increment=1), primary_key=True) name = db.Column(db.String(80), unique=True) description = db.Column(db.String(255)) parent_id = db.Column(db.Integer, db.ForeignKey(f'{__tablename__}.id')) parent = db.relationship("Role", remote_side=[id]) users = db.relationship( 'User', secondary=f'{table_prefix}_users_roles_rel', backref=db.backref(f'{table_prefix}_roles.role_id'), lazy='dynamic') def __str__(self): return self.name @staticmethod def get_parent_default(role: 'Role', roles_list: List['Role']): """Recursive function for obtaining parent roles""" parent_roles: Optional[List['Role']] = Role.query.filter( Role.id == role.parent_id).all() # If deputies run recursion for each deputy if parent_roles: roles_list.extend(parent_roles) for parent_role in parent_roles: Role.get_parent_default(parent_role, roles_list) return roles_list @property def get_parents(self) -> Optional[List['Role']]: """Get all parent roles for current role""" parent_roles: Optional[List['Role']] = self.get_parent_default( self, []) parent_roles.append(self) return parent_roles @property def get_functions(self) -> List[str]: return [f'{function.hash}' for function in self.application_functions]
class Nav(BaseModel, db.Model): """导航菜单""" __tablename__ = "mogu_nav" id = db.Column(db.Integer, primary_key=True, comment="ID") name = db.Column(db.String(80), comment="导航名称") link = db.Column(db.String(164), nullable=True, comment="导航链接") parent_id = db.Column(db.Integer, db.ForeignKey('mogu_nav.id'), comment="父导航ID") # 自关联 parent = db.relationship('Nav', uselist=False, remote_side=[id], backref=db.backref('children', uselist=True)) # 父导航 def __repr__(self): return "%s" % (self.name)
class Comment(db.Model): __tablename__ = 'comment' query_class = CommentQuery id = db.Column(db.Integer, primary_key=True) post_id = db.Column(db.Integer, db.ForeignKey('post.id')) posts = db.relationship('Post', backref=db.backref('comments', lazy='dynamic')) author_name = db.Column(db.String(50)) author_email = db.Column(db.String(100)) author_url = db.Column(db.String(1024)) author_ip = db.Column(db.String(20)) comment_create_time = db.Column(db.DateTime, default=datetime.utcnow) content = db.Column(db.Text) isvisible = db.Column(db.Integer, default=0) def __init__(self, *args, **kwargs): super(Comment, self).__init__(*args, **kwargs) def __repr__(self): return '<comment %r>' % self.content
class User(db.Model): """用户表""" __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), default='') header_img = db.Column(db.String(100), default='') uuid = db.Column(db.String(32), unique=True) status = db.Column(db.Boolean, default=True) create_time = db.Column(db.DateTime, ) u_activity = db.relationship('Activity', secondary=u_activity, backref=db.backref('users', lazy='dynamic'), lazy='dynamic') u_don = db.relationship("Consultation", secondary=u_consultation, backref='con') u_tag = db.relationship("Tag", secondary=u_tag, backref='tag') def __repr__(self): return str({'table': self.__tablename__, 'id': self.id})
class slideshare(db.Model): id = db.Column(db.Integer, primary_key=True) user_name = db.Column(db.String(255)) user_id = db.Column(db.String(255), db.ForeignKey(User.id)) user = db.relationship('User', backref=db.backref('slideshares', cascade='all, delete-orphan')) complains = db.Column(db.Integer, default=0) # 해당 URL올리기 subject = db.Column(db.String(255)) urls = db.Column(db.String(255)) explain = db.Column(db.String(255)) tag1 = db.Column(db.String(255), default="") tag2 = db.Column(db.String(255), default="") date = db.Column(db.DateTime, default=datetime.utcnow())
class Event(db.Model): __tablename__ = 'event' id = db.Column(db.Integer, primary_key=True) host_id = db.Column(db.ForeignKey('user.id')) host = db.relationship('User', backref=db.backref('events', cascade='all, delete-orphan', lazy='dynamic')) title = db.Column(db.String(255), nullable=False) theme = db.Column(db.String(64), nullable=False) content = db.Column(db.Text(), nullable=False) event_date = db.Column(db.String(255)) event_date_created = db.Column(db.DateTime(), default=db.func.now()) place_school = db.Column(db.String(255)) contact = db.Column(db.String(255)) cost = db.Column(db.Integer) limited_member_num = db.Column(db.Integer) attend_member_num = db.Column(db.Integer) recommend_count = db.Column(db.Integer) location = db.Column(db.String(255))
class Comment(db.Model): id = db.Column(db.Integer, primary_key=True) article_id = db.Column(db.Integer, db.ForeignKey('article.id')) #article_id is class Article's id. , #small article is not class but var'article' in class Comment. # bring it from below article = db.relationship('Article', backref=db.backref('comments', cascade='all, delete-orphan', lazy='dynamic')) #setting relationship between Models(in this case, between article and comment) # if we want to access comment's Model's data, use 'article.comments' #cascade is like falls from Article class, when delete Article, its comments will be deleted author = db.Column(db.String(255)) email = db.Column(db.String(255)) password = db.Column(db.String(255)) content = db.Column(db.Text()) #contents of comment date_created = db.Column(db.DateTime(), default=db.func.now())
class saving(db.Model): id = db.Column(db.Integer, primary_key=True) # 각 유저의 아이디를 누적으로? user_id = db.Column(db.String(255), db.ForeignKey(User.id)) user = db.relationship('User', backref=db.backref('savings', cascade='all, delete-orphan')) user_name = db.Column(db.String(255), default="북마커블") re_subject = db.Column(db.String(255)) urls = db.Column(db.String(255)) re_explain = db.Column(db.String(255)) category = db.Column(db.String(255), default="북마커블") comment = db.Column(db.String(255), default="북마크 저장!") tag1 = db.Column(db.String(255), default="") tag2 = db.Column(db.String(255), default="") date = db.Column(db.DateTime, default=datetime.utcnow())
class user_bookmark(db.Model): id = db.Column(db.Integer, primary_key=True) # 유저의 facebook 아이디 값(확인값) user_id = db.Column(db.String(255), db.ForeignKey(User.id)) user = db.relationship('User', backref=db.backref('user_bookmarks', cascade='all, delete-orphan')) # 유저의 닉네임 user_name = db.Column(db.String(255), default="북마커블") # 유저의 카테고리 등록 category = db.Column(db.String(255), default="미 분류") # 제목 subject = db.Column(db.String(255)) # 링크 주소 urls = db.Column(db.String(255)) # 링크 설명 / 추후 수정가능? explain = db.Column(db.String(255), default="북마크 저장!") # 관련 링크 태그 / 추후 수정 가능하게끔 tag1 = db.Column(db.String(255), default=" ") tag2 = db.Column(db.String(255), default=" ") # 저장한 북마크가 공개/비공개 인지 확인 값 (기본값은 0 으로 비공개 -> 공개로 바꾸면 "1" 로 바뀜) check_open = db.Column(db.String(10), default="0") # 시간 저장 date = db.Column(db.DateTime, default=datetime.utcnow())
class User(db.Model): __tablename__ = 'auth_user' id = db.Column(db.Integer, primary_key=True) first_name = db.Column(db.String(255)) last_name = db.Column(db.String(255)) username = db.Column(db.String(120), unique=True) email = db.Column(db.String(120), unique=True) phone = db.Column(db.String(20)) company = db.Column(db.String(255)) country = db.Column(db.String(120)) website = db.Column(db.String(120)) industry = db.Column(db.String(120)) company_size = db.Column(db.String(120)) password = db.Column(db.String(255), nullable=False, server_default='') time_zone = db.Column(db.DateTime(timezone=False), ) dst = db.Column(db.Boolean) logo_image_name = db.Column(db.Unicode(64)) logo_image_path = db.Column(db.Unicode(128)) permission_type = db.Column(mysql.ENUM('a', 'v', 'c')) parent = db.Column(db.Integer(), db.ForeignKey('auth_user.id')) is_admin = db.Column(db.Boolean) is_active = db.Column(db.Boolean, server_default='1') date_created = db.Column(db.DateTime, default=db.func.current_timestamp()) date_modified = db.Column(db.DateTime, default=db.func.current_timestamp(), onupdate=db.func.current_timestamp()) # Relationships roles = db.relationship('Role', secondary='user_roles', backref=db.backref('auth_user', lazy='dynamic')) contact_group = db.relationship('ContactGroup', secondary='contact_groups', backref=db.backref('user', lazy='dynamic')) plan = db.relationship(Plan, backref=db.backref('user')) def __init__(self, first_name, last_name, email, password, phone=None, country=None, company=None, website=None, industry=None, company_size=None, parent=None, is_admin=None, logo_image_name=None): self.first_name = first_name self.last_name = last_name self.username = email self.email = email self.phone = phone self.company = company self.company_size = company_size self.industry = industry self.website = website self.country = country self.parent = parent self.logo_image_name = logo_image_name if password: self.set_password(password) if is_admin: self.is_admin = is_admin else: self.is_admin = False def set_password(self, password): self.password = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.pw_hash, password) def __repr__(self): return '<User %r>' % self.username @classmethod def email_is_available(self, email): if User.query.filter(User.email == email, User.is_active == True).first(): return False return True def __json__(self): return [ 'id', 'first_name', 'last_name', 'username', 'email', 'phone', 'company', 'country', 'website', 'industry', 'company_size', 'time_zone', 'is_admin', 'is_active', 'date_created', 'date_modified' ]
class Role(UserMixin, db.Model): __tablename__ = 'role1' id = db.Column(db.Integer, primary_key=True) uuid = db.Column(db.String(32), unique=True, nullable=False) username = db.Column(db.String(80), unique=True, nullable=False) pwd = db.Column(db.String(80), nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) default_avatar = db.Column(db.String(240)) avatar = db.Column(db.String(240)) code = db.Column(db.String(10)) addtime = db.Column(db.DATETIME, index=True, default=datetime.now) article = db.relationship('Article', backref='role') profile = db.relationship('UserProfile', backref='role') comments = db.relationship('Comment', backref='author', lazy='dynamic') replies = db.relationship('Reply', backref='author', lazy='dynamic') likes = db.relationship('Likes', backref='author', lazy='dynamic') likes_comment = db.relationship('LikeComment', backref='author', lazy='dynamic') followed = db.relationship('Follow', foreign_keys=[Follow.follower_id], backref=db.backref('follower', lazy='joined'), lazy='dynamic', cascade='all, delete-orphan') followers = db.relationship('Follow', foreign_keys=[Follow.followed_id], backref=db.backref('followed', lazy='joined'), lazy='dynamic', cascade='all, delete-orphan') message_sent = db.relationship('Message', foreign_keys='Message.sender_id', backref='author', lazy='dynamic') message_received = db.relationship('Message', foreign_keys='Message.recipient_id', backref='recipient', lazy='dynamic') last_message_read_time = db.Column(db.DATETIME) last_comment_read_time = db.Column(db.DATETIME) last_like_read_time = db.Column(db.DATETIME) last_follow_read_time = db.Column(db.DATETIME) last_reply_read_time = db.Column(db.DATETIME) last_comment_like_time = db.Column(db.DATETIME) def new_comment_like(self): last_read_time = self.last_reply_read_time or datetime(1900, 1, 1) like_num = 0 for i in self.comments: for j in i.likes: if j.time > last_read_time: like_num += 1 return like_num # 统计新的赞 def new_like(self): last_read_time = self.last_like_read_time or datetime(1900, 1, 1) #上次查看的时间 like_num = 0 for i in self.article: #遍历所有文章 for j in i.likes: #遍历文章下的赞 if j.time > last_read_time: like_num += 1 #大于上次查看时间的话+1 return like_num # 统计新的评论 def new_comment(self): last_read_time = self.last_comment_read_time or datetime(1900, 1, 1) comment_num = 0 for i in self.article: for j in i.comments: if j.time > last_read_time: comment_num += 1 return comment_num # 统计新的关注 def new_follow(self): last_read_time = self.last_follow_read_time or datetime(1900, 1, 1) follow_num = 0 for i in self.followers: if i.times > last_read_time: follow_num += 1 return follow_num def new_messages(self): last_read_time = self.last_message_read_time or datetime(1900, 1, 1) return Message.query.filter_by(recipient=self).filter( Message.time > last_read_time).count() def check(self, pwd): # 对比输入的密码与原密码 return self.pwd == pwd def is_liked(self, post_id): return self.likes.filter_by(article_id=post_id).first() is not None def like(self, post_id): if not self.is_liked(post_id): l = Likes() l.article_id = post_id l.user_id = self.uuid db.session.add(l) db.session.commit() def unlike(self, post_id): l = self.likes.filter_by(article_id=post_id).first() if l: db.session.delete(l) db.session.commit() def is_liked_comment(self, post_id): return self.likes_comment.filter_by( comment_id=post_id).first() is not None def like_comment(self, post_id): if not self.is_liked_comment(post_id): l = LikeComment() l.comment_id = post_id l.user_id = self.uuid db.session.add(l) db.session.commit() def unlike_comment(self, post_id): l = self.likes_comment.filter_by(comment_id=post_id).first() if l: db.session.delete(l) db.session.commit() def follow(self, user): if not self.is_following(user): f = Follow(follower=self, followed=user) db.session.add(f) db.session.commit() def unfollow(self, user): f = self.followed.filter_by(followed_id=user.uuid).first() if f: db.session.delete(f) db.session.commit() def is_following(self, user): return self.followed.filter_by( followed_id=user.uuid).first() is not None def is_followed_by(self, user): return self.followers.filter_by( follower_id=user.uuid).first() is not None @property def friends_post(self): follow = Role.query.filter_by(uuid=self.uuid).first() follower = follow.followers followed = follow.followed list1 = [] list2 = [] for i in follower: list1.append(i.follower.uuid) for j in followed: list2.append(j.followed.uuid) friend_list = [x for x in list1 if x in list2] u = Article.query.filter(Article.uuid.in_(friend_list)) return u
class User(db.Model, UserMixin): __tablename__ = f'{table_prefix}_users' id = db.Column(db.Integer, db.Sequence(f'{table_prefix}_users_id_seq', start=10000), primary_key=True) authenticated = db.Column(db.Boolean(), default=0) active = db.Column(db.Boolean(), default=True) username = db.Column(db.String(50)) email = db.Column(db.String(50), unique=True) password = db.Column(db.String(64), nullable=False) first_name = db.Column(db.String(50)) last_name = db.Column(db.String(50)) manager_id = db.Column(db.Integer, db.ForeignKey(f'{table_prefix}_users.id')) manager = db.relationship("User", remote_side=[id]) roles = db.relationship( 'Role', secondary=f'{table_prefix}_users_roles_rel', backref=db.backref(f'{table_prefix}_users.user_id'), lazy='dynamic') def create_user(self, username: str, first_name: str, last_name: str, email: str, password: str): """Create user and insert into database""" self.username = username self.first_name = first_name self.last_name = last_name self.email = email self.password = self.hash_password(password) db.session.add(self) db.session.commit() @staticmethod def hash_password(password: str) -> hex: """Password hashing handler""" return sha256(password.encode()).hexdigest() def __repr__(self): return '%s' % self.username def __str__(self): return '%s' % self.username def get_id(self): return self.username def has_role(self, role_name: str) -> bool: """Check if the user has given role""" if any([role.name == role_name for role in self.roles]): return True return False @staticmethod def get_by_id(id_: int) -> 'User': """Get user by id""" user: '******' = User.query.filter(User.id == id_).first() return user def is_authenticated(self): return self.authenticated @staticmethod def get_deputies(current_user: '******', users_list: List['User']): """Recursive function for obtaining deputy users""" deputies: Optional[List['User']] = User.query.filter( User.manager_id == current_user.id).all() # If deputies run recursion for each deputy if deputies: users_list.extend(deputies) for deputy in deputies: User.get_deputies(deputy, users_list) return users_list def get_deputy_tree(self) -> Optional[List['User']]: """Get all deputies for current user INCLUDING SELF""" deputies_tree: Optional[List['User']] = self.get_deputies(self, []) deputies_tree.append(self) return deputies_tree @property def serialize(self): data = { 'email': self.email, 'first_name': self.first_name, 'last_name': self.last_name, 'username': self.username } return data def login(self): """Login user respect to flask_login""" self.authenticated = True db.session.add(self) db.session.commit() login_user(self, remember=False, duration=timedelta(hours=6)) def logout(self): """Logout user respect to flask_login""" self.authenticated = False db.session.add(self) db.session.commit() logout_user()
class User(db.Model): __tablename__ = 'auth_user' id = db.Column(db.Integer, primary_key=True) first_name = db.Column(db.String(255)) last_name = db.Column(db.String(255)) username = db.Column(db.String(120), unique=True) email = db.Column(db.String(120), unique=True) phone = db.Column(db.String(20)) company = db.Column(db.String(255)) country = db.Column(db.String(120)) website = db.Column(db.String(120)) industry = db.Column(db.String(120)) company_size = db.Column(db.String(120)) password = db.Column(db.String(255), nullable=False, server_default='') parent = db.Column(db.Integer(), db.ForeignKey('auth_user.id')) is_admin = db.Column(db.Boolean) date_created = db.Column(db.DateTime, default=db.func.current_timestamp()) date_modified = db.Column(db.DateTime, default=db.func.current_timestamp(), onupdate=db.func.current_timestamp()) # Relationships roles = db.relationship('Role', secondary='user_roles', backref=db.backref('auth_user', lazy='dynamic')) def __init__(self, first_name, last_name, email, password, phone=None, country=None, company=None, website=None, industry=None, company_size=None, parent=None, is_admin=None): self.first_name = first_name self.last_name = last_name self.username = email self.email = email self.phone = phone self.company = company self.company_size = company_size self.industry = industry self.website = website self.country = country self.parent = parent if password: self.set_password(password) if is_admin: self.is_admin = is_admin else: self.is_admin = False def set_password(self, password): self.password = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.pw_hash, password) def __repr__(self): return '<User %r>' % self.username @classmethod def email_is_available(self, email): if User.query.filter(User.email == email).first(): return False return True
class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(16), unique=True, index=True) email = db.Column(db.String(64), unique=True, index=True) password_hash = db.Column(db.String(128)) confirmed = db.Column(db.Boolean, default=False) role_id = db.Column(db.Integer, db.ForeignKey('roles.id'), nullable=True) nickname = db.Column(db.String(16)) location = db.Column(db.String(64)) about_me = db.Column(db.Text) member_since = db.Column(db.DateTime, default=datetime.utcnow) last_seen = db.Column(db.DateTime, default=datetime.utcnow) avatar_url = db.Column(db.String(128)) posts = db.relationship('Post', backref='author') is_fans = db.relationship('Follow', foreign_keys=[Follow.fans_id], backref=db.backref('fans', lazy='joined'), lazy='dynamic', cascade='all, delete-orphan') is_blogger = db.relationship('Follow', foreign_keys=[Follow.blogger_id], backref=db.backref('blogger', lazy='joined'), lazy='dynamic', cascade='all, delete-orphan') comments = db.relationship('Comment', backref='user') def __init__(self, **kwargs): super(User, self).__init__(**kwargs) if self.role is None: self.role = Role.query.filter_by(default=True).first() def __repr__(self): return '<User {}>'.format(self.username) def __str__(self): return self.username def set_last_seen(self): self.last_seen = datetime.utcnow() db.session.add(self) db.session.commit() def get_avatar_url(self): return url_for('main.get_file', filename=self.avatar_url) # 禁止读取密码 @property def password(self): raise AttributeError('password 不是一个可读属性') # 设置密码 @password.setter def password(self, password): self.password_hash = generate_password_hash(password) # 验证密码,密码正确则返回True def verify_password(self, password): return check_password_hash(self.password_hash, password) def generate_confirmation_token(self, expiration=3600): s = Serializer(current_app.config['SECRET_KEY'], expires_in=expiration) return s.dumps({'confirm': self.id}).decode('utf-8') def confirm(self, token): s = Serializer(current_app.config['SECRET_KEY']) try: data = s.loads(token.encode('utf-8')) except: return False if data.get('confirm') != self.id: return False self.confirmed = True db.session.add(self) return True # 用来判断一个用户是否具备某种权限 def can(self, perm): return self.role is not None and self.role.has_permission(perm) # 用来判断某个用户是否有管理员权限 def is_administrator(self): return self.can(Permission.ADMIN) # 关注用户 def follow(self, user): if not self.is_following(user): f = Follow(fans=self, blogger=user) try: db.session.add(f) db.session.commit() except: db.session.rollback() # 取消关注 def unfollow(self, user): if self.is_following(user): f = Follow.query.filter_by(fans=self, blogger=user).first() try: db.session.delete(f) db.session.commit() except: db.session.rollback() # 判断是否关注了某个用户 def is_following(self, user): return Follow.query.filter_by(fans=self, blogger=user).count() > 0 # 判断是否被某个用户关注 def is_followed_by(self, user): return Follow.query.filter_by(fans=user, blogger=self).count() > 0 # 获取关注用户的文章 @property def followed_posts(self): return Post.query.join(Follow, Follow.blogger_id == Post.author_id).filter( Follow.fans_id == self.id) # 生成一个token令牌 def generate_auth_token(self, expiration): s = Serializer(current_app.config['SECRET_KEY'], expires_in=expiration) return s.dumps({'id': self.id}).decode('utf-8') # token验证 @staticmethod def verify_auth_token(token): s = Serializer(current_app.config['SECRET_KEY']) try: data = s.loads(token) except: return None return User.query.get(data['id']) def to_json(self): user_json = { 'url': url_for('api.get_user', id=self.id), 'username': self.username, 'email': self.email, 'nickname': self.nickname, 'location': self.location, 'about_me': self.about_me, 'member_since': self.member_since, 'last_seen': self.last_seen, 'avatar_url': self.get_avatar_url(), 'posts_url': url_for('api.get_posts_for_user', id=self.id), } return user_json