user.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Author: wushuiyong
  4. # @Created Time : 日 1/ 1 23:43:12 2017
  5. # @Description:
  6. from datetime import datetime
  7. from flask_login import UserMixin
  8. from sqlalchemy import String, Integer, DateTime, or_
  9. from walle import model
  10. from walle.model.database import SurrogatePK, db, Model
  11. from walle.service.extensions import permission
  12. from walle.service.rbac.role import *
  13. from werkzeug.security import check_password_hash, generate_password_hash
  14. from flask import current_app
  15. from flask_login import AnonymousUserMixin
  16. class AnonymousUser(AnonymousUserMixin):
  17. @property
  18. def role(self):
  19. return None
  20. class UserModel(UserMixin, SurrogatePK, Model):
  21. # 表的名字:
  22. __tablename__ = 'users'
  23. status_active = 1
  24. status_blocked = 2
  25. current_time = datetime.now()
  26. password_hash = 'sadfsfkk'
  27. # 表的结构:
  28. id = db.Column(Integer, primary_key=True, autoincrement=True)
  29. username = db.Column(String(50))
  30. is_email_verified = db.Column(Integer, default=0)
  31. email = db.Column(String(50), unique=True, nullable=False)
  32. password = db.Column(String(50), nullable=False)
  33. avatar = db.Column(String(100))
  34. role = db.Column(String(10))
  35. status = db.Column(Integer, default=1)
  36. last_space = db.Column(Integer, default=0)
  37. # role_info = relationship("walle.model.user.RoleModel", back_populates="users")
  38. created_at = db.Column(DateTime, default=current_time)
  39. updated_at = db.Column(DateTime, default=current_time, onupdate=current_time)
  40. status_mapping = {
  41. -1: '删除',
  42. 0: '新建',
  43. 1: '正常',
  44. 2: '冻结',
  45. }
  46. def add(self, *args, **kwargs):
  47. data = dict(*args)
  48. user = UserModel(**data)
  49. db.session.add(user)
  50. db.session.commit()
  51. return user
  52. def item(self, user_id=None):
  53. """
  54. 获取单条记录
  55. :param role_id:
  56. :return:
  57. """
  58. data = self.query.filter_by(id=self.id).filter(UserModel.status.notin_([self.status_remove])).first()
  59. return data.to_json() if data else []
  60. def update(self, *args, **kwargs):
  61. update_data = dict(*args)
  62. return super(UserModel, self).update(**update_data)
  63. def update_avatar(self, avatar):
  64. d = {'avatar': avatar}
  65. user = self.query.get(self.id).update(**d)
  66. current_app.logger.info(user)
  67. def update_name_pwd(self, username, password=None):
  68. user = self.query.filter_by(id=self.id).first()
  69. if username:
  70. user.username = username
  71. if password:
  72. user.password = self.get_password(password)
  73. db.session.commit()
  74. return user.to_json()
  75. def block_active(self, status):
  76. user = self.query.filter_by(id=self.id).first()
  77. user.status = status
  78. db.session.commit()
  79. return user.to_json()
  80. def remove(self):
  81. """
  82. :param role_id:
  83. :return:
  84. """
  85. self.query.filter_by(id=self.id).update({'status': self.status_remove})
  86. ret = db.session.commit()
  87. return ret
  88. def verify_password(self, password):
  89. """
  90. 检查密码是否正确
  91. :param password:
  92. :return:
  93. """
  94. if self.password is None:
  95. return False
  96. return check_password_hash(self.password, password)
  97. def get_password(self, password):
  98. """Set password."""
  99. return generate_password_hash(password)
  100. def general_password(self, password):
  101. """
  102. 检查密码是否正确
  103. :param password:
  104. :return:
  105. """
  106. self.password = generate_password_hash(password)
  107. return generate_password_hash(password)
  108. def is_authenticated(self):
  109. return True
  110. def is_active(self):
  111. return True
  112. def is_anonymous(self):
  113. return False
  114. def get_id(self):
  115. try:
  116. return unicode(self.id) # python 2
  117. except NameError:
  118. return str(self.id) # python 3
  119. def list(self, uids=[], page=0, size=10, space_id=None, kw=None):
  120. """
  121. 获取分页列表
  122. :param page:
  123. :param size:
  124. :return:
  125. """
  126. query = UserModel.query.filter(UserModel.status.notin_([self.status_remove]))
  127. if kw:
  128. query = query.filter(or_(UserModel.username.like('%' + kw + '%'), UserModel.email.like('%' + kw + '%')))
  129. if uids:
  130. query = query.filter(UserModel.id.in_(uids))
  131. count = query.count()
  132. data = query.order_by(UserModel.id.desc()).offset(int(size) * int(page)).limit(size).all()
  133. user_list = [p.to_json() for p in data]
  134. return user_list, count
  135. def has_spaces(self):
  136. MemberModel = model.member.MemberModel
  137. return MemberModel().spaces(user_id=self.id)
  138. def space_id(self):
  139. return session['space_id']
  140. @classmethod
  141. def fresh_session(cls):
  142. session['project_master'] = []
  143. # 0.超管
  144. if current_user.role == SUPER:
  145. return True
  146. spaces = current_user.has_spaces()
  147. # 1.无空间权限且非超管
  148. if not spaces and current_user.role != SUPER:
  149. raise WalleError(Code.space_empty)
  150. default_space = list(spaces.keys())[0]
  151. # 2.第一次登录无空间
  152. if not current_user.last_space:
  153. current_user.last_space = default_space
  154. current_user.save()
  155. session['space_id'] = default_space
  156. session['space_info'] = spaces[session['space_id']]
  157. # 3.空间权限有修改(上次登录的空格没有权限了)
  158. if current_user.last_space not in list(spaces.keys()):
  159. current_user.last_space = default_space
  160. # 4.项目管理员
  161. MemberModel = model.member.MemberModel()
  162. session['project_master'] = MemberModel.project_master()
  163. session['space_id'] = current_user.last_space
  164. session['space_info'] = spaces[current_user.last_space]
  165. session['space_list'] = list(spaces.values())
  166. @classmethod
  167. def avatar_url(cls, avatar):
  168. avatar = avatar if avatar else 'default.jpg'
  169. return current_app.config['AVATAR_PATH'] + avatar
  170. @classmethod
  171. def fetch_by_uid(cls, uids=None):
  172. """
  173. 用户列表
  174. :param uids: []
  175. :return:
  176. """
  177. if not uids:
  178. return []
  179. query = UserModel.query.filter(UserModel.id.in_(uids)).filter(UserModel.status.notin_([cls.status_remove]))
  180. data = query.order_by(UserModel.id.desc()).all()
  181. return [p.to_json() for p in data]
  182. @classmethod
  183. def uid2name(cls, data):
  184. """
  185. 把uid转换成名字
  186. :param data: [{'user_id':1, 'xx':'yy'}] 至少包含user_id
  187. :return:
  188. """
  189. user_ids = []
  190. uid2name = {}
  191. for items in data:
  192. user_ids.append(items.user_id)
  193. user_info = cls.fetch_by_uid(uids=user_ids)
  194. for user in user_info:
  195. uid2name[user['id']] = user['username']
  196. return uid2name
  197. def to_json(self):
  198. item = {
  199. 'id': int(self.id),
  200. 'user_id': int(self.id),
  201. 'username': self.username,
  202. 'is_email_verified': self.is_email_verified,
  203. 'email': self.email,
  204. 'avatar': self.avatar_url(self.avatar),
  205. 'status': self.status_mapping[self.status],
  206. 'last_space': self.last_space,
  207. # 'status': self.status,
  208. # 'role_name': self.role_id,
  209. 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
  210. 'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M:%S'),
  211. }
  212. item.update(self.enable())
  213. return item
  214. def enable(self):
  215. return {
  216. 'enable_view': True,
  217. 'enable_update': permission.role_upper_master(),
  218. 'enable_delete': permission.role_upper_master(),
  219. 'enable_create': False,
  220. 'enable_online': False,
  221. 'enable_audit': False,
  222. 'enable_block': False,
  223. }