user.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  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. # todo permission_ids need to be formated and checked
  57. # a new type to update a model
  58. update_data = dict(*args)
  59. return super(UserModel, self).update(**update_data)
  60. def update_avatar(self, avatar):
  61. d = {'avatar': avatar}
  62. user = self.query.get(self.id).update(**d)
  63. current_app.logger.info(user)
  64. def update_name_pwd(self, username, password=None):
  65. # todo permission_ids need to be formated and checked
  66. user = self.query.filter_by(id=self.id).first()
  67. user.username = username
  68. if password:
  69. self.set_password(password)
  70. db.session.commit()
  71. return user.to_json()
  72. def block_active(self, status):
  73. user = self.query.filter_by(id=self.id).first()
  74. user.status = status
  75. db.session.commit()
  76. return user.to_json()
  77. def remove(self):
  78. """
  79. :param role_id:
  80. :return:
  81. """
  82. self.query.filter_by(id=self.id).update({'status': self.status_remove})
  83. ret = db.session.commit()
  84. return ret
  85. def verify_password(self, password):
  86. """
  87. 检查密码是否正确
  88. :param password:
  89. :return:
  90. """
  91. if self.password is None:
  92. return False
  93. return check_password_hash(self.password, password)
  94. def set_password(self, password):
  95. """Set password."""
  96. self.password = generate_password_hash(password)
  97. def general_password(self, password):
  98. """
  99. 检查密码是否正确
  100. :param password:
  101. :return:
  102. """
  103. self.password = generate_password_hash(password)
  104. return generate_password_hash(password)
  105. def is_authenticated(self):
  106. return True
  107. def is_active(self):
  108. return True
  109. def is_anonymous(self):
  110. return False
  111. def get_id(self):
  112. try:
  113. return unicode(self.id) # python 2
  114. except NameError:
  115. return str(self.id) # python 3
  116. def list(self, uids=[], page=0, size=10, space_id=None, kw=None):
  117. """
  118. 获取分页列表
  119. :param page:
  120. :param size:
  121. :return:
  122. """
  123. query = UserModel.query.filter(UserModel.status.notin_([self.status_remove]))
  124. if kw:
  125. query = query.filter(or_(UserModel.username.like('%' + kw + '%'), UserModel.email.like('%' + kw + '%')))
  126. if uids:
  127. query = query.filter(UserModel.id.in_(uids))
  128. count = query.count()
  129. data = query.order_by(UserModel.id.desc()).offset(int(size) * int(page)).limit(size).all()
  130. user_list = [p.to_json() for p in data]
  131. return user_list, count
  132. def has_spaces(self):
  133. MemberModel = model.member.MemberModel
  134. return MemberModel().spaces(user_id=self.id)
  135. def space_id(self):
  136. return session['space_id']
  137. @classmethod
  138. def fresh_session(cls):
  139. # 0.超管
  140. if current_user.role == SUPER:
  141. return True
  142. spaces = current_user.has_spaces()
  143. # 1.无空间权限且非超管
  144. if not spaces and current_user.role != SUPER:
  145. raise WalleError(Code.space_empty)
  146. default_space = spaces.keys()[0]
  147. # 2.第一次登录无空间
  148. if not current_user.last_space:
  149. current_user.last_space = default_space
  150. current_user.save()
  151. session['space_id'] = default_space
  152. session['space_info'] = spaces[session['space_id']]
  153. # 3.空间权限有修改(上次登录的空格没有权限了)
  154. if current_user.last_space not in spaces.keys():
  155. current_user.last_space = default_space
  156. # 4.项目管理员
  157. MemberModel = model.member.MemberModel()
  158. session['project_master'] = MemberModel.project_master()
  159. session['space_id'] = current_user.last_space
  160. session['space_info'] = spaces[current_user.last_space]
  161. session['space_list'] = spaces.values()
  162. @classmethod
  163. def avatar_url(cls, avatar):
  164. avatar = avatar if avatar else 'w.jpg'
  165. return '/' + current_app.config['AVATAR_PATH'] + avatar
  166. @classmethod
  167. def fetch_by_uid(cls, uids=None):
  168. """
  169. 用户列表
  170. :param uids: []
  171. :return:
  172. """
  173. if not uids:
  174. return []
  175. query = UserModel.query.filter(UserModel.id.in_(uids)).filter(UserModel.status.notin_([cls.status_remove]))
  176. data = query.order_by(UserModel.id.desc()).all()
  177. return [p.to_json() for p in data]
  178. @classmethod
  179. def uid2name(cls, data):
  180. """
  181. 把uid转换成名字
  182. :param data: [{'user_id':1, 'xx':'yy'}] 至少包含user_id
  183. :return:
  184. """
  185. user_ids = []
  186. uid2name = {}
  187. for items in data:
  188. user_ids.append(items.user_id)
  189. user_info = cls.fetch_by_uid(uids=user_ids)
  190. for user in user_info:
  191. uid2name[user['id']] = user['username']
  192. return uid2name
  193. def to_json(self):
  194. item = {
  195. 'id': int(self.id),
  196. 'user_id': int(self.id),
  197. 'username': self.username,
  198. 'is_email_verified': self.is_email_verified,
  199. 'email': self.email,
  200. 'avatar': self.avatar_url(self.avatar),
  201. # TODO 当前登录用户的空间
  202. # 'role_id': self.role_id,
  203. 'status': self.status_mapping[self.status],
  204. 'last_space': self.last_space,
  205. # 'status': self.status,
  206. # 'role_name': self.role_id,
  207. 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
  208. 'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M:%S'),
  209. }
  210. item.update(self.enable())
  211. return item
  212. def enable(self):
  213. return {
  214. 'enable_update': permission.role_upper_developer(),
  215. 'enable_delete': permission.role_upper_developer(),
  216. 'enable_create': False,
  217. 'enable_online': False,
  218. 'enable_audit': False,
  219. 'enable_block': False,
  220. }