class Comment(db.Model): __tablename__ = 'comment' id = db.Column(db.Integer, autoincrement=True, primary_key=True) content = db.Column(db.String(255), nullable=False) article_id = db.Column(db.Integer, db.ForeignKey('article.id', ondelete='CASCADE'), nullable=False) user_id = db.Column(db.String(100), db.ForeignKey('front_user.id', ondelete='CASCADE'), nullable=False) article = db.relationship('Article', backref=db.backref('comments', lazy='dynamic')) is_use = db.Column(db.Boolean, default=True) create_time = db.Column(db.DateTime, default=datetime.now) user = db.relationship('FrontUser', backref=db.backref('comment', lazy='dynamic')) def make_dict(self): return { 'id': self.id, 'content': self.content, 'article': self.article_id, 'is_use': self.is_use, 'create_time': self.create_time, 'user_name': g.user.username }
class Article(db.Model): __tablename__ = 'article' id = db.Column(db.Integer, autoincrement=True, primary_key=True) title = db.Column(db.String(30), nullable=False) content = db.Column(db.Text, nullable=False) praise = db.Column(db.Integer, default=0) marvellous = db.Column(db.Boolean, default=False) create_time = db.Column(db.DateTime, default=datetime.now) last_update_time = db.Column(db.DateTime, onupdate=datetime.now) can_read = db.Column(db.Boolean, default=True) user_id = db.Column(db.String(100), db.ForeignKey('front_user.id', ondelete='CASCADE')) model_id = db.Column(db.Integer, db.ForeignKey('model.id', ondelete='CASCADE')) model = db.relationship(Model, backref=db.backref('articles', lazy='dynamic'), cascade='all') user = db.relationship(FrontUser, backref=db.backref('articles', lazy='dynamic'), cascade='all') def update_article(self, title, content): self.title = title self.content = content def __add__(self, other): self.praise += 1 def __sub__(self, other): self.praise -= 1
class Answer(db.Model): __tablename__ = 'answers' id = db.Column(db.Integer, primary_key=True, autoincrement=True) content = db.Column(db.Text, nullable=False) question_id = db.Column(db.Integer,db.ForeignKey('questions.id')) author_id = db.Column(db.Integer,db.ForeignKey('users.id')) question = db.relationship('Question',backref=db.backref('answers')) author = db.relationship('User',backref=db.backref('answers'))
class Request_api(db.Model): __tablename__ = 'request_api' id = db.Column(db.Integer, primary_key=True, autoincrement=True) req_name = db.Column(db.String(100), nullable=False) project_id = db.Column(db.Integer, db.ForeignKey('project.id'), nullable=False, ) file_level_id = db.Column(db.Integer, db.ForeignKey('file_level.id'), nullable=False, ) req_method = db.Column(db.String(100), nullable=False) req_url = db.Column(db.String(100), nullable=False) req_data = db.Column(db.Text) create_datetime = db.Column(db.DateTime, server_default=db.text("CURRENT_TIMESTAMP"), doc="创建时间") update_datetime = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"), doc="更新时间") # 在Req_api可以通过project(关系名称)关联到project表根据project_id, 同时在Project表也可以通过api,关联到Comment表 project = db.relationship('Project', backref=db.backref('request_api', order_by=create_datetime.desc())) file_level = db.relationship('File_level', backref=db.backref('request_api', order_by=create_datetime.desc()))
class Power(db.Model): __tablename__ = 'power' id = db.Column(db.Integer, primary_key=True, autoincrement=True) index_r = db.Column(db.Boolean, nullable=False, default=True) index_w = db.Column(db.Boolean, nullable=False, default=False) person_r = db.Column(db.Boolean, nullable=False, default=True) person_w = db.Column(db.Boolean, nullable=False, default=False) article_r = db.Column(db.Boolean, nullable=False, default=True) article_w = db.Column(db.Boolean, nullable=False, default=False) comment_r = db.Column(db.Boolean, nullable=False, default=True) comment_w = db.Column(db.Boolean, nullable=False, default=False) models_r = db.Column(db.Boolean, nullable=False, default=True) models_w = db.Column(db.Boolean, nullable=False, default=False) users_r = db.Column(db.Boolean, nullable=False, default=True) users_w = db.Column(db.Boolean, nullable=False, default=False) cms_users_r = db.Column(db.Boolean, nullable=False, default=True) cms_users_w = db.Column(db.Boolean, nullable=False, default=False) cms_group_r = db.Column(db.Boolean, nullable=False, default=True) cms_group_w = db.Column(db.Boolean, nullable=False, default=False) group_r = db.Column(db.Boolean, nullable=False, default=True) group_w = db.Column(db.Boolean, nullable=False, default=False) swiper_r = db.Column(db.Boolean, nullable=False, default=True) swiper_w = db.Column(db.Boolean, nullable=False, default=True) groups = db.relationship(Group, backref=db.backref('powers', order_by=id), order_by=Group.id, secondary=Group_Power)
class Blog(BaseMixin, db.Model): __tablename__ = 'blogs' name = db.Column(db.String(255),nullable=False) title = db.Column(db.String(255),nullable=False) slug = db.Column(db.String(255),nullable=False) category_id = db.Column(db.Integer,db.ForeignKey('categories.id')) category = db.relationship('Category',backref=db.backref( 'blogs',lazy='dynamic')) author_id = db.Column(db.Integer,db.ForeignKey('users.id')) #author = db.relationship('User',backref=db.backref( # 'blogs',lazy='dynamic')) icon_id = db.Column(db.Integer,db.ForeignKey('font_icons.id')) icon = db.relationship('FontIcon',backref='blogs') @property def post_count(self): return len(self.posts) @staticmethod def get_by_author_id(author_id): return Blog.query.filter(Blog.author_id==author_id).all() def _get_absolute_url(self): return url_for('blog.post_list',item_id=self.id) def _get_edit_url(self): return url_for('admin.add_blog') def _get_create_url(self): return url_for('admin.add_blog')
class EquipmentManagement(db.Model): __tablename__ = 'equipment_management' id = db.Column(db.Integer, primary_key=True, autoincrement=True) rank = db.Column(db.Integer, nullable=False) title = db.Column(db.String(100), nullable=False, comment="配置名") setting_args = db.Column(db.Text, comment="配置参数") status = db.Column(db.Integer, default=0, nullable=False, comment="运行状态 0停止,1运行中") cron_status = db.Column(db.Integer, default=0, nullable=False, comment="定时任务状态 0停止,1启动") cron_times = db.Column(db.String(100), nullable=True, comment="crontab表达式") next_run_time = db.Column(db.String(100), nullable=True, comment="下次任务运行时间") session_id = db.Column(db.String(100), nullable=True, comment="session_id") remoteHost = db.Column(db.String(100), nullable=False, comment="远程appium服务器地址") remotePort = db.Column(db.Integer, nullable=False, comment="远程appium服务器端口") test_case_suit = db.relationship('EquipmentIncludeTesSuit', backref=db.backref('equipment'), order_by='EquipmentIncludeTesSuit.rank')
class Tag(db.Model): __tablename__ = "tag" id = db.Column(db.Integer, primary_key=True, autoincrement=True) post_id = db.Column(db.Integer, db.ForeignKey("post.id")) isTag = db.Column(db.Boolean, default=False) post = db.relationship('Post', backref=db.backref('tag', uselist=False)) create_time = db.Column(db.DateTime, default=datetime.now)
class TestCaseStep(db.Model): __tablename__ = 'test_case_step' id = db.Column(db.Integer, primary_key=True, autoincrement=True) rank = db.Column(db.Integer, nullable=False, comment="步骤") title = db.Column(db.String(100), comment="用例步骤名称") action_id = db.Column(db.Integer, db.ForeignKey('action.id'), nullable=False, comment="执行动作") skip = db.Column(db.Integer, nullable=False, comment="是否略过") take_screen_shot = db.Column(db.Integer, default=0, nullable=False, comment="是否截图") wait_time = db.Column(db.Integer, default=0, nullable=False, comment="用例等待时间") input_key = db.Column(db.String(100), comment="输入参数名称") output_key = db.Column(db.String(100), comment="输出参数名称") test_case_id = db.Column(db.Integer, db.ForeignKey('test_case.id'), comment="所属用例ID") create_datetime = db.Column(db.DateTime, server_default=db.text("CURRENT_TIMESTAMP"), comment="创建时间") update_datetime = db.Column( db.DateTime, nullable=False, server_default=db.text( "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"), comment="更新时间") action = db.relationship('Action', backref=db.backref('step'))
class Article(BaseMixin, db.Model): __tablename__ = 'articles' name = db.Column(db.String(255)) title = db.Column(db.String(100)) content = db.Column(db.Text) date_added = db.Column(db.DateTime, default=datetime.datetime.now) category_id = db.Column(db.Integer, db.ForeignKey('categories.id')) category = db.relationship('Category',backref=db.backref( 'articles',lazy='dynamic')) author_id = db.Column(db.Integer,db.ForeignKey('users.id', onupdate="CASCADE", ondelete="CASCADE")) blog_id = db.Column(db.Integer,db.ForeignKey('blogs.id')) blog = db.relationship('Blog',backref=db.backref( 'articles',lazy='dynamic'),lazy='select') #author = db.relationship('User',backref="articles",lazy="dynamic") visible = db.Column(db.Boolean,default=False) description = db.Column(db.Text) slug = db.Column(db.String(255)) url = db.Column(db.String(255)) meta_title = db.Column(db.String(255)) tags = db.Column(db.String(255)) @classmethod def all(cls): return Article.query.order_by(desc(Article.created)).all() @classmethod def find_by_id(cls, id): return Article.query.filter(Article.id == id).first() @classmethod def find_by_author(cls, name): return Article.query.filter(Article.author_name == name).all() @classmethod def find_by_category(cls, category): return Article.query.filter(Article.category_name == category).all() @property def slug(self): return urlify(self.title) @property def created_in_words(self): return time_ago_in_words(self.created)
class Role(db.Model): __tablename__ = 'role' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(30), nullable=False) groups = db.relationship(Group, backref=db.backref('roles', order_by=id), order_by=Group.id, secondary=Group_Role)
class File: __table_args__ = {'abstract': True} __abstract__ = True name = db.Column(db.String(255), nullable=False) parent_id = db.Column(db.Integer, db.ForeignKey('directories.id')) parent = db.relationship('Directory', backref=db.backref('files', lazy='dynamic')) full_path = db.Column(db.String(255), nullable=False, unique=True)
class File_level(db.Model): __tablename__ = 'file_level' id = db.Column(db.Integer, primary_key=True, autoincrement=True) project_id = db.Column(db.Integer, db.ForeignKey('project.id'), nullable=False, ) pro_id = db.Column(db.String(100), nullable=False) label = db.Column(db.String(100)) create_datetime = db.Column(db.DateTime, server_default=db.text("CURRENT_TIMESTAMP"), doc="创建时间") update_datetime = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"), doc="更新时间") project = db.relationship('Project', backref=db.backref('file_level', order_by=create_datetime.desc()))
class Project(db.Model): __tablename__ = 'project' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(100), nullable=False) env_id = db.Column(db.Integer) author_id = db.Column(db.Integer, db.ForeignKey('user.id')) create_datetime = db.Column(db.DateTime, server_default=db.text("CURRENT_TIMESTAMP"), doc="创建时间") update_datetime = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"), doc="更新时间") author = db.relationship('User', backref=db.backref('project'))
class Role(db.Model): __tablename__ = 'role' id = db.Column(db.Integer, primary_key=True, autoincrement=True) roleName = db.Column(db.String(20), unique=True, nullable=False) desc = db.Column(db.String(200)) permissions = db.Column(db.Integer, default=Permission.USER_INFO) # 中间表绑定到角色zh users = db.relationship('User', secondary=cms_role_user, backref=db.backref("roles"))
class Project(db.Model): __tablename__ = 'project' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=False, comment="项目名") env_id = db.Column(db.Integer) author_id = db.Column(db.Integer, db.ForeignKey('user.id'), comment="项目名") is_del = db.Column(db.Integer, nullable=False, default=0, comment="是否已删除") create_datetime = db.Column(db.DateTime, server_default=db.text("CURRENT_TIMESTAMP"), comment="创建时间") update_datetime = db.Column( db.DateTime, nullable=False, server_default=db.text( "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"), comment="更新时间") author = db.relationship('User', backref=db.backref('project')) test_case = db.relationship('TestCase', backref=db.backref('project')) test_case_suit = db.relationship('TestCaseSuit', backref=db.backref('project')) page = db.relationship('Page', backref=db.backref('project'))
class QueryGroup(db.Model): __tablename__ = 'query_group' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(32)) vars = db.relationship( 'YjVariableInfo', secondary=var_queries, backref=db.backref('querys', lazy='dynamic'), cascade="delete, delete-orphan", single_parent=True, )
class Appointment(db.Model): __tablename__ = 'appointment' id = db.Column(db.Integer, primary_key=True) time = db.Column(db.Integer) add_time = db.Column(db.Integer) user_id = db.Column(db.ForeignKey('user.id')) user = db.relationship('User', backref=db.backref( 'appointments', order_by='Appointment.time.desc()')) def __repr__(self): return f"Appointment('{self.time}','{self.add_time}')"
class Post(BaseMixin,db.Model): __tablename__ = 'posts' name = db.Column(db.String(255),nullable=False) content = db.Column(db.Text) blog_id = db.Column(db.Integer,db.ForeignKey('blogs.id')) blog = db.relationship('Blog',backref=db.backref( 'posts'),uselist=False) category_id = db.Column(db.Integer,db.ForeignKey('categories.id')) category = db.relationship('Category',backref=db.backref( 'posts'),uselist=False) #tags = db.relationship('Tag',secondary='posts_tags',backref=db.backref( # 'posts',lazy='dynamic'),lazy='dynamic') author_id = db.Column(db.Integer,db.ForeignKey('users.id')) author = db.relationship('User',backref=db.backref( 'posts'),uselist=False) date_added = db.Column(db.DateTime,default=db.func.now()) date_modified = db.Column(db.DateTime,default=db.func.now(),onupdate=db.func.now()) excerpt_length = db.Column(db.Integer,default=55,nullable=False) slug = db.Column(db.String(255),unique=True) icon_id = db.Column(db.Integer,db.ForeignKey('font_icons.id')) icon = db.relationship('FontIcon',backref='posts') @property def comment_count(self): return len(self.comments.query.all()) @property def author_name(self): return self.author.name or '' @property def title(self): return self.name.title() @property def excerpt(self): return self.content[:self.excerpt_length]
class Comment(BaseMixin,db.Model): __tablename__ = 'comments' slug = db.Column(db.String(255),nullable=False,unique=True) content = db.Column(db.Text,nullable=False) author_id = db.Column(db.Integer,db.ForeignKey('users.id')) author = db.relationship('User',backref=db.backref( 'comments',lazy="dynamic")) article_id = db.Column(db.Integer,db.ForeignKey('articles.id')) article = db.relationship('Article',backref=db.backref( 'comments',lazy='dynamic')) post_id = db.Column(db.Integer,db.ForeignKey('posts.id')) post = db.relationship('Post',backref=db.backref( 'comments',lazy='dynamic')) def __init__(self,*args,**kwargs): if kwargs.get('content',False): self.content = kwargs.pop('content') if kwargs.get('author_id',False): self.author_id = kwargs.pop('author_id') else: self.author_id = None if kwargs.get('article_id',False): self.article_id = kwargs.pop('article_id') else: self.article_id = None if kwargs.get('slug',False): self.slug = kwargs.pop('slug') else: tmp = '/comments/' if self.article_id is not None: tmp += self.article_id + '/' if self.author_id is not None: tmp += self.author_id + '/' self.slug = tmp super(Comment,self).__init__(*args,**kwargs)
class CMSUser(db.Model): __tablename__ = 'cms_user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(64), nullable=False, unique=True) password = db.Column(db.String(128), nullable=False) email = db.Column(db.String(100), nullable=False, unique=True) is_super = db.Column(db.Boolean, default=False, nullable=False) join_time = db.Column(db.DATETIME, nullable=False, default=datetime.now) r_id = db.Column(db.Integer, db.ForeignKey('role.id', ondelete='RESTRICT')) roles = db.relationship(Role, backref=db.backref('cmsuser', order_by=id), order_by=Role.id) def __init__(self, **kwargs): for k, v in kwargs.items(): print(k, v) if k == 'password': print(generate_password_hash(v)) setattr(self, k, generate_password_hash(v)) continue setattr(self, k, v) def check_passwd(self, password): return check_password_hash(self.password, password) def update_passwd(self, new): self.password = generate_password_hash(new) def has_power(self, power): roles = self.roles groups = [i for i in roles.groups] powers = [] for i in groups: for j in i.powers: powers.append(j) print(powers[0].models_w) for i in powers: if getattr(i, power, False): return True else: return False
class Element(db.Model): __tablename__ = 'element' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=False, comment="目录名") type_for_android = db.Column(db.String(30), comment="Android查找方式") loc_for_android = db.Column(db.String(200), comment="Android信息描述") type_for_ios = db.Column(db.String(30), comment="IOS查找方式") loc_for_ios = db.Column(db.String(200), comment="IOS信息描述") page_id = db.Column(db.Integer, db.ForeignKey('page.id'), comment="所属页面ID") create_datetime = db.Column(db.DateTime, server_default=db.text("CURRENT_TIMESTAMP"), comment="创建时间") update_datetime = db.Column( db.DateTime, nullable=False, server_default=db.text( "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"), comment="更新时间") page = db.relationship('Page', backref=db.backref('element'))
class Express(db.Model): __tablename__ = 'express' id = db.Column(db.Integer, primary_key=True, autoincrement=True) owner_id = db.Column(db.Integer, nullable=False) # 此快递的主人 taker_id = db.Column(db.Integer, nullable=True) # 此快递的代拿人 users = db.relationship('User', secondary=express_user, backref=db.backref('expresses')) # 此快递有关的用户 # 首页显示内容 ownername = db.Column(db.String(20), nullable=False) starting = db.Column(db.String(20), nullable=False) destination = db.Column(db.String(30), nullable=False) payment = db.Column(db.Integer, nullable=False) tips = db.Column(db.String(15), nullable=False) # 详情页显示内容 express_id = db.Column(db.String(20), nullable=False) # 快递单号 destination_detail = db.Column(db.String(20), nullable=True) # 详细地址,选填 weight = db.Column(db.String(20), nullable=True) # 重量,选填 size = db.Column(db.String(20), nullable=True) # 大小,选填 tips_detail = db.Column(db.Text, nullable=True) # 备注,选填 # 确认代拿后显示 # 联系方式 # owner: tele_o = db.Column(db.String(11), nullable=True) wechat_o = db.Column(db.String(20), nullable=True) qq_o = db.Column(db.String(20), nullable=True) # taker: tele_t = db.Column(db.String(11), nullable=True) wechat_t = db.Column(db.String(20), nullable=True) qq_t = db.Column(db.String(20), nullable=True) # 发布、代拿、预计送达时间 time_publish = db.Column(db.String(20), nullable=False) time_take = db.Column(db.String(20), nullable=True) time_handover = db.Column(db.String(20), nullable=True) # 状态:0:等待代拿;1:在路上;2:等待支付 state = db.Column(db.Integer, nullable=False)
class User(db.Model): __tablename__ = 'user' id = db.Column(db.String(100), primary_key=True, default=shortuuid.uuid) telephone = db.Column(db.String(11), nullable=False) username = db.Column(db.String(50), nullable=False) _password = db.Column(db.String(100), nullable=False) email = db.Column(db.String(50), nullable=False) create_time = db.Column(db.DateTime, default=datetime.now) books = db.relationship('Book', backref=db.backref('users'), lazy='dynamic') @property def password(self): return self._password @password.setter def password(self, raw_password): self._password = generate_password_hash(raw_password) def check_password(self, raw_password): return check_password_hash(self.password, raw_password)
class Page(db.Model): __tablename__ = 'page' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=False, comment="页面名") project_id = db.Column(db.Integer, db.ForeignKey('project.id'), comment="项目id") parent_directory = db.Column(db.Integer, nullable=False, default=0, comment="父级目录ID") is_del = db.Column(db.Integer, nullable=False, default=0, comment="是否已删除") create_datetime = db.Column(db.DateTime, server_default=db.text("CURRENT_TIMESTAMP"), comment="创建时间") update_datetime = db.Column( db.DateTime, nullable=False, server_default=db.text( "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"), comment="更新时间") action = db.relationship('Action', backref=db.backref('page'))
class TestSuitStep(db.Model): __tablename__ = 'test_suit_step' id = db.Column(db.Integer, primary_key=True, autoincrement=True) rank = db.Column(db.Integer, nullable=False, comment="执行顺序") test_case_id = db.Column(db.Integer, db.ForeignKey('test_case.id'), nullable=False, comment="用例") skip = db.Column(db.Integer, nullable=False, comment="是否略过") test_case_suit_id = db.Column(db.Integer, db.ForeignKey('test_case_suit.id'), comment="所属用例集ID") input_args = db.Column(db.Text, comment="输入参数对象") create_datetime = db.Column(db.DateTime, server_default=db.text("CURRENT_TIMESTAMP"), comment="创建时间") update_datetime = db.Column( db.DateTime, nullable=False, server_default=db.text( "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"), comment="更新时间") test_case = db.relationship('TestCase', backref=db.backref('suit'))
class User(db.Model): __tablename__="user" id=db.Column(db.Integer,primary_key=True,autoincrement=True) username=db.Column(db.String(20),nullable=False) _password=db.Column(db.String(200),nullable=False) email=db.Column(db.String(20),nullable=False) create_time=db.Column(db.DateTime,default=datetime.now) roles=db.relationship("role", backref=db.backref("users"), secondary=role_user) @property def getPermission(self): num=0 for role in self.roles: num=num | role.permis return num def checkPermision(self,permis): if self.getPermission & permis !=0: return True else: return False def __init__(self,password,**kwargs): self.password=password kwargs.pop("password",None) super(User,self).__init__(**kwargs) @property def password(self): return self._password @password.setter def password(self,frontpwd): self._password=generate_password_hash(frontpwd) def checkPwd(self,frontpwd): return check_password_hash(self._password,frontpwd)
class TestCaseSuit(db.Model): __tablename__ = 'test_case_suit' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=False, comment="用例集名") project_id = db.Column(db.Integer, db.ForeignKey('project.id'), comment="所属项目ID") is_del = db.Column(db.Integer, nullable=False, default=0, comment="是否已删除") parent_directory = db.Column(db.Integer, nullable=False, default=0, comment="父级目录ID") create_datetime = db.Column(db.DateTime, server_default=db.text("CURRENT_TIMESTAMP"), comment="创建时间") update_datetime = db.Column( db.DateTime, nullable=False, server_default=db.text( "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"), comment="更新时间") suit_step = db.relationship('TestSuitStep', backref=db.backref('case_suit'), order_by='TestSuitStep.rank')
class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(32), nullable=False) email = db.Column(db.String(32)) pw_hash = db.Column(db.String(128)) login_count = db.Column(db.Integer, default=0) last_login_ip = db.Column(db.String(64), default='unknown') last_login_time = db.Column(db.Integer) roles = db.relationship('Role', secondary=roles, backref=db.backref('user', lazy='dynamic'), passive_deletes=True) def __init__(self, username, password, email=None): self.username = username # self.set_password(password) self.pw_hash = password self.email = email def __repr__(self): return '<User {}'.format(self.username) @staticmethod def verify_auth_token(token): s = Serializer(current_app.config['SECRET_KEY']) try: data = s.loads(token) except SignatureExpired: return None except BadSignature: return None except TypeError: return None user_id = data['id'] user = User.query.get(user_id) try: assert (data['time'] == user.last_login_time) except AssertionError: return None return user def is_authenticated(self): if isinstance(self, AnonymousUserMixin): return False else: return True def is_active(self): return True def is_anonymous(self): if isinstance(self, AnonymousUserMixin): return True else: return False def get_id(self): return unicode(self.id) def set_password(self, password): self.pw_hash = generate_password_hash(password) def check_password(self, password): # return check_password_hash(self.pw_hash, password) return self.pw_hash == password
class User(db.Model, UserMixin, BaseMixin): __tablename__ = 'users' bio = db.Column(db.String(128), default='') name = db.Column(db.String(128), default='') nickname = db.Column(db.String(128), default='') email = db.Column(db.String(191), default='') password = db.Column(db.String(191)) website = db.Column(db.String(191), default='') github_id = db.Column(db.String(191), default='') last_login_at = db.Column(db.DateTime()) current_login_at = db.Column(db.DateTime()) last_login_ip = db.Column(db.String(100)) current_login_ip = db.Column(db.String(100)) login_count = db.Column(db.Integer) active = db.Column(db.Boolean()) icon_color = db.Column(db.String(7)) confirmed_at = db.Column(db.DateTime()) company = db.Column(db.String(191), default='') avatar_id = db.Column(db.String(20), default='') roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='dynamic')) __table_args__ = ( db.Index('idx_name', name), db.Index('idx_email', email), ) def url(self): return '/user/{}'.format(self.id) @property def avatar_path(self): avatar_id = self.avatar_id return '' if not avatar_id else '/static/avatars/{}.png'.format( avatar_id) def update_avatar(self, avatar_id): self.avatar_id = avatar_id self.save() def upload_avatar(self, img): avatar_id = generate_id() filename = os.path.join(UPLOAD_FOLDER, 'avatars', '{}.png'.format(avatar_id)) if isinstance(img, str) and img.startswith('http'): r = requests.get(img, stream=True) if r.status_code == 200: with open(filename, 'wb') as f: for chunk in r.iter_content(1024): f.write(chunk) else: img.save(filename) self.update_avatar(avatar_id) def follow(self, from_id): ok, _ = Contact.create(to_id=self.id, from_id=from_id) if ok: self._stats = None return ok def unfollow(self, from_id): contact = Contact.get_follow_item(from_id, self.id) if contact: contact.delete() self._stats = None return True return False def is_followed_by(self, user_id): contact = Contact.get_follow_item(user_id, self.id) return bool(contact)