user.py 7.8 KB

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